You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 18:05:27