为二进制文件添加.gnu_debugdata调试信息
创始人
2025-01-08 07:32:40
0次

前言

在使用gcc/g++编译二进制文件过程中,如果添加了-g参数,编译出来的二进制文件会带有debug信息,供调试使用。但是debug信息往往占用空间很大,导致二进制文件太大,在发布到生产环境时,一般会去掉调试信息,以减小二进制文件大小。如此一来,在出现问题后就无法直接使用gdb调试工具进行调试了。一种可行的做法是版本发布时保留debug信息,出现问题后使用debug信息进行问题分析调试,但这种做法相对比较麻烦。mini debuginfo的技术提供了一种有效的解决思路。

mini debuginfo的思路是在二进制ELF文件中添加一个section(.gnu_debugdata),section中仅保留最少的调试信息(如:只保留可调试的函数符号),并对调试进行进行压缩,以尽可能地减少调试信息大小。

下面以一个实际例子说明如何给二进制文件添加该类型的section。

实例

我们以一个简单的例子开始,以下是该例子的代码:

#include  int a; void func1() {         a = 1; }  void func2() {         int test;         a = 2;         test = a; }  int main() {         func1();         func2();         printf("a is %d\n", a);         return 0; } 

编译二进制文件

使用gcc命令将代码编译成二进制可执行文件:

gcc -g -o test_mini_debug test_mini_debug.c

保存要保留的符号信息

然后使用nm命令查看该二进制文件中的符号信息,其中--defined-only参数指定只关注定义的信息:

nm --defined-only test_mini_debug

二进制文件中有很多符号,我们调试时关心的主要是函数和变量信息,函数位于ELF二进制文件的.TEXT段中,即上图中第二列为T/t的符号;变量分全局变量和局部变量,全局变量位于.BSS段(未初始化的全局变量)或.DATA段(初始化的全局变量)中,即上图中第二列为B/b,D/d的符号,局部变量一般保存在寄存器或栈中,此处看不到。

我们将函数和全局变量保存到一个文件中,后续会使用到,命令如下:

nm --defined-only test_mini_debug |awk '{ if($2 == "T" || $2 == "t" || $2 == "B" || $2 == "b" || $2 == "D" || $2 == "d") print $3 }' > test_mini_debug.syms

生成mini debuginfo信息

在上一步中保存了我们要保留的符号信息,接下来就可以根据这些信息生成minidebug信息了。首先使用objcopy命令将上面的二进制文件的debug信息剥离出来:

objcopy --only-keep-debug test_mini_debug test_mini_debug.debug

然后,对debug信息进行瘦身,只保留我们关注的函数和全局变量信息:

objcopy -S --keep-symbols=test_mini_debug.syms test_mini_debug.debug test_mini_debug.mini_debuginfo

接着,使用xz命令对debug信息进行压缩,进一步减小debug信息大小:

xz test_mini_debug.mini_debuginfo

经过以上一番操作,debug信息从原来的6K减少到了1K左右:

对二进制文件进行瘦身

在上面的步骤中,我们将debug信息从二进制文件中剥离了出来,但是原来的二进制文件还存在debug信息,如下图,使用readelf查看,这些debug信息(以.debug开头的段)还在二进制文件中:

readelf -S test_mini_debug

要先将该部分信息删除,直接使用objcopy -S命令即可。

objcopy -S test_mini_debug

再次使用readelf命令查看,已经没有debug信息了:

将mini debuginfo添加到二进制文件中

最后一步,将我们之前生成的mini debuginfo信息添加到二进制文件中,命令如下:

objcopy --add-section .gnu_debugdata=test_mini_debug.mini_debuginfo.xz test_mini_debug

使用readelf命令查看,二进制文件中已经有.gnu_debugdata段了:

验证

使用gdb命令调试该二进制文件,可以看到,已能够识别函数和全局变量了。

相关内容

热门资讯

实操分享开挂脚本!德扑圈多功能... 实操分享开挂脚本!德扑圈多功能开挂脚本,德扑圈好像存在有开挂脚本1、打开软件启动之后找到中间准星的标...
如何分辨真伪透视器工具!WeP... 如何分辨真伪透视器工具!WePoKer多功能透视器工具,WePoKer切实是真的有透视器工具1、下载...
一分钟揭秘作弊器脚本!红龙po... 一分钟揭秘作弊器脚本!红龙poker多功能作弊器脚本,红龙poker一直真的是有作弊器脚本1、实时红...
一起来讨论作弊器脚本!德扑之星... 一起来讨论作弊器脚本!德扑之星多功能作弊器脚本,德扑之星本来有作弊器脚本德扑之星破解侠是真的助透视。...
免费测试版外挂软件!WPK多功... 免费测试版外挂软件!WPK多功能外挂软件,WPK好像有外挂软件1、金币登录送、破产送、升级送、活动送...
分享开挂内幕作弊器插件!德普之... 分享开挂内幕作弊器插件!德普之星多功能作弊器插件,德普之星一直真的是有作弊器插件1、德普之星公共底牌...
总算了解开挂教程!德扑之星多功... 总算了解开挂教程!德扑之星多功能开挂教程,德扑之星确实存在有开挂教程1、超多福利:超高返利,海量正版...
实测揭晓辅助技巧!智星德州扑克... 实测揭晓辅助技巧!智星德州扑克多功能辅助技巧,智星德州扑克本来真的有辅助技巧1、智星德州扑克模拟器是...
玩家必看科普辅助教程!wpk多... 玩家必看科普辅助教程!wpk多功能辅助教程,wpk都是是真的有辅助教程1、操作简单,无需wpk手机版...
玩家必看科普透视挂app!AA... 玩家必看科普透视挂app!AAPoKer多功能透视挂app,AAPoKer一贯真的是有透视挂appA...