我对一些 Sprite 部分的重复表示怀疑。 我有 X86_64 ABI 和 elf64 规范。
首先,所有在/usr/bin 中找到并使用 readelf
和 objdump
测试的程序似乎都给出了一个实际的答案,但仍然:
- 程序头是否可能有超过 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_DYNAMIC
的last 实例。但是如果“一些其他代码”不存在,并且“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/