移动ELF64重定位表

时间:2015-12-10 14:38:36

标签: shared-libraries ld elf relocation

我正在尝试将共享对象的.rela.plt重定位表移动到文件末尾(因为我将来会添加新的重定位条目)。

首先,我阅读了.rela.plt部分中的所有条目。原始部分位于偏移0x528.rela.dyn位于0x600。然后我复制文件末尾的.rela.dyn内容;偏移0xa528。我通过向.rela.dyn0xa000字段添加sh_addr来更新sh_offset的节标题表条目。我使用新地址更新动态表中的DT_RELA条目;最后我将LOAD段(带权限RWX)添加到程序头表的末尾。

因此,重定位表中的R_X86_64_RELATIVE条目被正确解析;但动态链接器不会更新GOT中外部调用的地址,从而导致分段错误。 在32位共享对象中不会发生这种情况

我错过了什么?

1 个答案:

答案 0 :(得分:1)

我通过在.rel.dyn表之后添加.rel.plt表解决了这个问题。也就是说,中间不应该有一个冗余字节;没有对齐填充,没有其他部分,没有任何东西。动态加载器期望重定位段由于某种原因是连续的。动态部分中的JMPREL条目在x64处似乎是多余的。