当我尝试运行仅具有执行访问权限的脚本时,出现以下错误:
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时没有出现此问题。大多数进程的确会出现此错误。为什么会发生这种情况,我该怎么做才能使其起作用?

最佳答案

我假设您的a.out文件是共享库而不是可执行文件,然后继续...
dlsym()是libdl库中的函数,该库通常位于现代Linux系统上的libdl.so.2共享库中。

我会猜测您的a.out共享对象未链接到libdl。这意味着,当您预加载诸如uname之类的简单二进制文件时,不会加载很多其他库,libdl.so.2可能不会被加载,并且会出现 undefined symbol 错误。

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

我会用ldd检查您自己的共享库是否按应与libdl链接,以及当unamels运行时直接或间接引入了哪些库。

编辑:

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

关于c++ - 将我的库设置为LD_PRELOAD会使某些进程产生加载程序错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4385155/

10-09 08:42