2

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

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

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

我错过了什么?

4

1 回答 1

1

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

于 2015-12-15T13:21:35.810 回答