gpt4 book ai didi

c - Arm Gcc 弱别名重新定义

转载 作者:太空宇宙 更新时间:2023-11-04 03:08:45 26 4
gpt4 key购买 nike

我想为几个函数创建弱别名,这样我就可以在头文件中声明它,然后在不同的文件中定义它。出于某种原因,我仍然从 gcc 收到重新定义错误。

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

我已经尝试删除别名(“Default_Handler”),它似乎可以编译,但它有点破坏了我尝试编写这个应用程序的意图。

vector 表.h

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

启动.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")));

最佳答案

TL;DR:不要将 __weak____alias__ 放入 .h 文件中。将 __weak____alias__ 放在 .c 文件中。

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

  • 有一个带有__weak__符号的.o文件。
  • 还有一个带有普通符号的.o文件。
  • 链接器看到两个符号并选择非弱符号。

.o 目标文件是从.c 文件生成的。 .c里面的符号定义应该是弱的。

应用于声明的属性应用于看到它的定义。在声明的 header 中执行 __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对此有最好的解释。

关于c - Arm Gcc 弱别名重新定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58716887/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com