区分 Linux 上二进制文件的直接依赖关系和间接依赖关系?

区分 Linux 上二进制文件的直接依赖关系和间接依赖关系?

ldd在 Linux 上将给出给定二进制文件所依赖的所有共享库的列表。这通常比用于创建二进制文件的链接器命令行上列出的库要广泛得多:它将包括这些库的大多数(如果不是全部)依赖项。

是否可以仅确定显式链接的库列表(即直接依赖项),如果可以,如何确定?

答案1

您可以使用readelf -d转储二进制文件的“动态”部分。这将包括所需的库。

例如,lddreadelfon进行比较/bin/ls


$ ldd /bin/ls
        linux-vdso.so.1 =>  (0x00007fff190da000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f082f94e000)
        libcap.so.2 => /lib64/libcap.so.2 (0x00007f082f749000)
        libacl.so.1 => /lib64/libacl.so.1 (0x00007f082f540000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f082f172000)
        libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f082ef10000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f082ed0c000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f082fb75000)
        libattr.so.1 => /lib64/libattr.so.1 (0x00007f082eb07000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f082e8eb000)

$ readelf -d /bin/ls | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libselinux.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libcap.so.2]
 0x0000000000000001 (NEEDED)             Shared library: [libacl.so.1]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

您也可以对.so文件执行此操作

$ readelf -d /lib64/libpcre.so.1 | grep NEEDED
 0x0000000000000001 (NEEDED)             Shared library: [libpthread.so.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]

答案2

如果您打算列出直接依赖项递归地,lddtree从 pax-utils使用:

$ lddtree /bin/file
/bin/file (interpreter => /lib64/ld-linux-x86-64.so.2)
    libmagic.so.1 => /usr/lib/libmagic.so.1
        libzstd.so.1 => /usr/lib/libzstd.so.1
        liblzma.so.5 => /usr/lib/liblzma.so.5
        libbz2.so.1.0 => /usr/lib/libbz2.so.1.0
        libz.so.1 => /usr/lib/libz.so.1
    libseccomp.so.2 => /usr/lib/libseccomp.so.2
    libc.so.6 => /usr/lib/libc.so.6

(这在内部使用 python-pyelftools。)

相关内容