既知のライブラリ (Linux i686 アーキテクチャ) で停止する不完全なスタック トレースがあります。最後に呼び出された関数を確認するために、「objdump -d library.so」によって生成されたファイル内のアドレスに、gdb による出力として $eip をマップしようとしています。gdb 内の「info shared」からの From アドレス出力と、$eip を使用してオフセットを計算し、それを objdump -d 出力の逆アセンブリ テキスト セクションからのオフセットに変換できるのではないかと考えました。このアプローチが賢明かどうかはわかりませんが、共有ライブラリを使用して単純なテスト ハーネス アプリで試してみても、正しい関数内のアドレスが得られません。どんな助けでも大歓迎です。
1 に答える
1
gdb 内の「info shared」からの From アドレス出力と、$eip を使用してオフセットを計算し、それを objdump -d 出力の逆アセンブリ テキスト セクションからのオフセットに変換できるのではないかと考えました。
はい、それはまさにあなたがする必要があることです。
GDB ディスプレイのアドレスは、共有ライブラリのセクションがFrom
どこにあったかを示します。.text
は、それ自体のreadelf -S foo.so | grep '\.text'
オフセットを教えてくれます。一方を他方から差し引くと、その共有ライブラリの再配置が得られます (ページ整列されます)。.text
foo.so
GDBから を取得し、再配置を差し引くと、 および の出力と$eip
一致するアドレスが得られます。nm
objdump
foo.so
ただし、GDB は上記のすべての手順を内部ですでに完了しています。最終的にどの関数になったかを推測できなかった場合$eip
、これらの手順を手動で実行してもより良い結果が得られるとは期待できません。
于 2012-09-13T04:51:23.190 に答える