移动 ELF64 重定位 table

Moving the ELF64 relocation table

我正在尝试将共享 object 的 .rela.plt 重定位 table 移动到文件末尾(因为我要在未来)。

首先,我阅读了 .rela.plt 部分中的所有条目。原始部分位于偏移量 0x528.rela.dyn 位于 0x600。然后我复制文件末尾.rela.dyn的内容;到偏移量 0xa528。我通过将 0xa000 添加到 sh_addrsh_offset 字段来更新 header table 部分的 .rela.dyn 条目。我用新地址更新动态 table 中的 DT_RELA 条目;最后,我在程序 header table.

的末尾添加了一个 LOAD 段(具有权限 RWX

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

我错过了什么?

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