gpt4 book ai didi

c - GCC 8 for ARM 在 LTO 模式下正在删除中断处理程序和弱函数 - 如何防止它?

转载 作者:行者123 更新时间:2023-12-01 21:51:46 25 4
gpt4 key购买 nike

我的目标设备是基于 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)这使得生成的二进制文件崩溃。

在谷歌搜索类似问题后进行更深入的挖掘:

来自 startup_efm32gg.c 的示例代码定义了默认中断处理程序,如下所示:

void DMA_IRQHandler(void) __attribute__ ((weak, alias("Default_Handler")));
/* many other interrupts */
void Default_Handler(void) { while (1); }

同样的问题也发生在常规中断处理程序定义中(例如,没有别名且不弱)

这可能是相关的,但似乎弱符号在 LTO 模式下也会以同样的方式表现错误。

预先感谢您的任何想法!

编辑:请参阅我对标记答案的回复以获取完整的解决方案!

最佳答案

你的中断处理程序是从哪里引用的?就像未引用的静态函数和对象将从单个翻译单元中删除一样,未使用的外部函数和对象也将在 LTO 期间删除。为了防止这种情况(并且为了使您的程序在抽象模型中无论如何都有效),需要有一些引用链,从入口点开始,通向函数和对象;如果不存在,那么您实际上并没有在程序中使用它们

如果引用来自链接器脚本或 asm 源文件,则这可能是 LTO 中的错误,并且它没有看到应有的引用。在这种情况下,您也许可以对受影响的函数定义应用像 __attribute__((__used__)) 这样的 hack。或者,您可以对它们进行虚假引用,例如通过将它们的地址存储到虚拟 volatile 对象或在输入约束中使用它们的地址来清空内联 asm block 。作为另一种选择,可能有一种方法可以重做您对 asm 源文件或链接脚本所做的任何操作,以在 C 级别创建中断表,并在特殊部分中使用适当的结构/数组,以便编译器实际上可以看到引用文献,而无需伪造它们。

关于c - GCC 8 for ARM 在 LTO 模式下正在删除中断处理程序和弱函数 - 如何防止它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53997196/

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