当我尝试运行脚本时,我收到以下错误:我只有执行权限:
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
时,我没有遇到此问题。大多数进程都会出现此错误。为什么会发生这种情况,我该怎么做才能使其发挥作用?
答案 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
,以及uname
和ls
运行时直接或间接引入的库。
编辑:
我刚刚证实了这一点。修复此错误的方法是将您的共享对象链接到libdl。将-ldl
添加到其LDFLAGS应该可以解决问题。