我正在为MIPS32 arch编写运行时链接程序,并且遇到问题 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。 我相信相关的代码是常规的 _bfd_mips_elf_gprel16_reloc of binutils / src / bfd / elf32-mips.c。
但我无法弄清楚这是如何计算的。 有人可以伸手吗?
谢谢& 问候, -Qinglai