如何配合使用strip与split-dwarf剥离可执行文件冗余信息并保留调试兼容性
使用gcc --gsplit-dwarf分离调试信息的正确剥离方案
常见疑问解答
- 为什么符号表没有存在dwo文件中?
--gsplit-dwarf拆分的仅为DWARF格式的调试元数据(包括行号信息、变量类型定义、函数调试信息等),而ELF格式自带的全局符号表(.symtab段)不属于DWARF调试信息范畴,默认会保留在主目标文件和最终可执行文件中,不属于split-dwarf的拆分范围。
可行剥离方案
你不需要使用传统的objcopy多步流程,只要调整strip的参数,明确保留split-dwarf所需的最小索引段即可,操作步骤如下:
- 按原有流程完成编译链接:
// app.cpp代码 #include <iostream> int main() { int a = 1; std::cout << "Split DWARF test" << std::endl; return 0; }
编译命令:
g++ -c -gsplit-dwarf app.cpp -o app_dwarf.o
链接命令:
g++ app_dwarf.o -o app_dwarf -fuse-ld=gold -Wl,--gdb-index
- 执行带参数的strip操作,仅删除冗余内容,保留dwo关联所需的段:
strip --strip-all \ --keep-section=.debug_info \ --keep-section=.debug_abbrev \ --keep-section=.debug_str \ --keep-section=.debug_addr \ --keep-section=.gnu_index \ app_dwarf
处理完成后可执行文件体积会大幅降低,同时GDB仍可以正常关联.dwo文件完成调试。
可选优化:打包零散dwo文件
如果你的项目有大量编译单元,会生成很多零散的.dwo文件,可以使用gcc自带的dwp工具将所有dwo打包成一个单独的调试包方便留存:
dwp *.dwo -o app_dwarf.dwp
后续调试时只要将dwp文件和可执行文件放在同一目录,GDB就可以自动识别加载调试信息。
内容的提问来源于stack exchange,提问作者ryeager
相关产品推荐
相关产品推荐

