STM32 链接脚本初始化部分,在使用 C 时是否需要它们?

问题描述

据我所知,在 STM32CubeIDE 链接脚本中找到的 .init、.preinit_array、.init_array、.finit、.fini_array... 等部分在 C++ 中用于调用需要在 main 之前执行的静态对象的构造函数(以及析构函数的fini版本)。

我的假设是这些部分由编译器和 C/C++ 运行时库隐式调用函数使用,但如果您的固件是用 C 编写的,那么所有这些部分都真的需要吗?编译器在幕后做了什么?

解决方法

没有很多人你也能活下去。

除了C++之外,其中一些可能会初始化标准库所需的东西。如果您只调用标准库中的 pure 函数,并且您只有 C 或汇编代码,那么您可以尝试将它们删除。

如果您想将此作为一种学习练习,请将它们取出来,看看哪些不起作用。同样在谷歌上搜索,有 loads of sites 以一种太长而无法在此处重现的方式解释此类事情。

如果你只是想完成你的项目,那就别管他们了。它们只会增加您的程序大小的一小部分,不值得您花时间与它们抗争。

,

在 C++ 中用于调用需要的静态对象的构造函数 在 main (以及用于 析构函数)。

这不是 100% 真实。 cubeIDE 使用基于 gcc 的 ARM 工具链,它有一些扩展,可能会使用其中的一些部分。例如,您可以使用属性来创建将在 main 之前执行和/或在 main 函数返回之后调用的函数。

void __attribute__((constructor)) called_before_main(void)
{
   /* some code */
}

void __attribute__((destructor)) called_after_main(void)
{
   /* some code */
}

如果您甚至不使用其中任何一个,外部库可能会使用它们。即使您不使用外部库,保留这些部分也无妨,因为如果它们为空,它们将被丢弃。