ldd
は動的ライブラリのみをリストするため、実行可能ファイルの作成に使用される静的ライブラリに関する情報を抽出する方法はありますか?
ldd <exe filename>
は、動的にリンクされたライブラリを示します
nm <exe filename>
は、ファイル内のシンボルを示します。
静的ライブラリからのシンボルを確認するには、それらのライブラリに対してnm
を実行してライブラリ内のシンボル(関数など)のリストを取得し、nm <exe filename>
からのシンボルのリストと比較する必要があります。 。
リストを比較するには、comm
コマンドを使用します。詳細については、man comm
を参照してください。
これはこのフォーラムから取りました here 。
いいえ、ライブラリの名前はリンク処理中に破棄されます。ただし、実行可能ファイルにデバッグ情報が含まれている場合(つまり、-gフラグでコンパイルされている場合)、そこから情報を取得できる場合があります。
ソースコードがあり、このためのすべてのコードを実行したくない場合は、コンパイル中にマップファイルを生成して、どの静的ライブラリがリンクされているかを知ることができます。
例えば g++ -Xlinker -Map=a.map main.c
、リンクされた静的ライブラリ情報のマップファイルを確認します。
いくつかの [〜#〜] elf [〜#〜] 実行可能ファイル内の静的ライブラリのリストを取得する方法はありません。
リンカの場合、静的ライブラリは「怠 "な」メンバーのセットとして使用されるだけです。したがって、結果のELF実行可能ファイルには、リンクに必要なメンバーのみが含まれます。したがって、foo2.o
of libfoo.a
は、オブジェクトファイルfoo2.o
は実行可能ファイルにリンクされていました(foo2
が必要です。つまり、どこかで参照されます。
もちろん、いくつかのELF実行可能ファイルでnm
、またはobjdump
、またはreadelf
、またはstrings
を使用すると、どのオブジェクトファイル(来るファイルを含む) fromstaticライブラリ)は、その静的ライブラリ(またはその内部で使用されるリテラル文字列)で(のメンバー)で定義されたシンボルが表示されるためです。
特定のコンパイラがバイナリ内に何らかのメタデータを保存しない限り、そうではありません。静的ライブラリは、バイナリに直接コンパイルされるコードです。