2012-11-01 40 views
0

基本上,我用objdump -D来卸载目标文件和ELF文件。我认为两者之间的主要区别在于。反汇编对象和可执行文件的差异

我看到目标文件(单个段)中的指令的地址以开头。因此,连续地址是,将偏移一定的值,可能取决于对应于该特定指令的操作码的长度。

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罚款我看到了一个instructions.Also 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文件中的地址实际上指的是什么?
  • 链接器如何计算它们?

回答

2

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

对象代码没有加载地址(尚未),因为它没有链接到可加载的图像。一旦它与链接器一起缝合(以及对象代码和共享对象引用的其余部分),最终的输出将所有代码移动到与首选加载地址相对的位置(有点......加载器实际上是当ELF图像被加载执行)。 Suggested further reading(并有链接TON)

相关问题