ARM64汇编声明变量并加载地址时编译报错的问题排查
ARM64 Linux内核head.S汇编编译错误排查
操作场景
在ARM64架构Linux内核的arch/arm64/kernel/head.S汇编文件中,执行了以下操作:
- 在
__INITDATA段声明变量:
__INITDATA mydata1 : .long 0x22222222
- 在
__INIT段(.init.text)的__primary_switch函数内,编写写入该变量的代码:
mov x27, #0x1406 adrp x25, mydata1 add x25, x25, :lo12:mydata1 str x27, [x25] dc cvac, x25
编译错误信息
编译过程中触发如下错误:
/tmp/ccy8ayvt.s: Error: .size expression for __primary_switch does not evaluate to a constant
错误原因与解决方式
错误的核心原因是将mydata1的变量声明代码放置在了__primary_switch函数定义的内部(SYM_FUNC_END(__primary_switch)语句之前)。
__primary_switch函数的范围由SYM_FUNC_START(__primary_switch)和SYM_FUNC_END(__primary_switch)界定,这段区域属于.init.text代码段,不允许插入数据段的变量声明。只需将__INITDATA及mydata1的声明代码移到SYM_FUNC_END(__primary_switch)之后,保证数据段与代码段的划分符合汇编器规则,即可解决该编译错误。
内容的提问来源于stack exchange,提问作者Chan Kim
相关产品推荐
相关产品推荐

