STM32 二进制大小突然增加

STM32 sudden binary size increase

提问人:Marcell Juhász 提问时间:10/26/2022 更新时间:10/26/2022 访问量:153

问:

我目前正在尝试嵌入式 C++ 编程,我正在尝试理解 ST 提供的 C HAL,在现代 C++ 中对其进行返工,优化一些东西等。

我到了可以闪烁 LED 的地步。我当前二进制文件的大小是 1800 字节,但在此过程中,由于非常小的变化,我的二进制文件大小不止一次显着增长。重要意味着我得到了一个 6144 字节的二进制文件,而不是我的 1800 字节二进制文件,这增加了 3 倍多。我的目标当然是保持二进制大小较小。

每次发生这种情况时,我都会查看反汇编的 elf 文件,我注意到编译器包含某种堆栈展开的东西,这就是导致二进制文件大小增加的原因。在反汇编的文件中,我可以看到像 、 、 、 等符号。__gnu_unwind_get_pr_addr__gnu_Unwind_Restore_VFP_Unwind_DebugHook__gnu_Unwind_RaiseException

第一次发生这种情况时,我使用了一些阴暗的指针,所以我可以理解,因此可能会发生一些异常,然后需要这个堆栈展开的东西。上次我复制了一个函数,但忘记删除属性。尽管我发现这是导致它的原因,但我并没有真正看到问题所在,我认为如果我不实现强函数,那么弱函数将毫无问题地使用。__attribute__((weak))

问题:添加到二进制文件中的这种展开的东西到底是什么,它的目的是什么,一般来说是什么原因造成的?

我的假设是,如果我编写的代码可能会导致异常发生,那么堆栈展开是异常机制的必要组成部分,因此这就是添加此额外代码的原因。但我只是在这里猜测,很难在网上找到任何关于这个的信息。

C++ ARM STM32 堆栈展开 arm-none-eabi-gcc

评论

4赞 Nate Eldredge 10/26/2022
是的,这是针对例外情况的。你的代码是否真的使用了异常()?如果没有,请尝试编译并查看它是否消失。try/throw/catch-fno-exceptions
1赞 Tom V 10/27/2022
听起来您没有任何特定的大小要求,在这种情况下,您正在执行最糟糕的过早优化。基本上,您需要了解“保持二进制较小”和“使用现代C++”是相互矛盾的要求。如果现代 C++ 可以做一些你在 C 中不容易做的事情,那么你就是为了方便开发人员而交换二进制大小。除非你知道你的程序没有空间,否则不要与之抗争。如果你能在这个早期阶段猜到情况可能是这样,那么就用C开始吧。
1赞 Tom V 10/27/2022
@MarcellJuhász:许多嵌入式工程师的经验(包括你自己,根据你上面发布的数字)证明你错了。C++ 总是会带来更多的开销,尤其是在小型项目中。
1赞 artless noise 10/29/2022
@TomV 如果您了解工具和语言,完全可以使用C++并避免开销。这就像说你不能构建一个嵌入式的FORTH系统(或任何语言)。实际上,构建嵌入式“C”系统是不可能的。你需要汇编程序来做到这一点,而没有人真正构建一个“C”嵌入式系统。一个同样荒谬的论点。
1赞 artless noise 10/29/2022
关于这个主题,现代 C 编译器实际上包括异常表,用于“C”代码,如本问题所示

答: 暂无答案