微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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 */
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。