为LD_PRELOAD设置我的lib会使某些进程产生加载器错误

时间:2010-12-08 07:33:17

标签: c++ c linux linker dlsym

当我尝试运行脚本时,我收到以下错误:我只有执行权限:

uname: symbol lookup error: /home/dumindara/random/sotest/a.out: undefined symbol: dlsym

这是在我将LD_PRELOAD环境变量设置为/home/dumindara/random/sotest/a.out之后。

a.out具有测试malloc功能,并在内部调用dlsym

运行ls时,我没有遇到此问题。大多数进程都会出现此错误。为什么会发生这种情况,我该怎么做才能使其发挥作用?

2 个答案:

答案 0 :(得分:24)

我无法对接受的答案发表评论,但值得一提的是,在编译命令前使用-ldl时,可能会遇到没有正确链接libdl.so.2的问题(假设链接和编译由同一个命令执行;这是可能的,因为LD_PRELOAD库通常基于一个源文件。)

所以最后用-ldl调用gcc:

gcc -shared -fPIC fakeuname.c -o libfakeuname.so -ldl

就我而言,前面-ldl导致错误与问题相同:

uname: symbol lookup error: ./libfakehostname.so: undefined symbol: dlsym

答案 1 :(得分:15)

我假设您的a.out文件是共享对象而不是可执行文件并继续...

dlsym()是libdl库中的一个函数,它通常驻留在现代Linux系统上的libdl.so.2共享对象中。

我猜你的a.out共享对象没有链接到libdl。这意味着当你预加载一个简单的二进制文件,比如uname,它不会引入很多其他库时,libdl.so.2可能不会被拉入并且你得到一个未定义的符号错误。

另一方面,如果将它预加载到链接到并最终拉入libdl.so.2的二进制文件中,则共享对象可以正常工作。

如果您自己的共享对象与libdl相关联,我会检查ldd,以及unamels运行时直接或间接引入的库。

编辑:

我刚刚证实了这一点。修复此错误的方法是将您的共享对象链接到libdl。将-ldl添加到其LDFLAGS应该可以解决问题。