keil中的one elf section per funtion 有啥用

Keil 中 One ELF Section per Function 到底有什么用?

要理解这个选项的作用,首先要搞清楚 .o 目标文件和 .lib 静态库在链接时的本质区别。两者都可以存放静态代码并参与链接,但从链接器的视角来看,行为差异非常明显:

  • .lib 本质上是多个 .o 文件 + 索引符号表的打包集合。
  • 在默认链接行为下,.o 是以整个文件为单位参与链接的,只要用到其中任意一个函数,整个 .o 的代码都会被全部链接进最终程序。
  • .lib按需提取的,链接器只会抽取被调用到的函数所在的目标文件,未被使用的部分不会被链接。

因此,同样一套代码,直接用 .o 链接往往会比用 .lib 链接生成的固件更大。

那么,能不能让 .o 也实现像 .lib 那样精细的链接粒度?
在 Keil 里,答案就是开启 One ELF Section per Function

勾选该选项后,Keil 在编译时会为每个函数单独分配一个 ELF Section,相当于把函数级别的符号信息拆解得更细。
这样一来,链接器就可以以单个函数为最小单位进行链接和垃圾回收,而不是以整个 .o 文件为单位。

最终效果就是:
未被调用的函数会被彻底剔除,不会占用 Flash 空间,从而显著减小最终固件体积。

下面是勾选和没勾选这个选项所编译出来的文件大小

勾选了

28a1c3b9452570c7b96ea68919837556

没勾选

3143feed30392869d1dd7149efc46eb3

posted @ 2026-04-18 18:02  小兜兜me  阅读(79)  评论(0)    收藏  举报