使用strip, eu-strip, objcopy等剥离与导回符号表及调试信息-程序员宅基地

技术标签: linux  调试器  # 编译、链接、调试、gdb  gcc/gdb编译调试  

1.符号表信息和调试信息

符号表信息(symbols)和调试信息(debug info)是由不同段区分的。
使用 readelf -S binfile 可以查看ELF文件的所有段。

调试信息相关的段:

# readelf -S a.out | grep debug
  [27] .debug_aranges    PROGBITS         0000000000000000  000016d0
  [28] .debug_info       PROGBITS         0000000000000000  00001700
  [29] .debug_abbrev     PROGBITS         0000000000000000  00001a0f
  [30] .debug_line       PROGBITS         0000000000000000  00001adb
  [31] .debug_str        PROGBITS         0000000000000000  00001bd2

符号表相关的段:

# readelf -S a.out | grep tab
  [32] .symtab           SYMTAB           0000000000000000  00001e18
  [33] .strtab           STRTAB           0000000000000000  00002670
  [34] .shstrtab         STRTAB           0000000000000000  00002a8f

注: 下文中提及的符号表相关段将不包括 .shstrtab 段,因其不会被strip或eu-strip移除。

RedHat的system libraries仍保留symbols;这使得它的库文件稍大,但调试方便;
Debian的system libraries不保留symbols,而是将symbols和调试信息都保存在.debug文件中; 这样, 系统库更小,但调试时需要拥有这些.debug文件。

2. strip命令

strip <option[s]> <in-file[s]>

常用选项如下:

-s --strip-all
    Remove all symbol and relocation information
    注: 删除其他符号表段和调试信息段,但不删除 .shstrtab 段
    
-g -S -d --strip-debug
    Remove all debugging symbols & sections
    这几个选项的功能是一样,即移除上述5个".debug_"开头的调试信息段,仍会保留符号表
    
--only-keep-debug
    Strip everything but the debug information
    注:段的总数量没有减少,但文件大小减少了;对比了"readelf -S"输出中的"offset"段,发现其中前面若干段的offset都没有变化,即size为0了。
    
-R --remove-section=<name>
    Also remove section <name> from the output
    移除指定段,比如 
    strip --remove-section=.symtab a.out
    strip --remove-section=.strtab a.out

不输入任何选项的默认行为是"-s",即"–strip-all".

3. eu-strip 命令

功能: 可将符号表和调试信息都导入指定文件中,以减小原二进制文件的大小。
至于如何将导出的文件告知gdb,请参见下面的第5节"objcopy命令"

使用举例:

eu-strip a.out -f a.debug

以上命令将a.out中的符号表段和调试信息段都移出到 a.debug 文件中。这样,a.out的size会减小很多。
而此时,a.out 中会多一个 .gnu_debuglink 段,它是用来保存符号表位置的。
之后,再用gdb去打开并运行 a.out 时,gdb还可以找到 a.debug 这样的符号表及调试信息文件。

另注: CentOS安装eu-strip

yum install elfutils

4. gdb 寻找符号表和调试信息文件

用 gdb 查看 coredump 的时候,或者用 gdb 去运行上述被剥离了符号表和调试信息的二进制文件时,gdb会去自动搜索符号表。
gdb 会去查找当前目录、gdb默认的搜索路径 /usr/lib/debug 、 以及 /usr/lib/debug 下的子路径。具体顺序和具体子路径,请参阅参考文档。

(gdb) show debug-file-directory 
The directory where separate debug symbols are searched for is "/usr/lib/debug".

如果符号表文件既不在当前目录,也不在 /usr/lib/debug, 那么可以使用 命令告诉gdb去哪里找到符号表,如下:

(gdb) symbol-file /root/test.sym
(gdb) bt 

5. objcopy 命令移除和添加符号表及调试信息

  1. 删除指定的section
    objcopy -R .comment -R .note.ABI-tag
  1. 移除和添加符号表及调试信息
    gcc -g -o test test.c
    
    # test.debug 将包含调试信息和符号表; 而test将只包含调试信息
    objcopy --only-keep-debug test test.debug
    
    # 从test文件里剥离debug段
    objcopy --strip-debug test
    
    # 更彻底地,上面这句可以换成下面这句以移除所有的debug信息和符号表
    strip -s test 
    
    # 在二进制文件 test 中添加 .gnu_debuglink 段以指向符号表和调试信息文件
    objcopy --add-gnu-debuglink=test.debug test
    
    # objdump 命令可以查看指定的section
    objdump -s -j .gnu_debuglink test 

6. 使用链接器ld去除符号表

动态链接库是ELF(Executable and Linkable Format)文件的一种,其中包含了2个符号表:

  • .symtab 包含大量的信息(包括全局符号global symbols)
  • .dynsym 只保留.symtab中的全局符号
    .dynsym 是 .symtab 的子集;strip命令会去掉ELF文件中.symtab,但不会去掉.dynsym

使用ld 的 -s 和 -S 选项可以在链接的时候去除符号表。-s去除所有符号表信息;-S去除调试符号信息。

-s
--strip-all
    Omit all symbol information from the output file.

-S
--strip-debug
    Omit debugger symbol information (but not all symbols) from the output file.

7. gcc 静态编译

# 让可执行文件没有.dynsym动态链接表;在支持动态链接的系统上,阻止连接共享库。该选项在其它系统上无效。
gcc -static

# 让可执行文件没有.dynstr动态链接字符表;不连接系统标准启动文件和标准库文件,只把指定的文件传递给连接器。
gcc -nostdlib

参考文献

  • https://www.technovelty.org/code/split-debugging-info-symbols.html
  • https://www.technovelty.org/code/separate-debug-info.html
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/nirendao/article/details/104107608

智能推荐

可狱可囚的爬虫系列课程 07:BeautifulSoup4(bs4)库的使用_beautifulsoup4库 获取br-程序员宅基地

文章浏览阅读1.5k次,点赞21次,收藏18次。BeautifulSoup4 属于 BeautifulSoup 系列的第四代版本,BeautifulSoup 是一个可以从 HTML 或 XML 文件中提取数据的 Python 库,这个库能够实现树文档的导航、查找,从而帮助我们提取到网页中所需要的数据。。如果忘记了在哪里安装,请回看 Requests 模块第一篇文章。安装好以后,我们围绕数据提取这个话题对 BeautifulSoup4 进行剖析。"""# 问题一:使用标签选择器获取源代码中所有的 p 标签。_beautifulsoup4库 获取br

rpm包及作用_cannot install both libpng-2:1.5.13-8.el7.x86_64 a-程序员宅基地

文章浏览阅读1.9k次。基于Red Hat Enterprise Linux Server release 7.4 (Maipo)最小化安装将会慢慢补齐每个包的作用:1 bash-completion-2.1-6.el7.noarch https://cbs.centos.org/koji/rpminfo?rpmID=4260 2 grubby-8.28-23.el7.x86_64 ..._cannot install both libpng-2:1.5.13-8.el7.x86_64 and libpng-2:1.6.37-1.ky10.

vxworks的RTP学习_vxworks rtp-程序员宅基地

文章浏览阅读2.1k次。这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Ma..._vxworks rtp

用户层与驱动通信-程序员宅基地

文章浏览阅读185次。以进行加法和减法为例,用户层将要进行的操作码和参数,返回缓冲发给驱动,驱动进行处理并将结果写到返回缓冲中driver.c//_stdcall#include<ntddk.h>#include<ntstrsafe.h>#pragma code_seg("INT")#define SynLinkName L"\\??\\freesec_tx..._pirpstack->majorfunction

Android Framework 分析-程序员宅基地

文章浏览阅读91次。http://raymond1860.spaces.live.com/Blog/cns!BF47B6FD104579C9!797.entry1.目录树/framework/base/api/framework/base/awt/framework/base/build/framework/base/camera关 于camera的HAL接口库。最终生成native共享库l..._android framework cmds 开发

springboot+mysql互联网互联网美食分享平台源码53102-程序员宅基地

文章浏览阅读82次。免费领取项目源码,请关注●点赞收藏并私信博主,谢谢-、互联网美食分享平台采用Java技术,Mysql数据库存储数据,基于Springboot框架开发。系统采用了模块化设计方法,根据用户的需求开发功能模块,方便了程序扩展维护,以便后期的更新。整个开发过程首先对系统进行需求分析,得出系统主要功能模块。接着对系统进行总体设计和详细设计。最后对系统进行了功能测试,并对测试结果进行了分析总结,得出系统的不足及需要改进的地方,为以后的系统维护提供了方便,同时也为以后开发类似系统提供了借鉴和帮助。

随便推点

E - Mafia CodeForces - 348A 【二分】_348a二分-程序员宅基地

文章浏览阅读317次。E - Mafia CodeForces - 348A 【二分】One day n friends gathered together to play “Mafia”. During each round of the game some player must be the supervisor and other n - 1 people take part in the game. Fo..._348a二分

四元数和旋转矩阵_四元数 旋转矩阵-程序员宅基地

文章浏览阅读1.6w次。四元数和旋转矩阵Quaternion(四元数)Quaternion 的定义四元数一般定义如下: q=w+xi+yj+zk其中 w,x,y,z是实数。同时,有: i*i=-1 j*j=-1 k*k=-1四元数也可以表示为: q=[w,v]其中v=(x,y,z)是矢量,w是标量,虽然v是矢量,但不能简_四元数 旋转矩阵

WebComponents.exe未安装的解决办法-程序员宅基地

文章浏览阅读5.8w次,点赞6次,收藏3次。很多人在使用海康威视的开发包的时候,都会遇到下面几个问题在安装WebComponents.exe之后 浏览器在运行的时候提示WebComponents.exe为安装 或者是WebComponents.exe不是最新版本开发包提供的版本如下,浏览器自动安装的版本为3.0.5.34这2个版本都是是可以使用的 ,而且不需要更新那么问题就在浏览器了_webcomponents.exe

集成测试与系统测试_集成测试是系统测试吗-程序员宅基地

文章浏览阅读1.4w次,点赞5次,收藏42次。 集成测试与系统测试_集成测试是系统测试吗

Jenkins中文官网地址_jenkins官网-程序员宅基地

文章浏览阅读792次,点赞9次,收藏8次。Jenkins 是一个开源自动化服务器。Jenkins 用户手册。_jenkins官网

nginx 网页匹配跳转(rewrite、location)_nginx location直接指向某个网页-程序员宅基地

文章浏览阅读1.7k次,点赞29次,收藏23次。location,rewrite基于:域名、客户端ip、旧域名、参数匹配,跳转_nginx location直接指向某个网页

推荐文章

热门文章

相关标签