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

如何配合使用strip与split-dwarf剥离可执行文件冗余信息并保留调试兼容性

使用gcc --gsplit-dwarf分离调试信息的正确剥离方案

常见疑问解答

  • 为什么符号表没有存在dwo文件中?
    --gsplit-dwarf拆分的仅为DWARF格式的调试元数据(包括行号信息、变量类型定义、函数调试信息等),而ELF格式自带的全局符号表(.symtab段)不属于DWARF调试信息范畴,默认会保留在主目标文件和最终可执行文件中,不属于split-dwarf的拆分范围。

可行剥离方案

你不需要使用传统的objcopy多步流程,只要调整strip的参数,明确保留split-dwarf所需的最小索引段即可,操作步骤如下:

  1. 按原有流程完成编译链接:
// 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
  1. 执行带参数的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 11:30:06