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

ELF文件PT_LOAD段映射机制及p_offset/p_vaddr等字段疑问

关于ELF PT_LOAD段加载机制与.init_array段地址的问题解答

一、PT_LOAD段核心字段的作用

  • p_offset:该LOAD段在ELF文件中的起始字节偏移
  • p_filesz:文件中属于该LOAD段的字节数,这部分会被完整加载到内存
  • p_vaddr:该LOAD段在进程虚拟地址空间中的起始映射地址
  • p_memsz:该LOAD段在内存中占用的总字节数;若p_memsz > p_filesz,超出p_filesz的内存区域会被内核初始化为0

二、p_offset与p_vaddr差异对应的mmap逻辑验证

你对第四个LOAD段p_offset(0x9a90)和p_vaddr(0xaa90)差异的mmap逻辑猜想是正确的,具体执行流程如下:

  1. 内核以p_vaddr为起始地址,申请一块长度至少为p_memsz的虚拟内存区域(需满足系统页对齐要求,通常为4KB)
  2. 将ELF文件中从p_offset开始、长度为p_filesz的字节内容,映射到虚拟地址p_vaddr起始的对应区域
  3. 若p_memsz大于p_filesz,虚拟内存中超出p_filesz的部分会被自动清零

两者的差值(0xaa90 - 0x9a90 = 0x1000)刚好是标准页大小,这是因为ELF加载要求虚拟地址必须页对齐,而文件中的段偏移无需严格页对齐,内核会自动处理这种偏移,确保内存映射的正确性。

三、.init_array等段使用p_vaddr是否会导致字节丢失

不会出现字节丢失,原因如下:

  • .init_array、.fini_array这类段属于非PT_LOAD段,它们不会被单独加载,而是被包含在某个PT_LOAD段的范围内
  • 这类段的p_vaddr是其所属LOAD段的p_vaddr加上自身在该LOAD段内的偏移;对应的文件位置则是所属LOAD段的p_offset加上自身在该LOAD段内的偏移
  • 当所属LOAD段通过mmap加载到内存后,.init_array的内容已经被包含在LOAD段的p_filesz范围内,会被正确映射到p_vaddr对应的虚拟地址上,不存在字节丢失的情况

内容的提问来源于stack exchange,提问作者Anh Phan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 07:48:10