c++ 嵌入式cpp中弱函数重定义问题

7nbnzgx9  于 2023-06-25  发布在  其他
关注(0)|答案(1)|浏览(208)

问题:我在“startup.cpp”中定义了两个弱函数,它们都是同一个文件中定义的一个函数Default_Handler的别名。即使我正确地对Default_Handler函数进行了原型化,我还是得到了一个未定义的符号错误。

  1. void Default_Handler(void);
  2. __attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
  3. __attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
  4. void Default_Handler(void)
  5. {
  6. while(1);
  7. }

错误日志:

  1. error: 'void EXTI0_IRQHandler()' aliased to undefined symbol 'Default_Handler'
  2. 21 | __attribute__((weak, alias("Default_Handler")))void EXTI0_IRQHandler(void);
  3. error: 'void EXTI15_10_IRQHandler()' aliased to undefined symbol 'Default_Handler'
  4. 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文件,我需要在其中覆盖这些函数。如果除了使用弱属性之外还有其他方法,那就好了。

pengsaosao

pengsaosao1#

你错过了名字的混乱。
C++中的void Default_Handler(void)是对象文件中的?Default_Handler@@YAXXZ(在汇编程序中)。别名时,应使用损坏的名称:

  1. void Default_Handler(void);
  2. __attribute__((weak, alias("_Z15Default_Handlerv"))) void EXTI0_IRQHandler(void);
  3. __attribute__((weak, alias("_Z15Default_Handlerv"))) void EXTI15_10_IRQHandler(void);
  4. void Default_Handler(void)
  5. {
  6. while(1);
  7. }

或将旧名称设为extern "C"

  1. extern "C" void Default_Handler(void);
  2. __attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
  3. __attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
  4. void Default_Handler(void)
  5. {
  6. while(1);
  7. }

您可以使用-Xlinker --no-demangle链接器选项获得损坏的名称。
您不需要声明,因为别名发生在链接阶段。这也适用于:

  1. __attribute__((weak, alias("Default_Handler"))) void EXTI0_IRQHandler(void);
  2. __attribute__((weak, alias("Default_Handler"))) void EXTI15_10_IRQHandler(void);
  3. extern "C" void Default_Handler(void)
  4. {
  5. while(1);
  6. }
展开查看全部

相关问题