Arm Gcc弱别名重新定义

我想为多个函数创建弱别名,以便可以在头文件中声明它,然后稍后在其他文件中对其进行定义。由于某些原因,我仍然从gcc收到重新定义错误。

理想情况下,对于没有实现的功能,我希望它默认返回别名。

我尝试删除别名(“ Default_Handler”),并且似乎可以编译,但是这破坏了我打算编写的该应用程序的意图。

vector_table.h

void __attribute__((noreturn))  Default_Handler (void);                                                  
void nmI_Handler(void) __attribute__((weak,alias("Default_Handler"))); 

startup.c

#include "vector_table.h"

void Default_Handler(void){                                                                                                                                
    for(;;);                                                                      
}                                                                               

void nmI_Handler(void){                                                         
    for(;;);                                                                      
}
arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -Wall -Wno-unused -Wextra -pedantic -H -g3 -gdwarf-2 -O0 -std=c90 -ffreestanding -c startup.c

startup.c:93:6: error: redefinition of 'nmI_Handler'
 void nmI_Handler(void){
      ^
In file included from startup.c:3:0:
vector_table.h:17:6: note: previous definition of 'nmI_Handler' was here
 void nmI_Handler(void) __attribute__((weak,alias("Default_Handler")));

xihaibo 回答:Arm Gcc弱别名重新定义

TL; DR:请勿将__weak____alias__放入.h文件中。将__weak____alias__放入.c文件中。

弱符号理论上是这样工作的:

  • 一个.o文件带有__weak__符号。
  • 还有另一个带有常规符号的.o文件。
  • 链接器同时看到两个符号并选择非弱符号。

.o对象文件是从.c文件生成的。 .c内的符号定义应较弱。

应用于声明的属性将应用于看到该声明的定义。在声明的标头中进行__weak__会将所有定义标记为将该符号的声明视为__weak__

alias的工作方式就像您要做的那样:

static inline void NMI_Handler(void) {
     Default_Handler();
}

它的工作原理与以前相同,但是没有分支(且键入更少)。而且无论如何,因为alias创建了符号,所以它充当了定义-它也属于.c文件。这就是导致出现多个定义错误的原因-__alias__定义了符号NMI_Handler,随后又定义了void NMI_Handler(void) {}

我想做的是这样:

// vector_table.h
void __attribute__((noreturn))  Default_Handler (void);                                                  
void NMI_Handler(void);

// startup.c     
void Default_Handler(void){                                                                                                                                
    for(;;);                                                                      
}   

__attribute__((__weak__,__alias__("NMI_Handler")))
void  NMI_Handler(void);

gcc documentation about function attributes中说明的示例用法相同。该文档指出,必须在同一交易单元中定义另一个别名的符号(读为:在同一.c文件中)。

请记住,将符号声明为弱符号并不意味着链接程序将使强符号达到峰值-当使用静态库进行编译时,有时会发生奇怪的事情。仅编译对象或使用-Wl,-start-group链接器选项。我认为infocenter.arm对此有最好的解释。

本文链接:https://www.f2er.com/3157463.html

大家都在问