2

基本的にobjdump -DはオブジェクトファイルとELFファイルを逆アセンブルしていました。私が見る2つの主な違いはそれです。

(個々のセグメントの) オブジェクト ファイル内の命令には、 0で始まるアドレスがあることがわかります。したがって、連続するアドレスは、おそらくその特定の命令に対応するオペコードの長さに応じて、特定の値だけオフセットされます。

Disassembly of section .text:
00000000 <main>:
0:   8d 4c 24 04             lea    0x4(%esp),%ecx
4:   83 e4 f0                and    $0xfffffff0,%esp
7:   ff 71 fc                pushl  -0x4(%ecx)      
a:   55                      push   %ebp            

一方、ELF罰金の場合、命令用の32ビットアドレス空間mainが表示されます。また、プログラムでアドレスを出力すると. これは、逆アセンブルした ELF のアドレスに相当します。

08048394 <main>:
8048394:       8d 4c 24 04             lea    0x4(%esp),%ecx
8048398:       83 e4 f0                and    $0xfffffff0,%esp
804839b:       ff 71 fc                pushl  -0x4(%ecx)
804839e:       55                      push   %ebp

ここでの質問は次のとおりです。

  • ELF ファイルのアドレスは実際には何を参照していますか?
  • リンカーはそれらをどのように計算しますか?
4

1 に答える 1

2

ELF ファイルには、実行可能ファイルの優先読み込みアドレスに対して相互にリンクされたコードが含まれています (リンカー オプションを使用して設定を変更できます)。表示されているアドレスは、ELF 形式の一部であるそのアドレスに対して objdump によって計算されます。

ロード可能なイメージにリンクされていないため、オブジェクト コードには (まだ) ロード アドレスがありません。リンカで (残りのオブジェクト コードと共有オブジェクト参照と共に) つなぎ合わされると、最終的な出力は、そのすべてのコードを優先ロード アドレスに対して適切な位置に移動します (一種の... ローダは、 ELF イメージがロードされて実行されます)。さらに読むことをお勧めします(そこにはたくさんのリンクがあります)

于 2012-11-01T09:45:36.100 に答える