0000000000000000 <main>:
0: 48 83 ec 08 sub $0x8,%rsp
4: be 02 00 00 00 mov $0x2,%esi
9: bf 00 00 00 00 mov $0x0,%edi %edi = &array
a: R_X86_64_32 array Relocation entry
e: e8 00 00 00 00 callq 13 <main+0x13> sum()
f: R_X86_64_PC32 sum-0x4 Relocation entry
13: 48 83 c4 08 add $0x8,%rsp
17: c3 retqmain.o 的代码和重定位条目
main 函数引用了两个全局符号:array 和 sum
为每个引用,汇编器产生一个重定位条目,显示在引用的后面一行上
a: R_X86_64_32 array Relocation entry
f: R_X86_64_PC32 sum-0x4 Relocation entry
这些重定位条目告诉链接器对 sum 的引用要使用 32 位 PC相对地址进行重定位,而对 array 的引用要使用 32 位绝对地址进行重定位
重定位条目和指令实际上存放在目标文件的不同节中。为了方便,OBJDUMP 工具把它们显示在一起
通过重定位PC相对引用和重定位绝对引用的计算,我们就算出来了,相对引用的的 sum 和绝对引用的 array 的运行时地址
综合到一起,可以给出最终可执行目标文件中已重定位的 .text 节和 .data 节
在加载的时候,加载器会把这些节中的字节直接复制到内存,不再进行任何修改地执行这些指令
已重定位的.text 节
00000000004004d0 <main>:
4004d0: 48 83 ec 08 sub $0x8,%rsp
4004d4: be 02 00 00 00 mov $0x2,%esi
4004d9: bf 18 10 60 00 mov $0x601018,%edi %edi = &array
4004de: e8 05 00 00 00 callq 4004e8 <sum> sum()
4004e3: 48 83 c4 08 add $0x8,%rsp
4004e7: c3 retq
00000000004004e8 <sum>:
4004e8: b8 00 00 00 00 mov $0x0,%eax
4004ed: ba 00 00 00 00 mov $0x0,%edx
4004f2: eb 09 jmp 4004fd <sum+0x15>
4004f4: 48 63 ca movslq %edx,%rcx
4004f7: 03 04 8f add (%rdi,%rcx,4),%eax
4004fa: 83 c2 01 add $0x1,%edx
4004fd: 39 f2 cmp %esi,%edx
4004ff: 7c f3 jl 4004f4 <sum+0xc>
400501: f3 c3 repz retq已重定位的.data节
0000000000601018 <array>:
601018: 01 00 00 00 02 00 00 00