2009-07-14 10 views

答えて

35

ldd <exe filename>

nm <exe filename>は、ファイル内のシンボルを示しているダイナミックリンクライブラリを示しています。

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

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

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

+2

@Gozとanonが指摘しているように、これはバイナリが削除されていないか、デバッグ情報が含まれている場合にのみ動作します。静的ライブラリがアプリケーションにリンクされた後も、名前は必要ではなく(使用されていなくても)、呼び出しはすべてアドレスで行われます。 –

+0

これは質問に答えません。ライブラリーが分からない場合、「それらのライブラリーに対してnmを実行する」ことはできません。リンクに暗黙的に使用されるライブラリがあります。 – kavadias

+0

未知のバイナリであれば、どのライブラリが存在するのかわかりません。したがって、「それらのライブラリに対してnmを実行する」とは、自己破滅してしまいます。 – goldenmean

10

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

+0

RAW ASMを識別する方法がないか、コンパイラの最適化とフラグも影響を与えますか? – MrMesees

5

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

6

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

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

2

ELF実行ファイル内の静的ライブラリのリストを取得する方法はありません。

リンカのために、静的ライブラリはメンバーの「怠け者」セットとして使用されるだけなので、結果として得られるELF実行ファイルには、リンクするために必要なメンバーだけが含まれます。したがってfoo2.oのようなメンバーがlibfoo.aの場合、オブジェクトファイルfoo2.oが実行可能ファイルにリンクされているかのようにリンクされます(foo2で定義されたシンボルが必要です。いくつかのヒントを与えることnm、またはobjdump、またはreadelf、またはいくつかのELF実行可能にstringsを使用してもちろん

、何についてあなたはシンボルが表示されますので、その中にある(静的ライブラリから来るものを含む)オブジェクトファイルそれらの静的ライブラリ(またはその内部で使用されるリテラル文字列)の(メンバ)で定義されています。

+1

どのようなヒントがありますか?あなたは例を挙げることができますか?私はこれらのヒントの多くを見つけることができるソースに私を指摘できますか? – stackoverflowwww

+1

たとえば、readelfを使用すると、バイナリで使用される関数、オブジェクト、シンボルが表示されます。これらは、使用されたライブラリを見つけるためのヒントとして役立ちます。たとえば、Curl_http関数がそこにあり、libcurlがバイナリによって使用される可能性が高いことがわかります。また、動的にリンクされていなければ静的にリンクする必要があります。 – ohgodnotanotherone

関連する問題