Linuxバイナリの直接共有オブジェクトの依存関係を確認しますか?


170

ELF形式のLinuxバイナリの直接共有オブジェクトの依存関係を簡単に見つけるにはどうすればよいですか?

私はlddツールを知っていますが、それはバイナリが依存している共有オブジェクトの依存関係を含む、バイナリのすべての依存関係を出力するように見えます。


回答:


262

readelfELFヘッダーの探索に使用できます。readelf -d直接の依存関係をNEEDEDセクションとしてリストします。

 $ readelf -d elfbin

Dynamic section at offset 0xe30 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400520
 0x000000000000000d (FINI)               0x400758
 ...

20
これは素晴らしい。lddとは異なり、readelfはクロスプラットフォームバイナリを検査できます(つまり、x86-64 linuxからのARM実行可能ファイルを検査します)
Robert Calhoun

86

依存関係を再帰的に検索したい場合(依存関係の依存関係、依存関係の依存関係の依存関係など)…

lddコマンドを使用できます。 ldd-共有ライブラリの依存関係を出力する


5
lddコマンドは依存関係の依存関係を解決しますが、これは私が望んでいることではありません。
無料のヌー、2011

11
私にとってこれはうまくいきます。そして、それはあなたに、どのライブラリが見つからなかったか、見つからなかったかさえ教えてくれます。
Philipp F

2
lddは実行可能ファイルでは機能しません-共有ライブラリの依存関係を見つけるためだけに役立ちます。
Tuxdude 2012年

2
Tuxdude、なぜそう思いますか?lddがELF実行可能ファイルを使用できない理由は何ですか?
Vitaly Isaev 2013年

これは、開発マシンからデプロイメントアーカイブに必要な共有ライブラリをコピーするのに最適です。
トマーシュZato -復活モニカ

30

objdumpこのツールは、あなたにこの情報を伝えることができます。オプションを指定objdumpして呼び出し、-xすべてのヘッダーを出力させる場合は、「動的セクション」の最初に共有オブジェクトの依存関係があります。

たとえばobjdump -x /usr/lib/libXpm.so.4、私のシステムで実行すると、「動的セクション」に次の情報が表示されます。

Dynamic Section:
  NEEDED               libX11.so.6
  NEEDED               libc.so.6
  SONAME               libXpm.so.4
  INIT                 0x0000000000002450
  FINI                 0x000000000000e0e8
  GNU_HASH             0x00000000000001f0
  STRTAB               0x00000000000011a8
  SYMTAB               0x0000000000000470
  STRSZ                0x0000000000000813
  SYMENT               0x0000000000000018
  PLTGOT               0x000000000020ffe8
  PLTRELSZ             0x00000000000005e8
  PLTREL               0x0000000000000007
  JMPREL               0x0000000000001e68
  RELA                 0x0000000000001b38
  RELASZ               0x0000000000000330
  RELAENT              0x0000000000000018
  VERNEED              0x0000000000001ad8
  VERNEEDNUM           0x0000000000000001
  VERSYM               0x00000000000019bc
  RELACOUNT            0x000000000000001b

直接共有オブジェクトの依存関係は「必要」値としてリストされています。上記の例でlibXpm.so.4は、私のシステムではlibX11.so.6とのみが必要libc.so.6です。

これは、渡されるバイナリに必要なすべてのシンボルがobjdumpライブラリに存在することを意味するわけではありませんが、少なくとも、ローダーがバイナリのロード時にロードしようとするライブラリを示していることに注意してください。


13

ldd -vは、「バージョン情報:」セクションに依存関係ツリーを出力します。このセクションの最初のブロックは、バイナリの直接的な依存関係です。

階層型ldd(1)を参照してください


thisとはどう違いobjdump -x <binary> | grep "NEEDED"ますか?つまり、どちらもほぼ同じ.soですが、でlddより多くの1つのファイルを取得していますobjdump。しかし、結果が同じではないという事実は、どちらの方法がより正確であるのか疑問に思います。
m4l490n
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.