14

当我尝试运行我只有执行权限的脚本时出现以下错误:

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。大多数进程确实给出了这个错误。为什么会发生这种情况,我该怎么做才能让它发挥作用?

4

2 回答 2

33

我无法对已接受的答案发表评论,但值得一提的是,当-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

于 2012-10-24T09:08:37.350 回答
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 应该可以解决问题。

于 2010-12-08T07:51:44.153 回答