7

(linux amd64) .o ファイルに対して objdump -d を実行すると、リンク時間の解決が行われずに関数呼び出しが表示されます。例:

  90:   66 89 44 24 1c          mov    %ax,0x1c(%rsp)
  95:   44 89 74 24 10          mov    %r14d,0x10(%rsp)
  9a:   e8 00 00 00 00          callq  9f <foo+0x9f>
  9f:   83 f8 ff                cmp    $0xffffffffffffffff,%eax
  a2:   74 5e                   je     102 <foo+0x102>

関数内の分岐は適切に表示されますが、callq はリンカ用に挿入された単なるスタブです (リンカが適切なアドレスを挿入できるように 4 バイトのゼロを使用できます)。

実際にリンクせずに、関数名が解決されたアセンブリ リストを取得する方法はありますか? 関数の名前だけで、最終的に使用されるアドレスは気にしません。リンカーはジョブを実行するためにそれを消費する必要があるため、その情報は .o ファイルにある必要があります。

問題のコードが入る共有ライブラリは約 140Mb であり、その上で objdump -d を実行して、すべての関数呼び出しが実際の名前に解決された asm ダンプを取得するには長い時間がかかるためです。

4

1 に答える 1

15

実際にリンクせずに、関数名が解決されたアセンブリリストを取得する方法はありますか?

はい:使用objdump -dr foo.o

于 2012-01-25T05:02:00.003 に答える