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
thk*_*ala 15
我假设您的a.out文件是共享对象而不是可执行文件并继续...
dlsym() 是libdl库中的一个函数,它通常驻留在现代Linux系统上的libdl.so.2共享对象中.
我猜你的a.out共享对象没有链接到libdl.这意味着当你加载一个简单的二进制文件,比如uname,它不会引入很多其他库时,libdl.so.2可能不会被拉入并且你得到一个未定义的符号错误.
另一方面,如果将它预加载到链接到的二进制文件并最终拉入libdl.so.2,则共享对象可以正常工作.
我会与检查ldd,如果你自己的共享对象是理所应当对libdl的联系,亦是图书馆都直接或间接地被拉入时uname和ls运行.
编辑:
我刚刚证实了这一点.修复此错误的方法是将您的共享对象链接到libdl.添加-ldl到LDFLAGS应该可以解决问题.
| 归档时间: |
|
| 查看次数: |
8331 次 |
| 最近记录: |