2

基本上,我曾经objdump -D反汇编一个目标文件和一个 ELF 文件。我看到两者之间的主要区别是。

我看到(各个段的)目标文件中的指令有一个以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 文件包含根据可执行文件的首选加载地址链接在一起的代码(您可以通过链接器选项更改首选项)。您看到的地址是 objdump 针对该地址计算的,这是 ELF 格式的一部分。

目标代码(还)没有加载地址,因为它没有链接到可加载的图像中。一旦它与链接器(以及其余的目标代码和共享对象引用)缝合在一起,最终输出会将所有代码移动到相对于首选加载地址的位置(有点......加载器实际上是在加载 ELF 图像以供执行)。建议进一步阅读(那里有大量链接)

于 2012-11-01T09:45:36.100 回答