以下是使用GCC编译的一些ARM汇编代码。
来自startup.s
的片段:
.globl Default_Handler
.type Default_Handler, %function
Default_Handler:
B .
.size Default_Handler, . - Default_Handler
.macro IRQ handler
.weak \handler
.set \handler, Default_Handler
.endm
IRQ POWER_CLOCK_IRQHandler
在file1.c
void POWER_CLOCK_IRQHandler(void)
{
//Do some things...
}
在此代码中,POWER_CLOCK_IRQHandler
是一个弱符号。代码运行时,将执行file1
的代码。
现在我在另一个文件中定义Default_Handler
,并在startup.s
中注释掉它的定义。
.globl Default_Handler
.type Default_Handler, %function
//Default_Handler:
// B .
.size Default_Handler, . - Default_Handler
.macro IRQ handler
.weak \handler
.set \handler, Default_Handler
.endm
IRQ POWER_CLOCK_IRQHandler
在文件3中:
void Default_Handler(void)
{
//Do some other things
}
如果我在另一个文件中写下Default_Handler
的定义,或者我将Default_Handler
声明为弱,POWER_CLOCK_IRQHandler
将与Default_Handler
相关联。链接器错过了弱属性,并没有将其与POWER_CLOCK_IRQHandler
中的file1.c
相关联,它只是尝试解析.set
中给出的表达式。
有人可以解释究竟发生了什么吗?
当POWER_CLOCK_IRQHandler
实施位于Default_Handler
以外的其他文件中时,保持弱属性在startup.s
生效的正确解决方案是什么?