移动 ELF64 重定位 table
Moving the ELF64 relocation table
我正在尝试将共享 object 的 .rela.plt
重定位 table 移动到文件末尾(因为我要在未来)。
首先,我阅读了 .rela.plt
部分中的所有条目。原始部分位于偏移量 0x528
,.rela.dyn
位于 0x600。然后我复制文件末尾.rela.dyn
的内容;到偏移量 0xa528
。我通过将 0xa000
添加到 sh_addr
和 sh_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 上似乎是多余的。
我正在尝试将共享 object 的 .rela.plt
重定位 table 移动到文件末尾(因为我要在未来)。
首先,我阅读了 .rela.plt
部分中的所有条目。原始部分位于偏移量 0x528
,.rela.dyn
位于 0x600。然后我复制文件末尾.rela.dyn
的内容;到偏移量 0xa528
。我通过将 0xa000
添加到 sh_addr
和 sh_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 上似乎是多余的。