当我们用 gcc -c
编译任何 c 代码时并做 objdump -d <filename>.o
我们看到了
Disassembly of section .text:
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: 48 83 ec 10 sub $0x10,%rsp
8: 48 8d 45 fc lea -0x4(%rbp),%rax
c: 48 89 c7 mov %rax,%rdi
f: b8 00 00 00 00 mov $0x0,%eax
. . .
但链接后,偏移量变为gcc -o prog -L/library/path -llibrary *.o
0000000000400644 <main>:
400644: 55 push %rbp
400645: 48 89 e5 mov %rsp,%rbp
400648: 48 83 ec 10 sub $0x10,%rsp
40064c: 48 8d 45 fc lea -0x4(%rbp),%rax
400650: 48 89 c7 mov %rax,%rdi
400653: b8 00 00 00 00 mov $0x0,%eax
链接完成后如何计算偏移量?
我们基本上得到了 3 组地址, 1.编译后 2.链接后 3.加载后
上述地址有什么关系?
最佳答案
你必须记住目标文件只包含你的代码,所以它总是在偏移量零处。
当您链接时,您会从其他来源添加模块,例如运行时初始化和库函数。您不知道这些对象的大小,也不知道它们在生成的可执行文件中的位置,因此无法自行计算代码不同部分的偏移量。此外,如果您有多个目标文件,链接器可能会根据需要重新排列它们。
代码在运行时将最终到达的确切虚拟地址,部分取决于链接器,但主要取决于操作系统和地址空间随机化等因素。
关于c - 为目标文件中的指令分配地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22854378/