为何align指令导致LOAD段出现RWX权限?Binutils 2.39问题解析
为何链接脚本中的
. = ALIGN(4);会导致LOAD段被添加可写属性? - 核心原因是直接使用
. = ALIGN(4);没有显式指定段属性,ld会继承当前上下文的默认属性。如果这段对齐代码处于可写段(比如.data)之后,或者没有绑定到只读段的属性上下文,ld会默认给这个对齐后的内存区域标记为**可写(W)+ 可分配(A)**属性。 - 而
.rodata.align ALIGN(4):这种写法是显式创建归属.rodata家族的段:.rodata前缀会让ld自动应用只读(R)+ 可分配(A)的默认属性,再加上显式的对齐要求,整个段就不会带有可写权限。 - 再看LOAD段的权限规则:ld会把属性兼容的段合并到同一个LOAD段中,权限取所有合并段的并集。如果你的
.rodata.align段是WA属性,和旁边只读的.rodata段(RA)合并后,LOAD段必须同时满足两者的权限要求,最终就会变成RW(可读可写)甚至被误加上执行权限(也就是你看到的RWE),触发binutils 2.39新增的RWX LOAD段警告。 - 补充一点:binutils 2.39才新增这个警告,之前版本可能同样的脚本不会报错,但权限问题其实一直存在,只是现在被明确暴露出来了。
内容的提问来源于stack exchange,提问作者Ericccccccc
相关产品推荐
相关产品推荐

