我的目标设备是基于 EFM32 Cortex-M3 的设备。我的工具链是官方的 ARM GNU 工具链 gcc-arm-none-eabi-8-2018-q4-major。
没有 LTO 一切正常,但要使 LTO 工作,我必须用 . 标记所有中断处理程序代码-fno-lto
。我想摆脱这种解决方法。
问题是,每个中断处理程序都从最终的二进制文件中删除。(我正在检查arm-none-eabi-nm --print-size --size-sort --radix=d -C -n file.out
)这会导致二进制崩溃。
深入挖掘并在谷歌搜索类似问题后:
- 我尝试将诸如
__attribute__((used))
,之类的功能标记为__attribute((interrupt))
无济于事 - 尽管有这些属性,中断处理程序仍被删除。(相关防止 GCC LTO 删除功能) - 发现可能相关的讨论https://bugs.launchpad.net/gcc-arm-embedded/+bug/1747966 - 没有发布解决方案
来自定义默认中断处理程序的示例代码startup_efm32gg.c
如下:
void DMA_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler")));
/* many other interrupts */
void Default_Handler(void) { while (1); }
常规中断处理程序定义也会发生同样的问题(例如,没有别名且不弱)
这可能是相关的,但似乎弱符号在 LTO 模式下以同样的方式行为不端。
提前感谢您的任何想法!
编辑:查看我对标记答案的回复以获得完整的解决方案!