如何将.rodata.strX.Y节强制合并为单个.rodata节?
如何将C++编译生成的.rodata相关子节合并为单一.rodata节
要解决C++编译后字符串等只读数据分散到.rodata.str1.1等子节,无法统一到.rodata的问题,可通过自定义链接脚本或链接参数重命名节两种方式实现,以下是具体操作:
方法一:自定义链接脚本(推荐)
链接脚本可以直接控制节的合并逻辑,通配所有.rodata相关子节并将其归入单一.rodata节,同时可统一配置对齐规则。
步骤:
- 导出默认链接脚本(可选)
如果需要基于系统默认链接脚本修改,先导出默认脚本:ld --verbose > default.ld - 修改.rodata节定义
在导出的脚本中找到.rodata相关的节定义,替换为以下内容(如果是从零写脚本,直接包含这段即可):
注意:保留脚本中其他节(如.text、.data、.bss等)的默认定义,确保程序正常链接。.rodata : ALIGN(16) { # 对齐大小按需设置,取所有子节的最大对齐值即可 *(.rodata) # 原有的.rodata节内容 *(.rodata.*) # 通配所有.rodata开头的子节,包括.str1.1、.str1.8、.cst4等 } - 编译时指定链接脚本
编译代码时通过-T参数指定修改后的脚本:g++ your_source.cpp -o target_binary -T modified_script.ld
方法二:链接参数重命名节
通过--rename-section参数逐个将.rodata子节重命名为.rodata,适合子节类型较少的场景。
编译命令示例:
g++ your_source.cpp -o target_binary \ -Wl,--rename-section,.rodata.str1.1=.rodata \ -Wl,--rename-section,.rodata.str1.8=.rodata \ -Wl,--rename-section,.rodata.cst4=.rodata
根据实际生成的子节类型,补充对应的--rename-section参数即可。
注意事项
- 确保
.rodata节的对齐值大于等于所有子节的对齐要求,否则链接器可能报错。可通过readelf -S target_binary查看原节的对齐信息,再设置对应的ALIGN()值。 - 部分编译器优化选项可能影响子节生成,若遇到异常,可尝试关闭相关优化(如
-fno-merge-all-constants)后再测试。
内容的提问来源于stack exchange,提问作者RedStoneMatt
相关产品推荐
相关产品推荐

