当我尝试运行仅具有执行访问权限的脚本时,出现以下错误: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链接,以及当uname
和ls
运行时直接或间接引入了哪些库。
编辑:
我刚刚证实了这一点。解决此错误的方法是将共享库与libdl链接。将-ldl
添加到其LDFLAGS应该可以解决问题。
关于c++ - 将我的库设置为LD_PRELOAD会使某些进程产生加载程序错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4385155/