You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GCC工具链中_init()和_fini()的作用是什么?裸机ARM开发场景答疑

ARM裸机中_init()函数的作用与问题解析

1. _init()的本质作用

_init()原本是UNIX/Linux系统里给用户或系统库留的自定义初始化钩子,标准C/C++运行时会用它插入额外的全局初始化逻辑。在ARM裸机场景下,CMSIS保留这个调用逻辑,是为了兼容标准运行时的初始化流程。

2. 为什么必须手动定义?

你碰到的未定义引用错误,是因为CMSIS提供的__libc_init_array()函数里明确调用了_init(),但CMSIS本身并没有默认实现这个函数——毕竟裸机项目的自定义初始化需求千差万别,官方没法统一提供。所以链接器找不到这个符号就会报错,必须手动补一个定义。

3. 你的调用方式没毛病,只是要清楚它的定位

  • 要是你没有需要额外插入的初始化逻辑,像现在这样写个空的void _init(void) {}完全没问题,就是占个符号位满足链接要求而已。
  • 要是你有必须在全局构造函数执行前后跑的自定义代码(比如某些外设的底层初始化、全局变量的特殊赋值),就把逻辑写在_init()里就行——注意顺序:__libc_init_array()会先调用_init(),再挨个执行__init_array里的全局构造函数指针。

小补充:要不要修改默认流程?

如果觉得空函数有点别扭,也可以改init.c或者链接脚本,删掉对_init()的调用。但不建议这么做,因为会破坏CMSIS对标准运行时流程的兼容性,以后要是引入依赖标准初始化的第三方库,容易出问题。保持现在的空函数实现是最稳妥的。

内容的提问来源于stack exchange,提问作者cberk1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:57:57