前言

GNU binutils工具提供了一系列二进制工具,用于日常开发过程中对程序调试和维护,经常会用到的工具如下:

  • as:汇编编译器,用于将汇编代码编译成目标文件;
  • addr2line:用于得到程序指令地址所对应的函数,以及函数所在的源文件名和行号信息;
  • ar:用于创建和修改档案文件,以及从档案文件中抽取文件,典型的档案文件如静态库(.a文件);
  • ld:链接器,用于目标文件或库的链接;
  • nm:用于列出程序文件中的符号信息;
  • objcopy:可用于从程序文件中拷贝指定段;
  • objdump:能显示程序文件的相关信息,同时可支持对程序文件进行反汇编;
  • ranlib:用于生成一个档案文件的内容索引,以加快对档案文件的查找速度;
  • size:用于查询程序文件中各个段的大小;
  • strings:用于查看程序文件内的可显示字符串;
  • strip:用于剥去程序文件的调试信息,以减少程序文件所占用的存储空间;
  • readelf:用于查询ELF格式程序文件的段、节等信息.

下文会简单描述上述部分工具的基本用法,更为详细的使用方法建议查看对应工具的man和info信息。

addr2line

addr2line可根据程序指令地址查找到所对应的函数名、以及函数所在的源文件名和行号。当含有调试信息的执行程序出现crash时,可使用addr2line快速定位出错代码的位置。其基本使用格式如下:

addr2line <程序运行地址> -e <可执行文件路径>

nm

nm工具用于列出程序文件中的符号信息。以一个简单的hello world程序为例:

shell # nm helloworld
0000000100002008 d __dyld_private
0000000100000000 T __mh_execute_header
0000000100000f60 T _mainU _printfU dyld_stub_binder

nm所列出的每一行信息由三部分组成:

  • 第一列表示程序运行时符号在内存中的地址。对于程序中未定义的符号,因为不清楚运行地址,因此显示为空;
  • 第二列表示相应的符号所在的段,每个字符有着特定的含义;
  • 第三列则是符号的名称。

对于第二列中的字符含义如下表所示:

字符 含义
A 表示符号所对应的值是绝对的,并且在后续的链接过程中也不会改变
B或b 表示符号位于未初始化的数据段(.bss段)中,该段用于包含初始化为0或未初始化的数据
C 表示未被初始化的公共符号
D或d 表示符号位于初始化的数据段(.data段)中
N 表示符号是调试用的
R或r 表示符号位于只读数据段(.rdata)中
T或t 表示符号位于代码段(.text段)中
U 表示符号未被定义

nm常用选项

通常程序中包含的符号种类比脚繁杂,可以定制选项显示需要查看的符号信息,一些常用的选项如下:

  • -g或–extern-only:仅显示全局符号;
  • -u或–undefined-only:仅显示未定义的符号;
  • –defined-only:仅显示已定义的符号;
  • -l或–line-numbers:借助调试信息查找每个符号所在文件名及对应行号。

objcopy

objcopy可以实现拷贝目标文件中特定的段,并且支持格式转化。objcopy支持的选项很多,比较常见的用法是创建二进制bin文件活着剥离目标文件中的调试信息。

使用objcopy生成纯二进制文件

在嵌入式开发中,经常需要向开发板rom中烧录引导程序,此时就可以使用objcopy从编译好的目标文件中将二进制执行代码拷贝出来。

objcopy -O binary boot.elf boot.bin

使用objcopy生成单独的调试信息文件

一般在程序发布时,是不会携带调试信息的,但是可以将调试信息提取出来作为文件,在程序调试时,可以将调试文件单独进行加载,比如gdb已经支持这个功能。

objcopy --only-keep-debug a.out a.out.dbg

objdump

objdump工具可用于查看目标文件或者可执行文件的段、节等构成信息,也可以用来对目标文件进行反汇编。objdump的常用选项如下:

  • -f:显示程序文件的头信息;
  • -h:显示程序中的段信息;
  • -s:显示某一个段的具体信息
  • -d:对程序进行反汇编后,显示程序文件的汇编代码;
  • -S:通常与-d选项搭配,用于指示objdump在反汇编时同时显示汇编代码所对应的C/C++源程序;

使用反汇编

使用objdump对程序文件进行反汇编,是日常调测用的较多的一个功能:

objdump -d -S a.out > a.out.S

strings

strings用于查看程序文件中的可显示字符,功能相对简单。在此查看一个最简单的helloworld程序中包含的字符串:

shell # strings helloworld
/lib64/ld-linux-x86-64.so.2
libc.so.6
printf
__cxa_finalize
__libc_start_main
__stack_chk_fail
GLIBC_2.2.5
GLIBC_2.4
_ITM_deregisterTMCloneTable
__gmon_start__
_ITM_registerTMCloneTable
u/UH
[]A\A]A^A_
hello world!
;*3$"

对于strings工具来说,更为常见的用法时为了查询系统中运行模块的版本信息,相对于查看模块运行日志,strings提供了一个更快捷的手段,当然这需要开发过程中在程序中增加特定版本信息的字符串。

相关参考

  • 《专业嵌入式软件开发:全面走向高质高效编程》
  • 《Linux Man Pages》

GNU binutils工具集相关推荐

  1. binutils工具集用法

    addr2line用于得到程序指令地址所对应的函数,以及函数所在的源文件名和行号. 在不少嵌入式开发环境中,编译器的名称往往不是gcc,而是想arm-rtems-gcc这样的,对于这种命名形式的编译器 ...

  2. Binutils工具集 GCC工具集介绍

    GNU Binutils详解:http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.ht ...

  3. Linux二进制实用工具Binutils工具集解析()

    From:http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils:http://www.gnu.org/softwa ...

  4. Binutils工具集 解析

    对于嵌入式系统开发,掌握相应的工具至关重要,它能使我们解决问题的效率大大提高.目前,可以说嵌入式系统的开发工具是GNU的天下,因为来自GNU的GCC编译器支持大量的目标处理器.除了GCC,还有一个非常 ...

  5. binutils工具集

    如果使用 gcc 作为编译器,那么 binutils 就是必不可少的一个工具集.工具集中的部分工具除了被 gcc 在后台使用为我们创建程序文件(目标文件.库文件或可执行程序)外,其它的则有助于方便开发 ...

  6. gnu binutils_9个基本的GNU binutils工具

    gnu binutils 想象一下,虽然无法访问软件的源代码,但仍然能够理解软件的实现方式,在其中找到漏洞,并且可以更好地修复错误. 所有这些都是二进制形式. 听起来像是拥有超级大国,不是吗? 您也可 ...

  7. 《深入分析GCC 》——2.3 GNU binutils工具

    本节书摘来自华章出版社<深入分析GCC >一书中的第2章,第2.3节,作者 王亚刚 ,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.3 GNU binut ...

  8. GNU工具链简介(GCC编译器+Binutils工具集+GDB调试器+make工具)

    以下内容源于网络资源的学习与整理,如有侵权请告知删除. 一.什么是工具链 在软件工程中,工具链(toolchain)是一系列用于制作软件的工具.它包括用来编辑源代码的文本编辑器.生成可执行文件的编译器 ...

  9. 嵌入式软件开发杂谈(4):Binutils工具集

    文章目录 1 addr2line 2 nm 3 readelf 3.1 -h 3.2 -l 3.3 -S 3.4 -t 3.5 -s 3.6 -n 3.7 -d 4 size 5 objdump 6 ...

最新文章

  1. containerd发布了CRI修复程序和CVE-2019-5736更新的runc
  2. python开发板比较_再不学点Python,咱真老了--Adafruit Metro M0 Express开发板评测
  3. 同时绑定onpropertychange 和 oninput 事件,实时检测 input、textarea输入改变事件,支持低版本IE,支持复制粘贴...
  4. THINKPHP3.2视频教程
  5. 世界最早投入运行的计算机网络是,世界最早投入运行的计算机网络是
  6. python sqlite并发处理_python sqlite大数据 处理
  7. mac mysql-share_mac下安装mysql
  8. leetcode:N-Queens 问题
  9. 数字地球与计算机技术联系,数字地球与地球空间信息科学的关系
  10. serve注解是加在哪个类_PHP 8新特性之Attributes(注解)
  11. 【期末划重点】高数下期末考复习
  12. 树莓派ubuntu mate 修改屏幕解析度为800x480
  13. error: #79: expected a type specifier
  14. 避雷指南:软件测试最容易陷的28个误区
  15. 完全二叉树与满二叉树
  16. 图像金字塔的简单理解
  17. PMBOK(第五版)学习笔记 —— ITTO(输入、工具与技术及输出)汇总
  18. 行为识别论文笔记|TSN|Temporal Segment Networks: Towards Good Practices for Deep Action Recognition
  19. CAN接口测试工装研究
  20. 快乐寒假二,有计划,有坚持,有收获

热门文章

  1. 什么是MVC设计模式???
  2. 大数据需要学习哪些知识
  3. 中外三大院士领衔:​INSEC WORLD世界信息安全大会即将开幕
  4. 让进程在后台可靠运行的几种方法
  5. iftop---实时流量监控工具
  6. 网易云易盾三款产品入选2018网络安全全景图
  7. c++-文件操作-1.创建文件夹
  8. HDMI 之 CEC
  9. OpenGL之三维GIS
  10. 基于Arduino锂电池容量测试仪