ld生成权限错误的ELF段:段划分规则及问题咨询
ld划分ELF LOAD段的规则与启发式逻辑
ld合并输出段为LOAD段的核心逻辑围绕权限兼容性、对齐要求、内存连续性三个维度展开:
- LOAD段是ELF中供加载器处理的可加载单元,仅包含有内存地址分配、需要加载或初始化的输出段。
- 当相邻的输出段满足以下条件时,ld会尝试合并为单个LOAD段:
- 内存地址连续(无间隙)
- 对齐要求可以被合并后的LOAD段满足
- 合并后的权限取所有段的权限超集(只要有一个段需要某权限,合并后的LOAD段就必须包含该权限)
- 你的两种场景差异原因:
- 用
COMMONPAGESIZE(通常4KiB)对齐时,.text(RX)、.rodata(R)、.data(RW)、.bss(RW)可以连续排列在4KiB对齐的地址上,ld合并后为了满足所有段的权限需求,只能设置为RWE(因为.text需要E,.data/.bss需要W)。 - 用2MiB大页对齐时,每个段必须起始于2MiB边界,导致段之间产生内存间隙,无法连续合并,ld只能按照各段的原生权限生成独立LOAD段(.text对应RX,.rodata对应R,.data/.bss对应RW)。
- 用
加载器对ELF段权限的依赖
在AArch64裸机场景中:
- 无论是bootloader还是MMU/MPU配置逻辑,完全依赖ELF LOAD段的
p_flags字段来设置内存访问权限。加载器会遍历每个LOAD段,根据PF_R、PF_W、PF_X标记配置页表或MPU区域,确保内存区域的权限符合程序需求。 - 若关闭MMU直接运行在物理内存,MPU的区域权限配置也会以LOAD段的权限和地址范围为依据。
错误权限的影响
LOAD段被错误赋予RWE权限会引发两类问题:
- 安全风险:违反W^X(写不可执行)的安全原则,恶意代码或错误代码可直接修改.text段的执行指令,导致代码篡改、注入等漏洞。
- 稳定性问题:程序意外修改.text/.rodata的内容后,会触发指令执行错误、数据校验失败,直接导致崩溃或不可预测的行为。
- 硬件限制:部分AArch64硬件强制要求W^X,强行设置RWE权限会导致MMU配置失败,程序无法启动。
内容的提问来源于stack exchange,提问作者josecm
相关产品推荐
相关产品推荐

