システムの実行可能ファイルで使用されているライブラリを知りたいです。より具体的には、どのライブラリが最も使用されているか、それらを使用するバイナリとともにランク付けしたいと思います。これどうやってするの?
13 に答える
ldd
各実行可能ファイルの共有ライブラリを一覧表示するために使用します。- 出力をクリーンアップする
- 並べ替え、カウントの計算、カウントによる並べ替え
「/bin」ディレクトリ内のすべての実行可能ファイルの答えを見つけるには:
find /bin -type f -perm /a+x -exec ldd {} \; \
| grep so \
| sed -e '/^[^\t]/ d' \
| sed -e 's/\t//' \
| sed -e 's/.*=..//' \
| sed -e 's/ (0.*)//' \
| sort \
| uniq -c \
| sort -n
すべてのディレクトリを検索するには、上記の「/bin」を「/」に変更します。
出力 (/bin ディレクトリのみ) は次のようになります。
1 /lib64/libexpat.so.0
1 /lib64/libgcc_s.so.1
1 /lib64/libnsl.so.1
1 /lib64/libpcre.so.0
1 /lib64/libproc-3.2.7.so
1 /usr/lib64/libbeecrypt.so.6
1 /usr/lib64/libbz2.so.1
1 /usr/lib64/libelf.so.1
1 /usr/lib64/libpopt.so.0
1 /usr/lib64/librpm-4.4.so
1 /usr/lib64/librpmdb-4.4.so
1 /usr/lib64/librpmio-4.4.so
1 /usr/lib64/libsqlite3.so.0
1 /usr/lib64/libstdc++.so.6
1 /usr/lib64/libz.so.1
2 /lib64/libasound.so.2
2 /lib64/libblkid.so.1
2 /lib64/libdevmapper.so.1.02
2 /lib64/libpam_misc.so.0
2 /lib64/libpam.so.0
2 /lib64/libuuid.so.1
3 /lib64/libaudit.so.0
3 /lib64/libcrypt.so.1
3 /lib64/libdbus-1.so.3
4 /lib64/libresolv.so.2
4 /lib64/libtermcap.so.2
5 /lib64/libacl.so.1
5 /lib64/libattr.so.1
5 /lib64/libcap.so.1
6 /lib64/librt.so.1
7 /lib64/libm.so.6
9 /lib64/libpthread.so.0
13 /lib64/libselinux.so.1
13 /lib64/libsepol.so.1
22 /lib64/libdl.so.2
83 /lib64/ld-linux-x86-64.so.2
83 /lib64/libc.so.6
編集 - 「grep -P」を削除
ARM ツールチェーンに ldd がなかったので、objdump を使用しました。
$(CROSS_COMPILE)objdump -p
例えば:
objdump -p /usr/bin/python:
Dynamic Section:
NEEDED libpthread.so.0
NEEDED libdl.so.2
NEEDED libutil.so.1
NEEDED libssl.so.1.0.0
NEEDED libcrypto.so.1.0.0
NEEDED libz.so.1
NEEDED libm.so.6
NEEDED libc.so.6
INIT 0x0000000000416a98
FINI 0x000000000053c058
GNU_HASH 0x0000000000400298
STRTAB 0x000000000040c858
SYMTAB 0x0000000000402aa8
STRSZ 0x0000000000006cdb
SYMENT 0x0000000000000018
DEBUG 0x0000000000000000
PLTGOT 0x0000000000832fe8
PLTRELSZ 0x0000000000002688
PLTREL 0x0000000000000007
JMPREL 0x0000000000414410
RELA 0x0000000000414398
RELASZ 0x0000000000000078
RELAENT 0x0000000000000018
VERNEED 0x0000000000414258
VERNEEDNUM 0x0000000000000008
VERSYM 0x0000000000413534
バイナリが使用するライブラリを知るには、ldd を使用します
ldd path/to/the/tool
システム全体の内訳に到達するには、小さなシェル スクリプトを作成する必要があります。
プログラム実行可能ファイルの共有ライブラリの依存関係を確認する
特定の実行可能ファイルが依存しているライブラリを見つけるには、ldd コマンドを使用できます。このコマンドは、動的リンカーを呼び出して、実行可能ファイルのライブラリ依存関係を見つけます。
> $ ldd /path/to/program
信頼されていないサードパーティの実行可能ファイルで ldd を実行することは推奨されないことに注意してください。ldd の一部のバージョンでは、実行可能ファイルを直接呼び出してライブラリの依存関係を特定することがあり、これはセキュリティ リスクになる可能性があります。
代わりに、不明なアプリケーション バイナリのライブラリ依存関係を表示するより安全な方法は、次のコマンドを使用することです。
$ objdump -p /path/to/program | grep が必要
OS X では、デフォルトでldd
,objdump
またははありませんlsof
。別の方法として、次を試してくださいotool -L
。
$ otool -L `which openssl`
/usr/bin/openssl:
/usr/lib/libcrypto.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
/usr/lib/libssl.0.9.8.dylib (compatibility version 0.9.8, current version 0.9.8)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1213.0.0)
この例でwhich openssl
は、特定の実行可能ファイルと現在のユーザー環境の完全修飾パスを使用して塗りつぶします。
UNIX システムでは、バイナリ (実行可能) 名が test であるとします。次に、次のコマンドを使用して、テストで使用されるライブラリを一覧表示します。
ldd test
ツールが使用するライブラリをldd
取得できます。ツール セットのライブラリの使用状況をランク付けするには、次のコマンドのようなものを使用できます。
ldd /bin/* /usr/bin/* ... | sed -e '/^[^\t]/ d; s/^\t\(.* => \)\?\([^ ]*\) (.*/\2/g' | sort | uniq -c
(ここでsed
は、タブで始まらないすべての行を削除し、実際のライブラリのみを除外します。これによりsort | uniq -c
、発生した回数を示すカウントで各ライブラリが取得されます。)
最後に追加sort -g
して、ライブラリを使用順に取得することをお勧めします。
上記のコマンドを使用すると、おそらく 2 行の非ライブラリ行が表示されることに注意してください。静的実行可能ファイル (「動的実行可能ファイルではない」) の 1 つと、ライブラリを含まない実行可能ファイル。後者は、linux-gate.so.1
ファイルシステムのライブラリではなく、カーネルによって「提供」されたライブラリの結果です。
もう 1 つのオプションは、次の場所にあるファイルを読み取るだけです。
/proc/<pid>/maps
たとえば、プロセス ID が 2601 の場合、コマンドは次のようになります。
cat /proc/2601/maps
そして、出力は次のようになります
7fb37a8f2000-7fb37a8f4000 r-xp 00000000 08:06 4065647 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37a8f4000-7fb37aaf3000 ---p 00002000 08:06 4065647 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf3000-7fb37aaf4000 r--p 00001000 08:06 4065647 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf4000-7fb37aaf5000 rw-p 00002000 08:06 4065647 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/network_networkmanager.so
7fb37aaf5000-7fb37aafe000 r-xp 00000000 08:06 4065646 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37aafe000-7fb37acfd000 ---p 00009000 08:06 4065646 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acfd000-7fb37acfe000 r--p 00008000 08:06 4065646 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acfe000-7fb37acff000 rw-p 00009000 08:06 4065646 /usr/lib/x86_64-linux-gnu/libproxy/0.4.15/modules/config_gnome3.so
7fb37acff000-7fb37ad1d000 r-xp 00000000 08:06 3416761 /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37ad1d000-7fb37af1d000 ---p 0001e000 08:06 3416761 /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1d000-7fb37af1e000 r--p 0001e000 08:06 3416761 /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1e000-7fb37af1f000 rw-p 0001f000 08:06 3416761 /usr/lib/x86_64-linux-gnu/libproxy.so.1.0.0
7fb37af1f000-7fb37af21000 r-xp 00000000 08:06 4065186 /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37af21000-7fb37b121000 ---p 00002000 08:06 4065186 /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37b121000-7fb37b122000 r--p 00002000 08:06 4065186 /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so
7fb37b122000-7fb37b123000 rw-p 00003000 08:06 4065186 /usr/lib/x86_64-linux-gnu/gio/modules/libgiolibproxy.so