基本的に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 ファイルのアドレスは実際には何を参照していますか?
- リンカーはそれらをどのように計算しますか?