重定位计算

重定位条目包含四个关键字段:offset(需要修改的位置偏移)、symbol(目标符号)、type(重定位类型)和 addend(加数)。

相对寻址(R_X86_64_PC32)

填入值 = 目标地址 + 加数 - 当前指令的下一条指令地址

call sum 为例,如果在文件偏移 0xf 处有一条 call 指令(占5字节,其中4字节为偏移量),那么下一条指令地址为 0xf + 5 = 0x14。若 sum 最终被链接到地址 0x1000,则填入的值为 0x1000 + (-4) - 0x14。注意加数 -4 用于补偿 call 指令中 PC 已指向下一条指令的特性。

绝对寻址(R_X86_64_32)

填入值 = 目标变量的绝对地址 + 加数

例如访问全局数组 array,直接在指令中填入 array 的运行时虚拟地址。加数在绝对寻址中通常用于访问结构体或数组内的特定成员。

使用相对寻址的原因是 x86-64 的 call 指令底层采用 PC 相对偏移的编码方式:目标地址 = 下一条指令地址 + 立即数.

链接到