这是一些用 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
是一个弱符号。当代码运行时,代码 fromfile1
被执行。
现在我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
in file1.c
,它只是试图解析 in 中给出的表达式.set
。
有人可以准确地解释发生了什么吗?POWER_CLOCK_IRQHandler
当Default_Handler
实现在另一个文件中时,保持弱属性有效的正确解决方案是startup.s
什么?