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 空间,从而显著减小最终固件体积。
下面是勾选和没勾选这个选项所编译出来的文件大小
勾选了

没勾选


浙公网安备 33010602011771号