[英]STM32 linkerscript initialization sections, are they needed when using C?
据我所知,STM32CubeIDE链接器脚本中的.init、.preinit_array、.init_array、.finit、.fini_array ...等部分在C++中用于调用static对象的构造函数之前需要执行析构函数的fini版本)。
我的假设是这些部分由编译器和 C/C++ 运行时库隐式调用的函数使用,但是如果您的固件是用 C 编写的,那么真的需要所有这些部分吗? 编译器在幕后做了什么?
在 C++ 中用于调用需要在 main 之前执行的 static 对象的构造函数(以及析构函数的 fini 版本)。
这不是100%的真理。 cubeIDE 使用基于 gcc 的 ARM 工具链,它有一些扩展,可能会使用其中一些部分。 例如,您可以使用 use 属性来创建将在main
之前执行和/或在main
function 返回之后调用的函数。
void __attribute__((constructor)) called_before_main(void)
{
/* some code */
}
void __attribute__((destructor)) called_after_main(void)
{
/* some code */
}
如果您甚至不使用其中任何一个,外部库也可能会使用它们。 即使您不使用外部库,保留这些部分也不会受到伤害,因为如果它们为空,它们将被丢弃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.