[时间:2017-06] [状态:Open]

[关键词:GNU, binutils, as, ld, ar, 基础工具,linux,链接器,汇编器]

0 简介

GNU Binary Utilities或binutils是一整套的编程语言工具程序,用来处理许多格式的目标文件。当前的版本原本由在Cygnus Solutions的程序员以Binary File Descriptor library(libbfd)所撰写。这个工具程序通常搭配GCC、make、和GDB这些程序来使用。

刚开始时,这个包内只有几个程序,但后来,由于功能需求近似,陆续加入了GNU汇编器(GAS)和GNU链接器(GLD)。一般来说,这些程序都很简单,大部分的复杂性都存在于Binary File Descriptor library和libopcodes这些库里头。

原来的BFD版本由David Henkel-Wallace和Steve Chamberlain所撰写。Ken Raeburn和Ian Lance Taylor曾维护过。目前则是由Nick Clifton负责维护此版本。至于Linux上的版本,由H.J. Lu在维护。

注:以上内存摘自wiki

GNU Binutils是一系列二进制工具的集合。主要包括:

  • ld —— GNU链接器
  • as—— GNU汇编器

但也包括以下二进制工具:

  • addr2line:从目标文件的虚拟地址获取文件的行号或符号。
  • ar:可以对静态库做创建、修改和提取的操作。
  • c++filt:反编译(反混淆,demangle)C++符号的工具。
  • dlltool:创建创建Windows动态库。
  • gold:另一种新的、更快的仅支持ELF的链接器。
  • gprof:性能分析(profiling)工具程序。
  • nlmconv:可以转换成NetWare Loadable Module(NLM)目标文件格式。
  • nm:显示目标文件内的符号信息。
  • objcopy:复制和转译目标文件。
  • objdump:显示目标文件的相关信息,亦可反汇编。
  • ranlib:产生静态库的索引。(和nm -s功能类似)
  • readelf: 显示ELF文件的内容。
  • size:列出目标文件或库文件的section大小。
  • strings:列出文件中可打印的字符串信息。
  • strip:从目标文件中移除符号信息。
  • windmc:Windows消息资源编译器。
  • windres:Windows资源文件编译器。

其中多数程序使用BFD(Binary File Descriptor库)实现底层操作。其中多数也使用opcodes库来汇编及反汇编机器指令。

Binutils已被移植到大多数助理的unix/linux系统中,同时也支持Wintel系统,它们存在的主要目标是为GNU系统提供编译和链接程序的机制。

注:以上内容翻译自GNU Binutils

下面逐个介绍下上面提到的工具集。

这里说明下,所有文档都可以在documentation for binutils 2.28找到。

1 目标文件处理及分析

nm

nm用来列出目标文件中的符号,可以帮助程序员定位和分析执行程序和目标文件中的符号信息和它的属性。比如我用以下代码编译之后,编译指令gcc main.cpp

#include <cstdio>
int main(int argc, char **argv)
{
printf("enter checking\n");
return 0;
}

使用nm输出结果如下:(部分删减,不是全部)

$ nm a.out
0000000000601040 B __bss_start
0000000000601040 b completed.7291
0000000000601030 D __data_start
0000000000601030 W data_start
0000000000400560 T __libc_csu_init
U __libc_start_main@@GLIBC_2.2.5
0000000000400536 T main
U puts@@GLIBC_2.2.5
00000000004004b0 t register_tm_clones
0000000000400440 T _start
0000000000601040 D __TMC_END__

objcopy

objcopy可以将一种格式的目标文件转化为另外一种格式的目标文件. 它使用GNU BFD库进行读/写目标文件。objcopy就能将原格式的目标文件转化为不同格式的目标文件。

objcopy用于将object的部分或全部内容拷贝到另一个object,从而可以实现格式的变换。

objcopy可用用于将文件转换成S-record格式或者raw二进制格式。objcopy还可以实现将图像编译到目标文件中。

objdump

objdump用来显示目标文件的信息。可以通过选项控制显示那些特定信息。objdump一个最大的用处恐怕就是将C/C++代码反汇编了. 在嵌入式软件开发过程中, 也可以用它查看执行文件或库文件的信息。

readelf

readelf用来显示ELF格式目标文件的信息。可通过参数选项来控制显示哪些特定信息。(注意: readelf不支持显示静态库, 也不支持64位的ELF文件)。

2 编译链接工具

ar

ar用于建立、修改、提取静态库文件(archive)。archive是一个包含多个被包含文件的单一文件(也称之为库文件),其结构保证了可以从中检索并得到原始的被包含文件(称之为archive中的member)。member的原始文件内容、模式(权限)、时间戳、所有者和组等属性都被保存在 archive中。member被提取后,他们的属性被恢复到初始状态。

ar主要用于创建C库文件。

典型用法如下:

$ ar rv libNAME.a file1.o file2.o

ld

ld是链接器,通常由GCC/G++调用。外部基本不可见。

addr2line

在崩库或者存在需要分析程序调用堆栈的情况下非常有用,addr2line可以反编译到代码的特定行。

c++filt

用于反混淆c++变量或函数名称的,可以还原为人类可读的格式。通常这个过程称为反混淆-demangle。

dlltool

生成windows动态链接库在编译时依赖的lib索引,典型的应用如下:

$ gcc -c dll.c # 编译
$ dlltool -e exports.o -l dll.lib dll.o # 生成lib $ gcc dll.o exports.o -o dll.dll
$ gcc program.o dll.lib -o program # 生成调用dll的可执行文件

注:第1、2部分主要参考csdn baike

3 小结

本文内容不是什么新的知识。只是我近期阅读书籍是看到的。从这些基础工具来看,基本上可以构建一个类似vs的IDE环境,也可以基本抛开复杂的底层实现逻辑,直接基于高级编程语言进行处理。

撰写本文的目的主要是整理下我对GNU基础框架的理解,对基本工具有所了解,对于后续更深入的学习是有所帮助的。

4 参考文献

GNU Binutils简介及基本用法的更多相关文章

  1. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码

    不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解 GCC 生成 16 位实模式代码方法的朋友带到我的博客.先说一下背景,编写能在 x86 实模式下运行的 ...

  2. GNU Binutils工具

    参考<程序员的自我修养---连接.装载与库> 以下内容转贴自 http://www.cnblogs.com/xuxm2007/archive/2013/02/21/2920890.html ...

  3. Linux 桌面玩家指南:08. 使用 GCC 和 GNU Binutils 编写能在 x86 实模式运行的 16 位代码

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  4. 你知道 GNU Binutils 吗?【binutils】

    概述 从事 Linux 开发的朋友们都不可避免地用到一些工具,比如 objcopy.nm.objdump.readelf 等等.其实这一系列的工具,就是所谓的 Binutils,当然 GNU 就表示它 ...

  5. json简介及JsonCpp用法

    [时间:2017-04] [状态:Open] [关键词:数据交换格式,json,jsoncpp,c++,json解析,OpenSource] json简介 本文仅仅是添加我个人对json格式的理解,更 ...

  6. 【SqlServer】T-SQL的简介及基本用法

    一.T-SQL概述 SQL Server用于操作数据库的编程语言为Transaction-SQL,简称T-SQL.T-SQL与PL/SQL不同,并没有固定的程序结构.T-SQL包括以下4个部分: DD ...

  7. GNU make简介

    引言 接触开源项目有一段时间了,对自动化编译工具一直很好奇.近期有时间正好整理下GNU make.后续可以深入了解下. 本文主要整理GNU make的学习的基本资料,同时简要介绍make的功能.语法. ...

  8. ETCD 简介及基本用法

    ETCD 项目地址 ETCD 官方文档 1. 简介 ETCD 是一个高可用的分布式键值数据库,可用于服务发现.ETCD 采用 raft 一致性算法,基于 Go 语言实现. 特点 简单:安装配置使用简单 ...

  9. 【c++】标准模板库STL入门简介与常见用法

    一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...

随机推荐

  1. P1279 字串距离

    P1279 字串距离一看就是字符串dp,然而并不会,骗分之后爆零了.以后dp题要好好想想转移方程.f[i][j]表示是a串选了前i个字符,b串选了前j个字符的距离.显然(QAQ)f[i][j]=min ...

  2. .NET Core中使用Docker

    一.Docker简介 Docker是基于Linux容器技术(LXC),使用Go语言实现的开源项目,诞生于2013年,遵循Apache2.0协议.Docker自开源后,受到广泛的关注和讨论. Docke ...

  3. python在使用MySQLdb模块时报Can't extract file(s) to egg cacheThe following error occurred while trying to extract file(s) to the Python eggcache的错误。

    这个是因为python使用MySQLdb模块与mysql数据库交互时需要一个地方作为cache放置暂存的数据,但是调用python解释器的用户(常常是服务器如apache的www用户)对于cache所 ...

  4. Python序列解包

    元组的序列解包range对象的序列解包迭代对象的序列解包列表的序列解包字典的序列解包序列解包与遍历序列解包的其它用法 元组的序列解包 x,y,z = (1,2,3) print(x,y,z) 1 2 ...

  5. 小B的询问

    OJ题号:BZOJ3781.洛谷2709 思路: 根据平方和公式,$(a+b)^2=a^2+2ab+b^2$,即当$c_i$增加$1$时,新的答案增加$2C_i+1$,减少时亦同.莫队求解即可. #i ...

  6. redis清除缓存和连接远程服务器

    直接进入命令行输入 1.连接远程redis:   redis-cli -h 127.0.0.1 -p 3008 -a pIctur3   (a后是密码) 2.查看缓存:keys * 3.清除缓存:de ...

  7. C# 设计模式速记

    设计模式分三种类型,共23种: 行为型:规定了对象之间交互的方式:行为模式定义系统内对象间的通信,以及复杂程序中的流程控制. 结构型:规定了如何组织类和对象:结构型模式可以将一组对象组合成更大的结构, ...

  8. db2文件系统已满

    文章主要讲述的是DB2文件系统已满的正确解决方案,此文首先是以列举错误案例来对其进行分析,之后再给出正确的解决方案,以下就是文章的主要内容的具体描述,望大家浏览之后会对其有更好的了解. DB2文件系统 ...

  9. 第十五章 dubbo结果缓存机制

    dubbo提供了三种结果缓存机制: lru:基于最近最少使用原则删除多余缓存,保持最热的数据被缓存 threadlocal:当前线程缓存 jcache:可以桥接各种缓存实现 一.使用方式 <du ...

  10. Centos7:Failed to start LSB: Bring up/down networking

    一开始配置的ifcfg-ens33 [root@cdh- ~]# cd /etc/sysconfig/network-scripts/ [root@cdh- network-scripts]# ls ...