ldd
Linuxでは、特定のバイナリが依存するすべての共有ライブラリのリストを提供します。これは通常、バイナリを生成するために使用されるリンカコマンドラインにリストされているライブラリよりもはるかに広範です。これには、これらのライブラリの依存関係がすべてではなくても、ほとんどが含まれます。
明示的にリンクされたライブラリのリスト(つまり直接依存関係)のみを決定することは可能ですか?それではどうしますか?
答え1
readelf -d
ダンプバイナリの「動的」部分を使用できます。これには必須ライブラリが含まれます。
たとえば、次のものと比較してみldd
てreadelf
ください/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を使用します。)