【问题标题】:Moving the ELF64 relocation table移动 ELF64 重定位表
【发布时间】:2015-12-10 14:38:36
【问题描述】:

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

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

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

我错过了什么?

【问题讨论】:

    标签: shared-libraries ld elf relocation


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 1970-01-01
      • 2021-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多