【问题标题】:Elf header - Repetition of segments精灵头 - 段的重复
【发布时间】:2015-12-10 21:44:00
【问题描述】:

我对某些精灵部分的重复感到怀疑。 我有 X86_64 ABI 和 elf64 规范。

首先,在 /usr/bin 中找到并使用 readelf 和 objdump 进行测试的所有测试程序似乎给出了一个实际的答案,但仍然:

  • 程序头是否可能有超过 1 个PT_DYNAMIC 段? (我的回答:我看不出有什么原因,但我可能会错过一些东西。)
  • 在指出的PT_DYNAMIC 部分中,是否可以有两个DT_RELA 数组? (我的回答:不,因为否则我们将无法确定 DT_RELASZ 定义的是哪个数组。但是,与此同时,一些消息来源谈论的是“a”重定位表而不是“the”,所以..这意味着多个PT_DYNAMIC或多个DT_RELA..嗯嗯)

所以,男孩们 :),你能确认/反驳吗?

【问题讨论】:

    标签: linux x86-64 elf


    【解决方案1】:

    程序头是否可能有超过 1 个 PT_DYNAMIC 段?

    我不相信 ELF 格式规范中的任何内容都禁止这样做,但如果您创建一个包含两个 PT_DYNAMICs 的文件,动态加载程序很可能会不高兴。

    在动态加载器中写代码的常用方法:

    // ehdr points to Elf64_Ehdr in memory.
    Elf64_Phdr *phdr = (Elf64_Phdr*)(ehdr + ehdr->e_phoff);
    Elf64_Phdr *dyn = NULL;    
    for (j = 0; j < ehdr->e_phnum; ++j) {
      if (phdr[j].p_type == PT_DYNAMIC) {
         dyn = phdr + j;
         // break;
      }
      // some other code
    }
    

    完成上述循环后,dyn 将指向PT_DYNAMIC 的last 实例。但是如果“一些其他代码”不存在,并且“中断”被注释(即我们正在寻找 only 的 PT_DYNAMIC),那么 dyn 将指向 PT_DYNAMIC 的第一个实例。

    如果在加载器中混合了两种类型的循环(很可能是这种情况),那么加载器很可能会感到困惑并遇到断言失败。

    是否可以有两个 DT_RELA 数组?

    同样的两种循环答案也适用于此。

    【讨论】:

    • 是的,没有强制执行,但实践定义了规则,对吧?
    猜你喜欢
    • 2012-08-02
    • 1970-01-01
    • 2013-08-04
    • 2018-05-28
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多