重定位类型

x86-64系统中主要有两种重定位类型,对应不同的寻址方式。

R_X86_64_PC32(相对寻址):用于 calljmp 等跳转指令。填入的值是目标地址与当前指令下一条指令地址之间的差值。这种方式的优势是代码在内存中可以移动(位置无关),只要相对距离不变,代码依然能正确执行。

例如 call sum 指令,填入的是 sum 函数距离 call 指令的下一条指令的偏移量。CPU 在执行 call 时会自动将当前 PC 值(已指向下一条指令)加上这个偏移量得到目标地址。

R_X86_64_32(绝对寻址):用于访问全局变量的地址。填入的是目标变量在内存中的绝对虚拟地址。这种方式要求代码必须加载到固定地址才能正确执行。

对于绝对寻址,地址在链接阶段即可完全确定;而对于相对寻址,地址的计算在链接阶段完成后仍保持位置独立性。

链接到