为什么gd32用arm gcc和用keil编译,大小差几倍?
GD32,用keil编译才30K+,但用arm-none-eabi-gcc编译出来有100K+,为什么会差好几倍?有哪里可以优化一下,减小一下arm-none-eabi-gcc编译的bin文件大小?GD32使用Keil编译后代码体积为30K+,而使用arm-none-eabi-gcc编译后体积达到100K+,这种显著差异主要源于库文件差异、优化策略不同、调试信息残留及内存对齐差异 Keil:使用专为单片机优化的Microlib库,砍掉了C标准库中单片机开发不常用的功能,体积较小。GCC:默认使用Newlib库,功能更全面但体积较大。虽然GCC也有适合单片机的Newlib-nano库,但需手动配置。 优化策略不同,eil:编译器优化策略更贴近芯片特性,生成的代码更紧凑。GCC:虽然开源免费,但优化策略可能不如Keil精细,导致代码体积较大。 调试信息残留,GCC编译时可能包含调试信息(如.debug_info、.debug_abbrev等段),这些信息不会写入单片机,但会增加ELF文件大小。若未正确配置编译选项,可能导致最终二进制文件体积膨胀。 不同编译器对结构体、变量的内存对齐方式可能不同,导致内存占用差异。例如,GCC和IAR在处理结构体内存对齐时的方法就存在差异。 在编译选项中添加-specs=nano.specs,并链接libc_nano.a和libm_nano.a库。 效果:显著减少代码体积,适用于资源受限的单片机。 使用-Os(优化代码大小)而非-O0(无优化)或-O2(平衡优化)。某些项目在使用-Os时可能出现运行问题,需结合代码调试。 在编译选项中添加-g0(禁用调试信息)或-s(移除符号表)。减少ELF文件大小,对最终二进制文件体积无直接影响,但可避免中间文件膨胀。 使用__attribute__((packed))取消结构体优化对齐,或手动调整变量顺序以减少内存碎片。 库函数实现差异吧 启用-Os + -flto ,代码体积减少30%~50%。 GCC默认生成DWARF格式调试信息,即使未启用调试选项,也可能保留部分符号表,增加二进制体积。 用newlib-nano 链接时裁剪未使用段 替换高开销库函数,减少动态调用开销。 不同的编译器可能有不同的默认优化级别。 优化等级不一样吧 应该是代码编译的优化等级不一样导致的吧
页:
[1]
2