我有一个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上运行?
答案 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
。
readelf
或objdump
也可用于检查shared objects
中的符号。
readelf -Ws
将显示所有符号