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

nak*_*iya 12 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.大多数进程都会出现此错误.为什么会发生这种情况,我该怎么做才能使它发挥作用?

小智 26

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

所以最后打电话给gcc -ldl:

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

在我的情况下,-ldl在前面导致错误与问题相同:

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

  • 是的竖起大拇指!!!thkala 的回答仍然给了我错误,但你最后的“-ldl”解决了一切。 (2认同)

thk*_*ala 15

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

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

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

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

我会与检查ldd,如果你自己的共享对象是理所应当对libdl的联系,亦是图书馆都直接或间接地被拉入时unamels运行.

编辑:

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