精灵标题 - 重复段

时间:2015-12-10 21:44:00

标签: linux x86-64 elf

我怀疑一些精灵部分的重复。 我有 X86_64 ABI elf64规范

首先,在/ usr / bin中找到并使用1003036,148147.300296921 1003075,98846.6098338726 1003144,395386.43933549 1003149,172515.360218338 1003199,98846.6098338726 1003208,86257.6804815052 readelf进行测试的所有测试程序似乎都给出了实际答案,但仍然是:

  • 程序标题是否可以包含多个objdump段? (我的回答:我认为没有理由,但我可能会错过一些东西。)
  • 在指向PT_DYNAMIC部分中的
  • ,是否可以有两个PT_DYNAMIC数组? (我的回答:不,因为否则我们不确定哪个数组DT_RELA正在定义。但是,与此同时,有些消息来源谈论" a"重定位表而不是&#34 ;",所以..这意味着多个DT_RELASZ或多个PT_DYNAMIC ..嗯嗯嗯)

所以,男孩:),请你确认/自相矛盾?

1 个答案:

答案 0 :(得分:1)

  

程序标题是否可以包含多个PT_DYNAMIC段?

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

在动态加载程序中编写代码的常用方法:

// 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 实例。但如果“其他一些代码”不存在,并且“中断”被注释(即我们只看 代表PT_DYNAMIC),那么dyn将指向 PT_DYNAMIC的第一个实例。

如果加载器中存在两种样式的循环混合(很可能就是这种情况),那么加载器可能会混淆并导致断言失败。

  

是否可以有两个DT_RELA数组?

同样适用两种类型的循环答案。