c++ - 違い - 静的ライブラリ とは



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

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

nm <exe filename>nm <exe filename>内のシンボルを示します。

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

commコマンドでリストを比較します。 詳細はman commを参照してください。

これはこのフォーラムから取られhere

lddはダイナミックライブラリのみを一覧表示するので、実行可能ファイルを作成するために使用される静的ライブラリに関する情報を抽出する方法はありますか?


Answer #1

あるコンパイラが何らかの種類のメタデータをバイナリの中に格納していない限り、 静的ライブラリは、バイナリに直接コンパイルされたコードです。


Answer #2

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

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


Answer #3

実行可能なELF内に静的ライブラリのリストを取得する方法はありません。

リンカのために、静的ライブラリはメンバの「怠惰な」セットとして使われるだけです。 結果として得られるELF実行ファイルには、リンクするために必要なメンバーだけが含まれます。 したがって、 foo2.olibfoo.aようなfoo2.oは、オブジェクトファイルfoo2.oが実行可能ファイルにリンクされているかのようにリンクされます( foo2で定義されたシンボルが必要な場合、つまりどこかで参照される場合)。

もちろん、ELF実行可能ファイルのnmobjdumpreadelf 、またはstringsを使用nm 、( 静的ライブラリから来るものを含む)オブジェクトファイルがその中に入っているかどうかについてのヒントが得られます。それらの静的ライブラリ(またはそれらの内部で使用されるリテラル文字列)。





linker