我正在为 MIPS32 架构编写运行时链接器,但 GPREL16 重定位类型存在问题。例如,编译器/汇编器输出带有如下指令的可重定位对象:
ff838018 sd v1,-32744(gp)
这里涉及的符号属于 .sbss 段,并设置为运行时地址 0x12b119e8。假设 _gp 是 0x12b12220,并且 .sbss 部分从 0x12b11868 开始。(这些值是从目标 ELF 对象中读取的。)
被ld重定位后,指令变为:
ff83f7c8 sd v1,-2104(gp)
我的问题是:ld如何计算偏移量0xf7c8?我的猜测是 0xf7c8 是由 _gp、.sbss 地址和原始偏移量 0x8018 计算得出的。而且我相信相关代码在binutils/src/bfd/elf32-mips.c的例程_bfd_mips_elf_gprel16_reloc中。
但我无法弄清楚这是如何计算的。有人可以帮忙吗?
谢谢和问候,-清莱