我怀疑一些精灵部分的重复。 我有 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
..嗯嗯嗯)所以,男孩:),请你确认/自相矛盾?
答案 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
数组?
同样适用两种类型的循环答案。