使用GCC -gsplit-dwarf生成的多个.dwo文件是否可合并为单个文件?
背景
我所在项目需要获取代码调试信息,目前有两种可行方案:
- 使用
-g参数编译,之后通过GNU二进制工具strip和objcopy将调试信息剥离为单独文件; - 采用
-gsplit-dwarf参数编译。
问题
第二种方案会为应用的每个编译单元生成一个.dwo文件,虽能提升链接速度,但编译单元数量庞大时会带来管理负担。请问是否有办法将所有.dwo文件按对应二进制合并为单个文件?
系统信息
- 编译器:GCC工具链
- 操作系统:CentOS/RH 7/8
解决方案
可使用GNU binutils自带的dwp(DWARF Packaging Tool)工具完成.dwo文件的合并,操作流程如下:
- 编译阶段正常添加
-gsplit-dwarf参数,生成.o目标文件和对应.dwo文件 - 完成最终二进制链接后,执行命令合并所有关联
.dwo为单个调试包:dwp [目标二进制文件路径] -o [输出合并调试文件路径].dwp
如果已明确所有.dwo文件路径,也可直接指定输入文件合并:dwp *.dwo -o [输出合并调试文件路径].dwp
合并完成后可删除零散.dwo文件,调试时GDB会自动识别同目录下与二进制同名的.dwp文件,调试体验与使用零散.dwo完全一致。
CentOS/RH 7/8系统默认binutils包已包含dwp工具,若环境中无该命令,执行yum install binutils即可安装。
内容的提问来源于stack exchange,提问作者Shady Atef
相关产品推荐
相关产品推荐

