常见的linux二进制工具集

1、前言

众所周知,嵌入式的开发工具是GNU的天下,因为来自GNU的GCC编译器支持大量的目标处理器,但是除了GCC编译器之外,还有大量的来自GNU的工具集(toolchain)此工具集是开发和调试中不可缺少的重要工具。

2、工具介绍:

addr2line:将程序地址翻译成文件名和行号;给定地址和可执行文件名称,它使用其中的调试信息判断与此地址有关的源文件和行号。(将地址对应到文件名和行号)

ar:创建、修改和提取文档

as:一个汇编器,as工具主要用来将汇编语言编写的源程序转换成二进制形式的目标代码。Linux平台的标准汇编器是GAS,它是GNU、GCC编译器所依赖的后台汇编工具,通常包括在Binutils软件包中。

c++filt:被链接器用于修复C++和java符号,防止重载的函数相互冲突

elfedit:更新ELF文件的ELF头

gprof:显示分析数据的调用图表。Gprof是linux下一个强有力的程序分析工具。能够以“日志”的形式记录程序运行时的统计信息:程序运行中各个函数消耗的时间和函数调用关系,以及每个函数被调用的次数等等。从而可以帮助程序员找出众多函数中耗时最多的函数,也可以帮助程序员找出众多函数中耗时最多的函数,也可以帮助程序员分析程序的运行流程。相信这些功能对于分析开源代码的程序员来说,有着相当大的诱惑力;同时我们也可以借助gprof进行性能优化和分析

ld:一个链接器,将几个对象和归档文件合成一个文件,重新定位他们的数据并且捆绑符号索引。同as一样,ld也是GNU Binutils工具集中重要的工具,linux是使用ld作为标准的链接程序,由汇编器产生的目标代码是不能够直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码,链接是创建一个可执行程序的最后一步,ld可以将多个目标文件链接成为可执行程序,同时指定了程序在运行时是如何执行的

ld.bfd:到ld的硬链接

nm:列出给定对象文件中出现的符号(列出目标文件(.o)的符号清单)

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

第一列是指程序运行时的符号所对应的地址,对于函数则地址表示的是变量存储的地址;

第二列是指相应符号是放在哪一个段的;

第三列则是指符号的名称

对于nm命令得出的第二列信息,非常的有用,其意义在于可以了解我们在程序中所定义的一个符号(比如变量等等)是被放在程序的哪一个段的,如果要查看所有字母的含义,可以在虚拟机中‘man nm’

objcopy:将一种对象文件翻译成另一种,(.bin转换成 .elf)(.elf转换成.bin)等

objdump:显示有关给定对象文件的内容信息,包含指定的显示信息的选项;显示的信息对编译工具开发者很有用(能够实现(ar,nm)的很多功能)最主要的作用是反汇编

对于反汇编:

在嵌入式系统开发的开发过程中,我们有时候需要知道所生成的程序中的段信息

来分析问题。比如:我们需要知道其中的某个段在程序运行时,共起始地址是什么,或者我们需要知道正在运行的程序中是否存在调试信息等等。

objdump命令是linux下的反汇编目标文件或者可执行文件的命令,它还有其他作用:

objdump -f test        显示test的文件头信息

objdump -d test        反汇编test中的需要执行指令的那些section

objdump -D test        与-d类似,但反汇编test中的所有section

objdump -h test        显示test的Section Header信息

objdump -x test        显示test的全部Header信息

objdump -s test        除了显示test的全部Header信息,还显示他们对应的十六进制文件代码

举个栗子:

将C源代码和反汇编出来的指令对照:

①、编译成目标文件(要加-g选项) gcc -g -o test.c

②、输出C源代码和反汇编出来的指令对照的格式:objdump -S test.o

对一个二进制文件如何进行反汇编?

objdump -D -b binary -m i386 a.bin

-D表示指令集架构,a.bin就是要反汇编的二进制文件;objdump -m 可以查看更多支持的指令集架构,如i386:x86-64,i8086等

此外,上述的所有的objdump命令的参数同样适用于arm-linux-objdump。

同时也可以指定big-endian或little-endian(-EB或-EL),可以指定从某个位置开始反汇编等。所以objdump命令是非常强大的;

ranlib:创建一个归档的内容索引并存储在归档内;索引列出其成员中可重定位的对象文件定义的所有符号。Ranlib生成索引以加快对归档文件的访问,并将结果保存到这个归档文件中,在索引中列出了归档文件各个成员所定义的可重分配目标文件。As -s 可以实现类似的功能

readelf:显示有关ELF二进制文件的信息。Readelf -h *.exe进行查看。是ELF文件查看利器

常见的功能命令如下:

1)-h或者--file-header   显示在ELF文件头里包含的所有信息
2)-l或者--program-headers或者--segments
     显示程序头表信息,包扩有几个段,每个段的属性,以及每个段中包含有哪几个节(Section)
3)-S或者--section-headers或者--sections    显示节区表内的所有信息,包括每个节的属性,注意这里是用的是大写的“S”
4)-t或者--section-details    用来显示所有节的详细信息,感觉上但从信息量上来说,和前面的“-S”没有什么大的不同
5)-e或者--headers    显示所有头的信息,包括ELF文件头、程序头和节头,也就是“-h -l -S”的组合。
6)-s或者--syms或者--symbols    显示符号表的信息,包含静态符号表(.symtab)和动态符号表(.dynsym)
7)-r或者--relocs     显示所有重定位入口的信息
8)-d或者--dynamic    显示动态节区的内容
9)-x或者--hex-dump=<number|name>    显示某个节区的二进制码,具体哪个节可以用该节的编号或者名字来指定,例如“-x .text”

size:列出个给定对象文件的每个部分的尺寸和总尺寸、代码段、数据段、总大小等

strings:对于每个给定的文件输出不短于指定长度(默认为4)的所有可打印字符序列;对于对象文件默认只打印初始化和加载部分的字符串,否则扫描整个文件

strip:移除对象文件中的符号,进行文件压缩,进行瘦身。即删除目标文件中的全部或者特定符号,这样可以减小可执行文件的大小,在嵌入式应用中,可执行文件一般存放在flash中,空间有限,因此在产品release的过程中采用strip对程序进行裁剪很有必要

libiberty:包含很多个GNU程序会使用的途径,包括getopt、obstack、strerror、strtol和stroul

libbfd:二进制文件描述器库

libopcodes:一个库;用于处理opcodes(处理器指令的“可读文本”版本;用于编制objdump这样的工具)

对比objdumpreadelf

objdump和readelf都可以用来查看二进制文件的一些内部信息,区别在于objdump借助BFD(LIB BFD,the Binary File Descriptor Library)更加通用一些,可以应付不同文件格式,readelf则不借助BFD,而是直接读取ELF格式文件的信息,按readelf手册页上所说,得到的信息也略微细致一些

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一条小白码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值