GCC默认不开启-fdata-sections和-ffunction-sections?
比如example.c文件中有A()、B()、C()三个函数。
链接器都是以section为最小的链接单元,其他函数只要调用了这个section中的任何一个函数,那么整个section都会被链接进最终的二进制中。
已知MSVC会直接把这些独立的函数拆分成sections,无需任何参数。
而GCC和Clang则不一样,如果不指定-fdata-sections和-ffunction-sections,就会把example.c直接编译成一个含有三个函数的大section,造成了链接后的二进制体积膨胀。
很多软件包管理器在执行自动构建时也不指定这些参数,可能是很多编写构建脚本的人根本不懂这两个参数。我为了缩小二进制体积,不得不自己编译这些开源软件。
我曾向GNU和LLVM这两个开源组织多次发过邮件和Issues提出了此建议,可惜没人采纳我,都以嫌麻烦为理由拒绝了我。GCC和Clang的源码又太庞大,我根本不知道如何修改并提交。
比如example.c文件中有A()、B()、C()三个函数。
链接器都是以section为最小的链接单元,其他函数只要调用了这个section中的任何一个函数,那么整个section都会被链接进最终的二进制中。
已知MSVC会直接把这些独立的函数拆分成sections,无需任何参数。
而GCC和Clang则不一样,如果不指定-fdata-sections和-ffunction-sections,就会把example.c直接编译成一个含有三个函数的大section,造成了链接后的二进制体积膨胀。
很多软件包管理器在执行自动构建时也不指定这些参数,可能是很多编写构建脚本的人根本不懂这两个参数。我为了缩小二进制体积,不得不自己编译这些开源软件。
我曾向GNU和LLVM这两个开源组织多次发过邮件和Issues提出了此建议,可惜没人采纳我,都以嫌麻烦为理由拒绝了我。GCC和Clang的源码又太庞大,我根本不知道如何修改并提交。