基本上,我使用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
这里的问题是。
答案 0 :(得分:2)
ELF文件包含根据可执行文件的首选加载地址链接在一起的代码(您可以通过链接器选项更改首选项)。您看到的地址是通过objdump计算的,该地址是ELF格式的一部分。
目标代码没有加载地址(尚未),因为它没有链接到可加载图像。一旦它与链接器(以及目标代码的其余部分和共享对象引用)一起拼接,最终输出将所有代码移动到针对首选加载地址的位置(有点......加载器实际上就是这样做的时候加载ELF图像以供执行)。 Suggested further reading(并且有很多链接)