Я хочу заменить вызовы функции system(), сделанные моей программой, с помощью LD_PRELOAD.
Поэтому я создал следующие функции-оболочки в общей библиотеке для тестирования.
// syshook.c
int system(const char * command)
{
printf("system() called for %s ************************************\n", command);
return 55;
}
char * getenv (const char* name)
{
printf("my getenv() *********************");
return 0;
}
И скомпилирован и связан с общим объектом libsyshook.so с помощью gcc.
gcc -Wall -fPIC -c *.c
gcc -shared -Wl,-soname,libsyshook.so -o libsyshook.so.1.0
ln -s libsyshook.so libsyshook.so.1.0
Однако, когда я запускаю программу с LD_PRELOAD, как показано ниже, моя функция-оболочка для system() не вызывается, а вызывается оболочка для getenv().
LD_PRELOAD="libsyshook.so" myprog
Когда я подключаю отладчик, я вижу, что вызов system() вызывает реализацию в libpthread.so. Итак, почему перенаправление system() не работает. Я не думаю, что есть какие-либо ограничения на это ??
Изменить: моя тестовая программа, скомпилированная в myprog выше, выглядит так. Комментарии отражают мои наблюдения.
void TestClass::testMethod()
{
string cmdLine = "date";
if (!mainWin) cmdLine = "time";
int retFromSys = system(cmdLine.c_str()); // goes into libpthread when stepped in.
cout << "return from system " << retFromSys << endl; // prints 0, not 55
getenv("DEBUG_SYS"); // Wrapper function called for this. Prints "my getenv ****** ..."
LD_PRELOAD="./libsyshook.so"
- person Basile Starynkevitch   schedule 07.04.2015strace
, чтобы понять, что происходит - person Basile Starynkevitch   schedule 07.04.2015