这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 软件与操作系统 » GNU Binutils 工具

共3条 1/1 1 跳转至

GNU Binutils 工具

助工
2017-08-24 20:34:12     打赏

    GNU Binutils是一套用来构造和使用二进制所需的工具集。建立嵌入式交叉编译环境,Binutils是必不可少的,而且BinutilsGNUC编译器GCC是紧密相集成的,没有BinutilsGCC也不能正常工作。Binutils官方下载地址ftp://ftp.gnu.org/gnu/binutils/,可以下载不同版本的Binutils工具包。GNU Binutils工具集里主要有以下一系列的部件:

as:GNU的汇编器。

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

ld:GNU的链接器。

as工具一样,ld也是GNU Binutils工具集中重要的工具。Linux使用ld作为标准的链接程序,由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码,链接是创建一个可执行程序的最后一个步骤。ld可以将多个目标文件链接成为可执行程序,同时指定程序运行时是如何执行的。

add2line:将地址转换成文件名或行号,以便于调试程序。

ar:从文件中创建、修改和扩展文件。

gasp:汇编宏处理器。

nm:从目标代码文件中列举所有变量(包括变量值和变量类型),如果没有指定目标文件,则默认是a.out文件。

objcopyobjcopy工具使用GNU BSD库,它可以把目标文件的内容从一种文件格式复制到另一种格式的目标文件中。

    在默认情况下,GNU编译器生成的目标文件格式是elf格式。elf文件由若干段(section)组成,如果不做特殊指明,由C源程序生成的目标代码中包含如下段:.text(正文段)包含程序的指令代码;.data(数据段)包含固定的数据,如常量、字符串;.bss(未初始化数据段)包含未初始化的变量、数组等。C++源程序生成的目标代码中还包括.fini(析构函数代码)和.init(构造函数代码)等。链接生成的.elf格式文件还不能直接下载到目标平台来运行,需要通过objcopy工具生成最终的二进制文件。连接器的任务就是将多个目标文件的.text.data.bss等段连接在一起,而连接脚本文件告诉连接器从什么地址开始放置这些段。

add2line:把程序地址转换为文件名和行号。

在命令行中带一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件以及行号。

objdump:显示目标文件信息。

objdump工具既可以反编译二进制文件,也可以对对象文件进行反汇编,并查看机器码。

readelf:显示elf文件信息。

readelf命令可以显示符号、段信息、二进制文件格式的信息等,这在分析编译器如何从源代码创建二进制文件时非常有用。

ranlib:生成索引加快对归档文件的访问,并将其保存到这个归档文件中。

在索引中列出了归档文件各成员所定义的可重分配目标文件。

size:列出目标模块或文件的代码尺寸。

size命令可以列出目标文件每一段的大小以及总体的大小。默认情况下,对于每个目标文件或者一个归档文件中的每个模块只产生一行输出。

strings:打印可打印的目标代码字符(至少4个字符),可以控制打印字符的数量。

对于其他格式的文件,打印字符串。打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用“-n”设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载中的可打印字符;对于其他类型的文件,它打印整个文件的可打印字符,这个程序对于了解非文本文件内容很有帮助。

strip:放弃所有符号连接。

删除目标文件中的全部或者特定符号。

C++filt:链接器ld使用该命令可以过滤C++符号和Java符号,防止重载函数冲突。

gprof:显示程序调用段的各种函数。

Binutils工具软件使用

1、汇编器

    Linux平台的标准汇编器是GAS,它是GCC所依赖的后台编译工具,通常包含Binutils软件包。GAS是标准AT&T汇编语法,可以用来汇编用AT&T格式编写的程序,例如可以这样来编译汇编语言写的源程序test.s

# as -o test.o test.s

2、链接器

    GCC链接器使用一个命令语言脚本来控制链接过程。默认情况下,ld是由一组内部命令进行控制的,这些命令可以进行扩展或覆盖。强调可移植性和灵活性在GCC的功能中是非常明显的一条,它可以为很多不同的编译环境链接脚本,并向ld传递定制过的链接脚本,而不用手工干预。

    链接一个程序:

# ld -s -o test test.o






关键词: Binutils     工具     代码     链接    

管理员
2017-08-25 07:52:32     打赏
2楼

谢谢楼主分享


专家
2017-08-25 08:31:10     打赏
3楼

谢谢楼主分享经验。


共3条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]