1

複数のユーザー ライブラリと pthread ライブラリに対してリンクする、静的にリンクされたアプリケーション バイナリがあります。アプリケーションは、これらの各ライブラリから限定された関数セットのみを使用します。以前の投稿ライブラリと実行可能ファイルのサイズから、および私の実験から、リンカにはライブラリの内容全体ではなく、使用/必要な関数 (実行可能ファイル内) のみが含まれていることがわかりました。

それぞれのライブラリのどの関数が実行可能ファイルとそのア​​ドレス (VMA) にリンクされているかを調べたいと思います。最終的には、テキスト セグメントにマップされている (ライブラリ内の) 関数に基づいて、各ライブラリの開始と終了の仮想メモリ アドレス (VMA) を含むリストをコンパイルしたいと考えています。

これを行う 1 つの方法は、ライブラリ内の関数のリストを作成し、実行可能ファイル内のこれらの関数のそれぞれと、それがマップされている対応する仮想メモリ アドレスを探すことです。しかし、これは私にはかなり面倒に思えます。これを達成するためのより簡単な方法はありますか?ありがとう。

4

1 に答える 1

0

それぞれのライブラリのどの関数が実行可能ファイルとそのア​​ドレス (VMA) にリンクされているかを調べたいと思います。

-Wl,-Map=foo.mapリンク行に引数を追加します。結果のfoo.mapファイルは、上記のすべてを教えてくれます。

最終的には、各ライブラリの開始と終了の仮想メモリ アドレス (VMA) を含むリストをコンパイルしたいと考えています。

これは、リンカーが関数の順序を変更しないことを前提としています (したがって、1 つのライブラリのすべての関数がテキスト アドレスの連続した範囲を占有します)。この仮定は、単純なケースではおそらく正しいですが、決して保証されるものではありません。たとえば、このパッチを参照してください。

于 2013-03-02T16:30:25.543 に答える