默认编译
默认编译环境下.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
可以保证代码量最优。