linux - Elf header - 段的重复

标签 linux x86-64 elf

我对一些 Sprite 部分的重复表示怀疑。 我有 X86_64 ABIelf64 规范

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

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

那么, children :),你能证实/反驳吗?

最佳答案

is it possible for a program header to have more than 1 PT_DYNAMIC segment?

我不相信 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_DYNAMIClast 实例。但是如果“一些其他代码”不存在,并且“break”被注释掉(即我们寻找PT_DYNAMIC),那么dyn 将指向 PT_DYNAMIC第一个实例。

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

is it possible to have two DT_RELA arrays?

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

关于linux - Elf header - 段的重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34212307/

相关文章:

c - C 语言简单程序,用于将字符串附加到目录中的所有文件

c++ - Mac OS X 10.9.5 上的 HealPix C++ 链接错误

c - 编译器 C 的全局变量、静态变量和字符串文字的位置地址在哪里?

linux - NASM中的printf最简单的工作示例失败

c - 实现跟踪 C 内存错误的工具,找到从哪里调用我覆盖的 malloc 等

linux - 内存中 Linux 内核的 ELF header ?

linux - 使用 bash 从另一个文件中存在的文件中删除值

linux - 所有 Linux 版本都使用/etc/ld.so.preload 吗?

linux - 在 Linux 上的 lldb 中打开 .NET Core 2.0 转储 - 哪个 lldb 版本?

assembly - endbr64 指令实际上做了什么?