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                      retq

main.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