【发布时间】:2015-04-07 10:07:59
【问题描述】:
我想替换我的程序使用 LD_PRELOAD 对 system() 函数的调用。
所以我在一个共享库中创建了以下包装函数进行测试。
// 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;
}
并使用 gcc 编译并链接到共享对象 libsyshook.so。
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" -
使用
strace了解正在发生的事情 -
@Basile Starynkevitch 我已经将 libsyshook.so 的路径添加到 $LD_LIBRARY_PATH 的开头。实际上,问题仅针对 system(),我可以看到 getenv() 包装器调用成功。所以这不是由于路径问题。
-
显示你的工作程序 - 通过编辑你的问题 - 或类似的小例子(对于那个问题)。给我们编译命令以及你是如何测试它的。
-
@BasileStarynkevitch 我已经编辑了我的帖子以包含测试代码和编译命令行。谢谢。
标签: c++ c linux ld-preload