是否有像 ldd 这样的工具可以显示可执行文件所依赖的库,但用于库间依赖关系。
例如,一个共享库需要另一个共享库。如何获取依赖项。
我处于这样一种情况,gcc 尝试构建一个 .so 编译库文件,但抱怨“/usr/bin/ld: 在搜索 -lint.1 时跳过不兼容的 /lib/libint.1.so”
我需要知道它依赖哪些库以及它正在寻找哪个版本?有一个 int.so,但我如何才能找到它是哪个版本以及 gcc 正在寻找哪个版本?
答案1
正如评论所述,只需对您感兴趣的 .so 运行 ldd,例如:
ldd -v /usr/lib/liblapack.so.3
linux-vdso.so.1 => (0x00007fff93789000)
libblas.so.3 => /usr/lib/libblas.so.3 (0x00007f7982fc9000)
libgfortran.so.3 => /usr/lib/x86_64-linux-gnu/libgfortran.so.3(0x00007f7982c9e000)
[...]
答案2
任何与 ELF 可执行文件配合使用的工具都将与 ELF 共享库配合使用。最终,它们都使用相同的动态链接机制。
但如果你想要一个很好的概述直接的每个库的依赖项,pax-utils 都有lddtree
:
$ lddtree /bin/curl
/bin/curl (interpreter => /lib64/ld-linux-x86-64.so.2)
libcurl.so.4 => /usr/lib/libcurl.so.4
libnghttp2.so.14 => /usr/lib/libnghttp2.so.14
libidn2.so.0 => /usr/lib/libidn2.so.0
libunistring.so.2 => /usr/lib/libunistring.so.2
libssh2.so.1 => /usr/lib/libssh2.so.1
libpsl.so.5 => /usr/lib/libpsl.so.5
libssl.so.1.1 => /usr/lib/libssl.so.1.1
libcrypto.so.1.1 => /usr/lib/libcrypto.so.1.1
libdl.so.2 => /usr/lib/libdl.so.2
libgssapi_krb5.so.2 => /usr/lib/libgssapi_krb5.so.2
libkrb5support.so.0 => /usr/lib/libkrb5support.so.0
libkeyutils.so.1 => /usr/lib/libkeyutils.so.1
libresolv.so.2 => /usr/lib/libresolv.so.2
libkrb5.so.3 => /usr/lib/libkrb5.so.3
libk5crypto.so.3 => /usr/lib/libk5crypto.so.3
libcom_err.so.2 => /usr/lib/libcom_err.so.2
libz.so.1 => /usr/lib/libz.so.1
libpthread.so.0 => /usr/lib/libpthread.so.0
libc.so.6 => /usr/lib/libc.so.6
您可以通过以下方式获取相同的信息:
使用
readelf -d <binary>
或scanelf --needed <binary>
列出其直接的依赖项(任何 ELF 二进制文件都可以,包括可执行文件和共享文件)。对上一次迭代中找到的所有库重复步骤 1。反复进行,直到获得构建依赖关系树所需的所有信息。