如何从二进制文件中仅剥离指定struct结构体类型的调试信息而保留其余符号?
如何仅剥离二进制中指定结构体的调试类型信息
你之前使用strip -N没有达到预期效果,核心原因是结构体的类型信息不属于普通符号表条目,而是存储在ELF文件的DWARF调试信息段(如.debug_info、.debug_types)中,普通的strip符号移除命令不会针对DWARF内的类型条目做定向过滤。而gcc -s和strip -R属于全量移除调试信息/段的操作,自然会把所有调试信息都清空。
以下是两种可落地的实现方案:
方案1:使用LLVM工具链(推荐,操作最简)
LLVM 14及以上版本的llvm-objcopy原生支持定向移除指定类型的DWARF调试信息,操作步骤如下:
- 先验证目标结构体的调试信息存在:
llvm-dwarfdump your_binary | grep "DW_TAG_structure_type.*someStruct"
如果有输出就说明能匹配到目标类型。
2. 执行定向移除命令:
llvm-objcopy --strip-debug-type="struct someStruct" your_binary new_binary
操作完成后new_binary就是移除了struct someStruct类型信息、其他调试信息完整的目标文件。
方案2:GNU工具链下的操作方案
如果你只能使用GNU工具链,需要通过导出-修改-回写调试信息的方式实现:
- 导出全部调试信息到文本文件:
dwarfdump your_binary > debug_info.txt
- 打开
debug_info.txt,定位到struct someStruct对应的DW_TAG_structure_type完整块,删除该块的全部内容。 - 移除原二进制中的调试信息段:
objcopy --remove-section=.debug_info --remove-section=.debug_types --remove-section=.debug_abbrev your_binary temp_binary
- 把修改后的调试信息回写到二进制中:
dwarfgen -i debug_info.txt -o new_binary temp_binary
验证方法:执行gdb new_binary -ex "ptype struct someStruct" -ex quit,如果输出提示找不到该类型,说明移除操作生效。
内容的提问来源于stack exchange,提问作者Intermezzo_
相关产品推荐
相关产品推荐

