我正在尝试将共享对象的.rela.plt
重定位表移动到文件末尾(因为我将来会添加新的重定位条目)。
首先,我阅读了.rela.plt
部分中的所有条目。原始部分位于偏移0x528
,.rela.dyn
位于0x600。然后我复制文件末尾的.rela.dyn
内容;偏移0xa528
。我通过向.rela.dyn
和0xa000
字段添加sh_addr
来更新sh_offset
的节标题表条目。我使用新地址更新动态表中的DT_RELA
条目;最后我将LOAD
段(带权限RWX
)添加到程序头表的末尾。
因此,重定位表中的R_X86_64_RELATIVE
条目被正确解析;但动态链接器不会更新GOT中外部调用的地址,从而导致分段错误。 在32位共享对象中不会发生这种情况。
我错过了什么?
答案 0 :(得分:1)
我通过在.rel.dyn表之后添加.rel.plt表解决了这个问题。也就是说,中间不应该有一个冗余字节;没有对齐填充,没有其他部分,没有任何东西。动态加载器期望重定位段由于某种原因是连续的。动态部分中的JMPREL条目在x64处似乎是多余的。