web-dev-qa-db-ja.com

実行可能ファイルで使用される静的ライブラリのリストを取得します

lddは動的ライブラリのみをリストするため、実行可能ファイルの作成に使用される静的ライブラリに関する情報を抽出する方法はありますか?

42
Saurabh

ldd <exe filename>は、動的にリンクされたライブラリを示します

nm <exe filename>は、ファイル内のシンボルを示します。

静的ライブラリからのシンボルを確認するには、それらのライブラリに対してnmを実行してライブラリ内のシンボル(関数など)のリストを取得し、nm <exe filename>からのシンボルのリストと比較する必要があります。 。

リストを比較するには、commコマンドを使用します。詳細については、man commを参照してください。

これはこのフォーラムから取りました here

46
DrAl

いいえ、ライブラリの名前はリンク処理中に破棄されます。ただし、実行可能ファイルにデバッグ情報が含まれている場合(つまり、-gフラグでコンパイルされている場合)、そこから情報を取得できる場合があります。

11
anon

ソースコードがあり、このためのすべてのコードを実行したくない場合は、コンパイル中にマップファイルを生成して、どの静的ライブラリがリンクされているかを知ることができます。

例えば ​​g++ -Xlinker -Map=a.map main.c、リンクされた静的ライブラリ情報のマップファイルを確認します。

8
zhangxin

いくつかの [〜#〜] elf [〜#〜] 実行可能ファイル内の静的ライブラリのリストを取得する方法はありません。

リンカの場合、静的ライブラリは「怠 "な」メンバーのセットとして使用されるだけです。したがって、結果のELF実行可能ファイルには、リンクに必要なメンバーのみが含まれます。したがって、foo2.o of libfoo.aは、オブジェクトファイルfoo2.oは実行可能ファイルにリンクされていました(foo2が必要です。つまり、どこかで参照されます。

もちろん、いくつかのELF実行可能ファイルでnm、またはobjdump、またはreadelf、またはstringsを使用すると、どのオブジェクトファイル(来るファイルを含む) fromstaticライブラリ)は、その静的ライブラリ(またはその内部で使用されるリテラル文字列)で(のメンバー)で定義されたシンボルが表示されるためです。

特定のコンパイラがバイナリ内に何らかのメタデータを保存しない限り、そうではありません。静的ライブラリは、バイナリに直接コンパイルされるコードです。

5
Goz