STM32 linkerscript初始化部分,使用C时需要它们吗?
STM32 linkerscript initialization sections, are they needed when using C?
据我所知,STM32CubeIDE 链接描述文件中的 .init、.preinit_array、.init_array、.finit、.fini_array...等部分在 C++ 中使用用于调用需要在 main 之前执行的静态对象的构造函数(以及析构函数的 fini 版本)。
我的假设是这些部分由编译器和 C/C++ 运行时库隐式调用的函数使用,但如果您的固件是用 C 编写的,那么所有这些部分真的都需要吗?编译器在幕后做了什么?
你可以没有很多。
除了C++,其中一些可能会初始化标准库所需的东西。如果您只调用标准库中的 pure 函数并且您只有 C 或汇编代码,那么您可以尝试将它们取出。
如果您正在尝试将此作为学习练习,请将它们拿出来,看看哪些不起作用。也搜索 google,有 loads of sites 以太长的方式解释这类事情,无法在此处重现。
如果你只是想完成你的项目,那就别管他们了。它们只会增加您的程序大小的一小部分,不值得您花时间与它们抗争。
are used in C++ for calling the static objects' constructors that need
to be executed before main (and the fini versions for the
destructors).
这不是 100% 真实。 cubeIDE 使用基于 gcc 的 ARM 工具链,它有一些扩展可能会使用其中的一些部分。例如,您可以使用属性来创建将在 main
之前执行的函数 and/or 在 main
函数 return.
之后调用
void __attribute__((constructor)) called_before_main(void)
{
/* some code */
}
void __attribute__((destructor)) called_after_main(void)
{
/* some code */
}
即使您不使用其中任何一个,外部库也可能会使用它们。即使您不使用外部库,保留这些部分也无妨,因为如果它们为空,它们将被丢弃。
据我所知,STM32CubeIDE 链接描述文件中的 .init、.preinit_array、.init_array、.finit、.fini_array...等部分在 C++ 中使用用于调用需要在 main 之前执行的静态对象的构造函数(以及析构函数的 fini 版本)。
我的假设是这些部分由编译器和 C/C++ 运行时库隐式调用的函数使用,但如果您的固件是用 C 编写的,那么所有这些部分真的都需要吗?编译器在幕后做了什么?
你可以没有很多。
除了C++,其中一些可能会初始化标准库所需的东西。如果您只调用标准库中的 pure 函数并且您只有 C 或汇编代码,那么您可以尝试将它们取出。
如果您正在尝试将此作为学习练习,请将它们拿出来,看看哪些不起作用。也搜索 google,有 loads of sites 以太长的方式解释这类事情,无法在此处重现。
如果你只是想完成你的项目,那就别管他们了。它们只会增加您的程序大小的一小部分,不值得您花时间与它们抗争。
are used in C++ for calling the static objects' constructors that need to be executed before main (and the fini versions for the destructors).
这不是 100% 真实。 cubeIDE 使用基于 gcc 的 ARM 工具链,它有一些扩展可能会使用其中的一些部分。例如,您可以使用属性来创建将在 main
之前执行的函数 and/or 在 main
函数 return.
void __attribute__((constructor)) called_before_main(void)
{
/* some code */
}
void __attribute__((destructor)) called_after_main(void)
{
/* some code */
}
即使您不使用其中任何一个,外部库也可能会使用它们。即使您不使用外部库,保留这些部分也无妨,因为如果它们为空,它们将被丢弃。