ARM64 GNU汇编如何将变量放置到自定义指定段中?
错误原因
GNU ARM64汇编器要求切换自定义段必须使用.section伪操作显式声明,你直接写.__mydebug不属于汇编器识别的合法伪操作,因此触发编译报错。
修复方案
- 第一步:修改汇编代码中的段切换语句,将原代码中的
.__mydebug替换为合法的段声明语法,可额外指定段属性适配调试数据的读写需求:
正确语法为.section .__mydebug, "aw",其中"aw"表示该段为可分配(Allocatable)、可写(Writable),符合调试数据段的使用场景。 - 第二步:补全全局符号声明的缺失参数,你原代码中的
.global后未指定要声明的全局符号,需改为.global myval避免后续链接阶段找不到符号。 - 第三步:可选优化,在自定义段内添加
.align 8对齐声明,和链接脚本中的ALIGN(8)规则保持一致,避免地址对齐问题。
修复后的汇编代码片段示例:
.global myval ... skip ... mov x6, #0x70 ldr x7, =myval str x6, [x7] ... skip ... .section .__mydebug, "aw" .align 8 myval: .long 0x11111111
原链接脚本的段定义逻辑无需修改,
KEEP(*(.__mydebug))规则可以正确匹配汇编中声明的.__mydebug输入段,最终将段内数据链接到SDRAM对应的.sdram地址空间。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

