You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARM GNU工具链编译Cortex-M时字符串合并问题咨询

链接器字符串合并的好处与独立地址实现方案

背景说明

使用arm-gnu-toolchain-13.2.Rel1-x86_64-arm-none-eabi交叉编译Cortex-M微控制器,编译参数为-fdata-sections,链接参数为-Wl,--gc-sections -Wl,--sort-section=alignment。遇到的现象:映射文件中.rodata.saiPrintHeader.str1.4在链接松弛后体积大幅增大,其余多个.rodata.*.str1.4符号均指向同一地址0x30063839,但通过十六进制编辑器查看,所有字符串实际都合并在地址0x3004a558处。


链接器合并相同字符串的核心好处

  • 节省ROM资源:嵌入式系统的ROM空间通常十分紧张,相同字符串只保留一份实例,能有效减少固件的存储空间占用,尤其在存在大量重复字符串的场景下,效果更为显著。
  • 提升缓存效率:共享地址的相同字符串能提高CPU指令/数据缓存的命中率,减少缓存缺失带来的性能开销,让代码执行更高效。
  • 缩小镜像体积:直接降低最终生成的ELF文件或固件镜像的整体大小,方便固件的下载、存储和部署。

如何让每个字符串拥有独立地址?

完全可以实现,只需调整编译和链接参数:

  1. 编译阶段:添加-fno-merge-constants参数,该参数会告知GCC编译器禁止合并相同的常量(包括字符串常量),让每个字符串都生成独立的.rodata section。
  2. 链接阶段:无需额外调整,只要编译时启用了-fno-merge-constants,链接器就不会主动合并这些独立的字符串section,每个字符串都会拥有专属的内存地址。

注意:开启该选项会直接增加固件的ROM占用量,需要根据实际硬件资源和需求场景进行权衡。


内容的提问来源于stack exchange,提问作者mastupristi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:15:58