ldd 但是对于库间依赖关系?

ldd 但是对于库间依赖关系?

是否有像 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

您可以通过以下方式获取相同的信息:

  1. 使用readelf -d <binary>scanelf --needed <binary>列出其直接的依赖项(任何 ELF 二进制文件都可以,包括可执行文件和共享文件)。

  2. 对上一次迭代中找到的所有库重复步骤 1。反复进行,直到获得构建依赖关系树所需的所有信息。

相关内容