弱符号属性和外部声明

时间:2014-11-19 22:04:27

标签: c gcc assembly linker weak-symbol

以下是使用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生效的正确解决方案是什么?

0 个答案:

没有答案