GNU binutils工具集
前言
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工具集相关推荐
- binutils工具集用法
addr2line用于得到程序指令地址所对应的函数,以及函数所在的源文件名和行号. 在不少嵌入式开发环境中,编译器的名称往往不是gcc,而是想arm-rtems-gcc这样的,对于这种命名形式的编译器 ...
- Binutils工具集 GCC工具集介绍
GNU Binutils详解:http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.ht ...
- Linux二进制实用工具Binutils工具集解析()
From:http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils:http://www.gnu.org/softwa ...
- Binutils工具集 解析
对于嵌入式系统开发,掌握相应的工具至关重要,它能使我们解决问题的效率大大提高.目前,可以说嵌入式系统的开发工具是GNU的天下,因为来自GNU的GCC编译器支持大量的目标处理器.除了GCC,还有一个非常 ...
- binutils工具集
如果使用 gcc 作为编译器,那么 binutils 就是必不可少的一个工具集.工具集中的部分工具除了被 gcc 在后台使用为我们创建程序文件(目标文件.库文件或可执行程序)外,其它的则有助于方便开发 ...
- gnu binutils_9个基本的GNU binutils工具
gnu binutils 想象一下,虽然无法访问软件的源代码,但仍然能够理解软件的实现方式,在其中找到漏洞,并且可以更好地修复错误. 所有这些都是二进制形式. 听起来像是拥有超级大国,不是吗? 您也可 ...
- 《深入分析GCC 》——2.3 GNU binutils工具
本节书摘来自华章出版社<深入分析GCC >一书中的第2章,第2.3节,作者 王亚刚 ,更多章节内容可以访问云栖社区"华章计算机"公众号查看. 2.3 GNU binut ...
- GNU工具链简介(GCC编译器+Binutils工具集+GDB调试器+make工具)
以下内容源于网络资源的学习与整理,如有侵权请告知删除. 一.什么是工具链 在软件工程中,工具链(toolchain)是一系列用于制作软件的工具.它包括用来编辑源代码的文本编辑器.生成可执行文件的编译器 ...
- 嵌入式软件开发杂谈(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 ...
最新文章
- containerd发布了CRI修复程序和CVE-2019-5736更新的runc
- python开发板比较_再不学点Python,咱真老了--Adafruit Metro M0 Express开发板评测
- 同时绑定onpropertychange 和 oninput 事件,实时检测 input、textarea输入改变事件,支持低版本IE,支持复制粘贴...
- THINKPHP3.2视频教程
- 世界最早投入运行的计算机网络是,世界最早投入运行的计算机网络是
- python sqlite并发处理_python sqlite大数据 处理
- mac mysql-share_mac下安装mysql
- leetcode:N-Queens 问题
- 数字地球与计算机技术联系,数字地球与地球空间信息科学的关系
- serve注解是加在哪个类_PHP 8新特性之Attributes(注解)
- 【期末划重点】高数下期末考复习
- 树莓派ubuntu mate 修改屏幕解析度为800x480
- error: #79: expected a type specifier
- 避雷指南:软件测试最容易陷的28个误区
- 完全二叉树与满二叉树
- 图像金字塔的简单理解
- PMBOK(第五版)学习笔记 —— ITTO(输入、工具与技术及输出)汇总
- 行为识别论文笔记|TSN|Temporal Segment Networks: Towards Good Practices for Deep Action Recognition
- CAN接口测试工装研究
- 快乐寒假二,有计划,有坚持,有收获