在裸机微控制器应用程序中是否需要 GCC 的 .fini 部分?

Is there any need for GCC's .fini section in a bare-metal microcontroller application?

据我所知,.fini 用于在 main return 秒后销毁静态存储持续时间对象。在典型的裸机应用程序中,main 不会 return。有什么理由不简单地从链接描述文件中删除这些符号吗?

In a typical bare-metal application, main does not return.

main() 确实可以 return 到启动代码,可以自定义在应用程序退出后执行某些操作,例如重新启动它、切断电源或开始固件更新。在这种情况下,可能需要静态析构函数。

Is there any reason not to simply remove these symbols from the linker script?

如果 main() never returns and exit() is never called,那么你当然可以删除这些符号,但是库启动会错过它们,你会必须提供一个函数来覆盖遍历 __fini_array.

的库函数

如果您正在使用 newlib,您可以使用 --enable-lite-exit 重新编译它以忽略所有 fini 内容。