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文件或固件镜像的整体大小,方便固件的下载、存储和部署。
如何让每个字符串拥有独立地址?
完全可以实现,只需调整编译和链接参数:
- 编译阶段:添加
-fno-merge-constants参数,该参数会告知GCC编译器禁止合并相同的常量(包括字符串常量),让每个字符串都生成独立的.rodatasection。 - 链接阶段:无需额外调整,只要编译时启用了
-fno-merge-constants,链接器就不会主动合并这些独立的字符串section,每个字符串都会拥有专属的内存地址。
注意:开启该选项会直接增加固件的ROM占用量,需要根据实际硬件资源和需求场景进行权衡。
内容的提问来源于stack exchange,提问作者mastupristi
相关产品推荐
相关产品推荐

