GNU Binutils工具介绍

网址一:http://linux.chinaitlab.com/manual/htmlbook/appendixa/binutils.html

网址二:http://blog.csdn.net/yf24518150/article/details/4972632

 

GNU Binutils工具介绍

在Linux下建立嵌入式交叉编译环境要用到一些列的工具链(tool-chain),主要有比如GNU Binutils、Gcc、Glibc、Gdb等,它们都属于GNU的工具集。其中GNU Binutils是一套用来构造和使用二进制所需的工具集。建立嵌入式交叉编译环境,Binutils工具包是必不可少的,而且Binutils与GNU的C编译器gcc是紧密相集成的,没有Binutils,gcc也不能正常工作的。Binutils的官方下载地址是:ftp://ftp.gnu.org/gnu/binutils/,在这里可以下载到不同版本的Binutils工具包。目前比较新的版本是Bintuils-2.16.1。GNU Binutils工具集里主要有以下一些列的部件。

l        as GNU的汇编器

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

l        ld GNU的链接器

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

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

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

l        ar 从文件中创建、修改、扩展文件

l        gasp 汇编宏处理器

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

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

在默认的情况下,GNU编译器生成的目标文件各式为elf格式,elf文件由若干段(section)组成,如果不做特殊指明,由C源程序生成的目标代码中包含如下段:

text(正文段)包含程序的指令代码;

.data(数据段)包含固定的数据,如常量、字符串;

.bss(未初始化数据段)包含为初始化的变量、数组等。

C++源程序生成的目标代码中还包含.fini(析构函数代码)和.init(构造函数代码)等。链接生成的elf格式文件还不能直接下载到目标平台来运行执行,需要通过objcopy工具生成最终的二进制文件。链接器的任务就是将多个目标文件的.text、.data和.bss等段连接在一起,而连接脚本文件是告诉连接器从什么地址开始放置这些段。

l        objdump 显示目标文件信息

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

l        readelf 显示elf文件信息

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

l        ranlib 生成索引以加快对归档文件的访问,并将结果保存到这个归档文件中

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

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

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

l        strings 打印可打印的目标代码字符(至少4个字符),打印字符多少可以控制

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

l        strip 放弃所有符号连接

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

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

l        gprof 显示程序调用段的各种数据

2.2 Binutils工具软件使用

就Binutils工具软件的使用问题,以下以Binutils工具包中两个常用工具的使用进行简单的说明。

1、汇编器

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

[root@localhost] # as –o test.o test.s

2、链接器

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

需要注意的是,在Linux下编写应用程序(假定采用GCC编译器)时,GCC编译器内置缺省的链接脚本。如果采用缺省脚本,需要操作系统才能加载运行。

就像前面讲到的,由汇编器产生的目标代码是不能直接在计算机上运行的,它必须经过链接器的处理才能生成可执行代码。Linux使用ld作为标准的链接程序,比如我们可以用下面的方法来链接上述编译的程序

[root@localhost]# ld –s –o test test.o

这样就产生了最终的可执行程序test。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页