为什么gd32用arm gcc和用keil编译,大小差几倍?

[复制链接]
 楼主| dda0025 发表于 2025-7-7 20:18 | 显示全部楼层 |阅读模式
GD32,用keil编译才30K+,但用arm-none-eabi-gcc编译出来有100K+,为什么会差好几倍?有哪里可以优化一下,减小一下arm-none-eabi-gcc编译的bin文件大小?

评论

之前也搭过一套环境,不过没深入研究  发表于 2025-8-19 10:43
学习一下,也用gcc编过  发表于 2025-8-19 10:42
cen9ce 发表于 2025-7-19 22:17 | 显示全部楼层
GD32使用Keil编译后代码体积为30K+,而使用arm-none-eabi-gcc编译后体积达到100K+,这种显著差异主要源于库文件差异、优化策略不同、调试信息残留及内存对齐差异
liu96jp 发表于 2025-7-20 07:17 | 显示全部楼层
Keil:使用专为单片机优化的Microlib库,砍掉了C标准库中单片机开发不常用的功能,体积较小。GCC:默认使用Newlib库,功能更全面但体积较大。虽然GCC也有适合单片机的Newlib-nano库,但需手动配置。
g0d5xs 发表于 2025-7-20 09:25 | 显示全部楼层
优化策略不同,eil:编译器优化策略更贴近芯片特性,生成的代码更紧凑。GCC:虽然开源免费,但优化策略可能不如Keil精细,导致代码体积较大。
ex7s4 发表于 2025-7-20 11:09 | 显示全部楼层
调试信息残留,GCC编译时可能包含调试信息(如.debug_info、.debug_abbrev等段),这些信息不会写入单片机,但会增加ELF文件大小。若未正确配置编译选项,可能导致最终二进制文件体积膨胀。
b5z1giu 发表于 2025-7-20 13:15 | 显示全部楼层
不同编译器对结构体、变量的内存对齐方式可能不同,导致内存占用差异。例如,GCC和IAR在处理结构体内存对齐时的方法就存在差异。
suw12q 发表于 2025-7-20 17:13 | 显示全部楼层
在编译选项中添加-specs=nano.specs,并链接libc_nano.a和libm_nano.a库。
tax2r6c 发表于 2025-7-20 21:20 | 显示全部楼层
效果:显著减少代码体积,适用于资源受限的单片机。
q1ngt12 发表于 2025-7-21 07:58 | 显示全部楼层
使用-Os(优化代码大小)而非-O0(无优化)或-O2(平衡优化)。某些项目在使用-Os时可能出现运行问题,需结合代码调试。
p0gon9y 发表于 2025-7-21 12:39 | 显示全部楼层
在编译选项中添加-g0(禁用调试信息)或-s(移除符号表)。减少ELF文件大小,对最终二进制文件体积无直接影响,但可避免中间文件膨胀。
y1n9an 发表于 2025-7-21 15:24 | 显示全部楼层
使用__attribute__((packed))取消结构体优化对齐,或手动调整变量顺序以减少内存碎片。
classroom 发表于 2025-7-23 16:39 | 显示全部楼层
库函数实现差异吧
powerantone 发表于 2025-7-23 16:41 | 显示全部楼层
启用-Os + -flto        ,代码体积减少30%~50%。
flycamelaaa 发表于 2025-7-23 17:40 | 显示全部楼层
GCC默认生成DWARF格式调试信息,即使未启用调试选项,也可能保留部分符号表,增加二进制体积。
stormwind123 发表于 2025-7-23 17:41 | 显示全部楼层
用newlib-nano
probedog 发表于 2025-7-23 20:41 | 显示全部楼层
链接时裁剪未使用段
classroom 发表于 2025-7-23 21:42 | 显示全部楼层
替换高开销库函数,减少动态调用开销。
beacherblack 发表于 2025-8-5 16:01 | 显示全部楼层
不同的编译器可能有不同的默认优化级别。
chenjun89 发表于 2025-8-6 08:21 来自手机 | 显示全部楼层
优化等级不一样吧
chenqianqian 发表于 2025-8-6 08:44 来自手机 | 显示全部楼层
应该是代码编译的优化等级不一样导致的吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

5

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部