.text段的地址与偏移量为何不一致?及内存映射疑问
关于ELF段地址、文件偏移及内存映射差异的解释
一、.text段地址与文件偏移不匹配及中间空隙的原因
- 段对齐约束:
.text段的Al(对齐)字段为64,要求它在文件和内存中都必须对齐到64字节的边界。 - 计算前一段
.eh_frame的结束位置:.eh_frame起始地址0x48368加上大小0x66ae4,得到结束位置0xaee4c,这个位置不满足64字节对齐。 - 链接器会在文件中从
0xaee4c填充到下一个64字节边界0xaee80,填充内容就是你用objdump -D看到的未定义指令(如udf #0),这部分不属于任何ELF节,因此不会被标记为有效段内容。 - 内存中
.text段的起始地址0xafe80同样是64字节对齐的,而文件偏移0xaee80是对齐后的文件位置。之前的段(如.eh_frame)对齐要求仅为8字节,结束位置刚好满足自身对齐,因此地址与偏移量相等,而.text段因更高的对齐要求打破了这一一致性。
二、运行时内存映射与readelf输出差异的原因
- 内存映射展示的是ELF程序段(Program Segment),而非
readelf -SW查看的节(Section)。程序段是多个节的集合,用于指导操作系统加载文件到内存的规则。 - 看内存映射的可执行段条目
5555604000-5555790000 r-xp 000ae000:000ae000是该程序段在文件中的起始偏移,.text段是这个程序段的一部分,其文件偏移0xaee80= 程序段起始偏移0xae000+.text在段内的偏移0xe80,完全对应。
- 内存中的起始地址
0x5555604000= 程序加载基址0x5555555000+ 程序段偏移0xae000,这是操作系统加载ELF的标准逻辑:将程序段从文件的对应偏移位置,加载到内存中基址加上偏移的地址区域。
内容的提问来源于stack exchange,提问作者Coloda
相关产品推荐
相关产品推荐

