GCC链接操作是以section作为最小的处理单元,只要一个section中的某个符号被引用,该section就会被加入到可执行程序中去。因此,GCC在编译时可以使用 -ffunction-sections 和 -fdata-sections 将每个函数或符号创建为一个sections,其中每个sections名与function或data名保持一致。而在链接阶段, -gc-sections 指示链接器去掉...
1 编译选项说明 -ffunction-sections: 这个选项告诉编译器将每个函数放在单独的一个 section(段)中,而不是将所有函数放在同一个代码段中。 好处是结合链接器选项--gc-sections使用时,可以去掉未被使用的函数,从而减小最终生成的可执行文件的大小。 -fdata-sections: 类似于-ffunction-sections,但是这个选项是针对数...
GCC链接操作是以section作为最小的处理单元,只要一个section中的某个符号被引用,该section就会被加入到可执行程序中去。因此,GCC在编译时可以使用 -ffunction-sections 和 -fdata-sections 将每个函数或符号创建为一个sections,其中每个sections名与function或data名保持一致。而在链接阶段, -gc-sections 指示链接器去掉...
1. 背景 2. so 文件格式分析 3. so 可优化内容分析 4. 优化方案介绍 4.1 精简动态符号表 4.2 ...
过大第一个原因是包含了符号表,这个可以通过strip删除,文件大小会立即缩水。strip命令提供了不同参数,方便可选择的删除。 除此之外,两个编译参数“-ffunction-sections”和“-fdata-sections”,以及链接参数“-Wl,--gc-sections”可用来删除没有使用到的符号,“-Wl..
其他选项(-Wl,--GC-sections)这是向链接器传递链接选项的选项,实际传入链接器的参数为-GC-sections,这个参数会去除没有被引用的段,以减少代码大小。但前提是编译过程中使用了-fdata-sections -ffunction-sections,否则会链接编译生成的所有段,即使没有被引用的段也会参与链接,不会起减少代码大小的作用。
使用-gc-sections可以回收不使用的代码段,从而减少代码尺寸,降低固件占用FLASH的存储空间; 在特定场景下,修改链接脚本可以实现某个函数不被链接优化,达到特定的目的。 6 更多分享 本项目的所有测试代码和编译脚本,均可以在我的github仓库01workstation中找到。
使用编译选项-Wl,--gc-sections:该选项用于告诉链接器(ld)删除未使用的函数和数据段。示例命令如下: 代码语言:bash 复制 gcc -Wl,--gc-sections main.c 需要注意的是,以上方法都是针对GCC编译器的,不同的编译器可能有不同的方法来处理未使用的函数。
CFLAGS 加上 -ffunction-sections -fdata-sections LDFLAGS 加上 --gc-sections 原理如下: -function-sections的意思是,将不同函数编译到不同的section上面。如果没有这个选项,所有的函数都会编译到一个section上面,于是函数就不能被“剥离”。 -fdata-sections同理。
因此,GCC在编译时可以使用 -ffunction-sections和 -fdata-sections 将每个函数或符号创建为一个sections,其中每个sections名与function或data名保持一致。而在链接阶段, -Wl,–gc-sections 指示链接器去掉不用的section(其中-wl, 表示后面的参数 -gc-sections 传递给链接器),这样就能减少最终的可执行程序的大小了。