0%

不链接未使用代码

默认编译

默认编译环境下.c文件会编译为.o文件,当链接时会链接.o文件,整个.o文件为一个section,当此section存在无用函数时会造成控件浪费。

gcc -o main main.c x.o

可以使用命令来查看二进制可执行文件中的符号表,所有函数都链接进去:

nm -S main
readelf -S x.o

GCC链接时,按照section来链接,不论section中符号是否都使用到!

拆分默认section

-ffunction-sections (为每个function函数分配独立的section)
-fdata-sections (为每个data item数据项分配独立的section)

gcc -c -ffunction-sections -fdata-sections x.c x.o

x.o大小会明显变大,因为section大量增加。

排除不链接section -Wl,–gc-sections

-Wl,的意思是将后面的内容传递给链接器
--gc-sections是链接器参数,不链接未使用的section

gcc -Wl,--gc-sections -o main main.c x.o

可以保证代码量最优。