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