Linuxでは、バイナリの直接依存関係と間接依存関係を区別しますか?

Linuxでは、バイナリの直接依存関係と間接依存関係を区別しますか?

lddLinuxでは、特定のバイナリが依存するすべての共有ライブラリのリストを提供します。これは通常、バイナリを生成するために使用されるリンカコマンドラインにリストされているライブラリよりもはるかに広範です。これには、これらのライブラリの依存関係がすべてではなくても、ほとんどが含まれます。

明示的にリンクされたライブラリのリスト(つまり直接依存関係)のみを決定することは可能ですか?それではどうしますか?

答え1

readelf -dダンプバイナリの「動的」部分を使用できます。これには必須ライブラリが含まれます。

たとえば、次のものと比較してみlddreadelfください/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

直接依存関係をリストする場合再帰的に、lddtreepax-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を使用します。)

関連情報