Linux下将动态库的调试信息分离

本文介绍了在Linux环境下,如何使用eu-strip工具保留动态库的调试信息。通过编译时加入-g选项,然后使用eu-strip剥离符号表并保存为单独的.debug文件,调试时根据默认路径或自定义路径加载debug文件,实现调试。此外,还提到了objcopy的另一种分离方法,但eu-strip更便捷。

    在linux下有个工具叫做strip,这是一个可以将linux下的可执行文件的符号表去除,减少每个可执行文件的大小,这对于嵌入式方面很有必要。但是没有了符号表也就意味着没有办法采用gdb进行调试,因为gdb调试是读取ELF文件头来获取符号表,进而调试,但strip之后,可执行文件的ELF文件头就没有.symtab这个符号表,有的仅是动态符号表。在strip之后nm libxxx.so是看不到符号表的,nm -D libxxx.so可以看到动态符号表,但用处不大,但strip有个参数选项叫做--only-keep-debug,这个选项可以在strip的时候保留debug调试信息,但是strip有个弊端,就是什么样的strip就处理什么样的可执行文件,x86的strip处理不了ARM平台的库。当然x86平台上肯定也有ARM的strip工具链。

      这里介绍的是一个叫做eu-strip的东西,这是一个elf工具,和readelf一样,只要是ELF文件都能处理,不分平台。下面是制作可调试的strip版本的步骤:

1.编译:既然要调试,编译就得加入-g选项,编译出so和二进制文件。

2.strip:eu-strip libxxxx.so -f libxxx.so.debug,将libxxxx.so进行strip,同时将调试信息保存在libxxxx.so.debug文件中,在调试的时候在将调试信息读取加载。

        搜索libxxx.so.debug文件的常用默认路径:1.可执行文件所在的路径;2./usr/lib/debug+可执行 文件的绝对路径。默认路径不止这两个,但这两个最常用。将debug文件放在这两个路径下面,在调试的时候,会自动加载这些debug文件。

3.调试:无论是调试进程还是程序,如debug文件的防止路径按照上面放置,可直接进行调试。但如果不是在上述默认路径:比如在/home/test/下。这个时候,debug文件的存放方式同/usr/lib/debug一致,为/home/test+可执行文件的绝对路径。但是这样不能进行直接调试,步骤如下:

     (1):启动gdb,就直接输入gdb+回车

     (2):设置默认debug文件搜索路径set debug-file-directory /home/test/。因为这种方式对当前的gdb程序有效,如gdb关了再打开,默认路径会恢复成/usr/lib/debug/,所以需重新设置,但是你可以写一个.gdbinit的脚本在启动gdb的时候,就自动设置默认路径。(当然gdb可能有自己的配置文件去修改默认路径,暂时还不清楚)

     (3):设置完毕后,可以运行程序或者attach PID进行调试。

到此整个说明结束。

      当然分离调试信息还可以用objcopy --only-keep-debug a.so a.so.debug来进行分离,分离后进行strip a.so,最后一步需要将a.so.debug的路径添加到strip之后的a.so,采用objcopy --add-gnu-debuglink=a.so.debug a.so,这样做会在a.so中添加一个gnu_debuglink这样一个段来保存debug文件的信息。这样操作的结果是一样的,但这种方法不如eu-strip一步到位来的方便。两种方法见仁见智。都不麻烦。

整个strip不影响dlopen在代码中获取符号表。整个介绍仅限于自己有限的理解,仅作为笔记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值