在嵌入式cpp中重新定义弱函数的问题



问题:我在"startup.cpp";这两者也是在同一文件中定义的一个称为Default_Handler的函数的别名。尽管我正确地构建了Default_Handler函数的原型,但我还是得到了一个未定义的符号错误。

void Default_Handler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
void Default_Handler(void)
{
while(1);
}

错误日志:

error: 'void EXTI0_IRQHandler()' aliased to undefined symbol 'Default_Handler'
21 | __attribute__((weak, alias("Default_Handler")))void EXTI0_IRQHandler(void);
error: 'void EXTI15_10_IRQHandler()' aliased to undefined symbol 'Default_Handler'
22 | __attribute__((weak, alias("Default_Handler")))void EXTI15_10_IRQHandler(void);

这个错误对我来说没有任何意义,因为目标函数(Default_Handler(是正确定义的。

我想这与C++中的名称篡改有关,但实际上我不知道如何处理。因此,我们将非常感谢您的帮助。

我实际需要的是从另一个cpp文件覆盖void EXTI0_IRQHandler(void)void EXTI15_10_IRQHandler(void)的可能性:假设我有一个main.cpp文件,我需要在其中覆盖这些函数。如果除了使用弱属性之外还有其他方法,那也没关系。

您错过了名称篡改。

C++中的void Default_Handler(void)是对象文件(Assembler中(中的?Default_Handler@@YAXXZ。别名时应该使用损坏的名称:

void Default_Handler(void);
__attribute__((weak, alias("_Z15Default_Handlerv"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("_Z15Default_Handlerv"))) void EXTI15_10_IRQHandler(void);
void Default_Handler(void)
{
while(1);
}

或者使旧名称extern "C"

extern "C" void Default_Handler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
void Default_Handler(void)
{
while(1);
}

您可以使用-Xlinker --no-demangle链接器选项获取损坏的名称。

您不需要声明,因为别名发生在链接阶段。这也适用于:

__attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
__attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
extern "C" void Default_Handler(void)
{
while(1);
}

相关内容

  • 没有找到相关文章

最新更新