如何确定动态库与应用程序链接的原因?

时间:2014-08-21 10:58:30

标签: linux shared-libraries ld ldd

我有一个Linux应用程序,我从源代码构建。当我对二进制文件运行ldd时,我理解大多数库...但不是全部。

有没有办法为ld或gcc / g ++添加标志或我可以做些什么来确定链接器选择链接特定库的为什么


编辑:

为了探索@shloim设置的路线,我尝试了以下方法:

> nm -u /lib/x86_64-linux-gnu/libcrypto.so.1.0.0
nm: /lib/x86_64-linux-gnu/libcrypto.so.1.0.0: no symbols

> file /lib/x86_64-linux-gnu/libcrypto.so.1.0.0 
/lib/x86_64-linux-gnu/libcrypto.so.1.0.0: ELF 64-bit LSB  shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=230ebe6145b6681d0cb7e4c9021f0d899c02e0c4, stripped

是否有一个明显的原因导致nm无法在libcrypto上运行?

2 个答案:

答案 0 :(得分:1)

这应该显示so文件中使用的所有符号在so:

中未定义
nm -u <your_so_file>

然后您可以将其与

进行比较
nm --defined-only <3rd_party_so_file>

并尝试找出常用符号

答案 1 :(得分:1)

Is there an obvious reason why nm would not work on libcrypto?

通常nm列出目标文件的符号。在这里,nm用于share object文件。所以试试这个nm -D libcrypto.so

readelfobjdump也可用于检查shared objects中的符号。

readelf -Ws将显示所有符号