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逻辑猜想是正确的,具体执行流程如下:
- 内核以
p_vaddr为起始地址,申请一块长度至少为p_memsz的虚拟内存区域(需满足系统页对齐要求,通常为4KB) - 将ELF文件中从
p_offset开始、长度为p_filesz的字节内容,映射到虚拟地址p_vaddr起始的对应区域 - 若
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
相关产品推荐
相关产品推荐

