2

我正在为 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中。

但我无法弄清楚这是如何计算的。有人可以帮忙吗?

谢谢和问候,-清莱

4

0 回答 0