web-dev-qa-db-ja.com

lddは動的にリンクされたバイナリでは機能しません

たくさんの.soファイルを使用するバイナリがあります。

bash-3.00$ file foo
foo: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.21, dynamically linked (uses shared libs), not stripped

しかし、このファイルでlddを実行すると、バイナリが依存している.soファイルを取得できません。

bash-3.00$ ldd foo
        not a dynamic executable
bash-3.00$

readelfは、バイナリで使用される共有ライブラリのリストを表示します。

bash-3.00$ readelf -d  foo
Dynamic segment at offset 0x17c810 contains 70 entries:

  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libdl.so.2]

この場合、lddがライブラリの依存関係を取得できないのはなぜですか?

15
Manohar

コメントの1つにあるように、64ビットシステムでlddを使用して32ビットELFオブジェクトを検査しようとしました。 lddは標準のダイナミックリンカーを使用して依存関係をトレースするため、プラットフォームに検査対象のELFオブジェクトに必要なリンカーがない場合、lddは失敗します。 Readelfとobjdumpは、これらの状況でより堅牢です。

5
jmajnert

Fedora 21では、lddで32ビットの.soファイルを識別するために、以下をインストールする必要があることに注意してください。

Sudo yum install glibc.i686 libgcc.i686 libstdc++.i686 glibc-devel.i686

Lddで表示されていた「動的実行可能ファイルではない」エラーを修正したのはどれかわかりません。

5
eresonance