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

arm-none-eabi-as段对齐规则解析及强制取消填充方法咨询

ARM-none-eabi-as 段对齐机制解析

实验背景

我针对arm-none-eabi-as的段对齐机制做了两组实验:

实验1:仅含数据的.text段

源代码:

; source.s
.text
.byte 0xff
.byte 0xff
.byte 0xff

编译命令:

arm-none-eabi-as -mthumb -o source.o source.s

通过arm-none-eabi-readelf -S source.o查看结果:.text段为字节对齐(Al=1),总大小3字节。

实验2:包含nop指令的.text段

修改后的源代码:

; source.s
.text
.byte 0xff
nop
.byte 0xff
.byte 0xff

再次查看目标文件:.text段的对齐要求变为半字对齐(Al=2)。

疑问

  • .data段不会自动调整对齐(符合预期),但.text段只有在出现指令时才会改变对齐方式;
  • nop指令本身处于非对齐地址,但汇编器既不报错,却主动提升了段的对齐级别;

解答

汇编器调整段对齐的逻辑

arm-none-eabi-as的对齐规则是基于段内内容的类型自动适配的:

  1. 当.text段仅包含纯数据(比如.byte/.word这类伪指令生成的数据)时,汇编器认为该段不需要满足指令执行的对齐要求,因此使用最低的字节对齐(Al=1);
  2. 一旦.text段中出现Thumb/ARM指令(比如nop),汇编器会自动将段的对齐要求提升到当前指令集的最小标准——Thumb指令要求半字(2字节)对齐,ARM指令要求字(4字节)对齐。这是遵循ARM架构的基本规范:指令必须在对应对齐边界上执行(部分处理器支持非对齐指令访问,但属于特殊配置,汇编器默认按标准行为处理);
  3. 注意:汇编器只会调整段的对齐要求(告诉链接器后续要把这段放到对应对齐的地址),但不会主动填充数据去修正现有指令的非对齐问题——除非你显式用.align这类伪指令要求填充。

强制.text段保持低对齐的方法

如果要强制.text段即使包含指令也不提升对齐级别,有两种可靠方式:

  1. 用.balign伪指令强制指定对齐字节数:在.text段开头添加.balign 1,直接强制1字节对齐,示例:
; source.s
.text
.balign 1  ; 强制字节对齐,忽略指令带来的对齐要求
.byte 0xff
nop
.byte 0xff
.byte 0xff

编译后,.text段的对齐级别会保持为1,但要注意:这种情况下nop指令处于非对齐地址,运行时可能触发处理器的非对齐访问异常(取决于处理器的配置),仅适用于特殊场景。
2. 用.align伪指令指定对齐指数:.align 0也可以实现字节对齐(因为.align n表示对齐到2n字节边界,0对应20=1字节),效果和.balign 1一致。

内容的提问来源于stack exchange,提问作者Alexandru N. Onea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 14:02:46