反汇编对象和可执行文件的差异

时间:2012-11-01 09:36:56

标签: c linker gnu disassembly object-files

基本上,我使用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文件中的地址实际上是指什么?
  • 链接器如何计算它们?

1 个答案:

答案 0 :(得分:2)

ELF文件包含根据可执行文件的首选加载地址链接在一起的代码(您可以通过链接器选项更改首选项)。您看到的地址是通过objdump计算的,该地址是ELF格式的一部分。

目标代码没有加载地址(尚未),因为它没有链接到可加载图像。一旦它与链接器(以及目标代码的其余部分和共享对象引用)一起拼接,最终输出将所有代码移动到针对首选加载地址的位置(有点......加载器实际上就是这样做的时候加载ELF图像以供执行)。 Suggested further reading(并且有很多链接)