[时间: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_initU __libc_start_main@@GLIBC_2.2.5
0000000000400536 T mainU 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 参考文献

转载于:https://www.cnblogs.com/tocy/p/gnu-binutils-simple-usage.html

GNU Binutils简介及基本用法相关推荐

  1. GNU binutils工具集

    前言 GNU binutils工具提供了一系列二进制工具,用于日常开发过程中对程序调试和维护,经常会用到的工具如下: as:汇编编译器,用于将汇编代码编译成目标文件; addr2line:用于得到程序 ...

  2. 在CentOS/Debian/Ubuntu上编译安装最新版gnu make 和GNU 'binutils' (as and ld)

    先查看make版本: root@:~/clickhouse/gcc-build# make --version GNU Make 3.82 Built for x86_64-redhat-linux- ...

  3. Spring AOP 简介以及简单用法

    Spring AOP 简介以及简单用法 如果你去面试java开发, 那么Spring的AOP和DI几乎是必问的问题. 那么AOP是什么呢? 一. AOP 所谓Aop就是 Aspect-Oriented ...

  4. GNU gcc的编译工具用法(转)

    对大多数不从事Linux平台C语言开发的人来说,GNU gcc的一套工具和Linux平台的共享库的使用还是十分陌生的,其实我也不太熟悉,姑且写点基础知识,权当做备忘吧. 一.GNU gcc的编译工具用 ...

  5. GNU binutils 里的九种武器 | Linux 中国

    原创: 译者/Xingyu.Wang Linux中国 10月10日 https://mp.weixin.qq.com/s/n2HHgcbpfwsQlYf93ocu1Q Table of Content ...

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

    使用GCC和GNU Binutils编写能在x86实模式运行的16位代码 不可否认,这次的标题有点长.之所以把标题写得这么详细,主要是为了搜索引擎能够准确地把确实需要了解GCC生成16位实模式代码方法 ...

  7. GNU radio入门学习(2)GNU radio简介

    GNU Radio简介 GNU Radio是什么 基本思想 定义 主要思想 软件架构(GNU Radio的"hello world") Python编写"hello wo ...

  8. GNU Binutils

    GNU Binutils http://www.gnu.org/software/binutils/ The GNU Binutils are a collection of binary tools ...

  9. linux gnu binutils,binutils源码分析之准备篇

    1.什么是binutils 先写一个简单的hello_world.c程序. #include int main() { printf("Hello World!\n"); retu ...

最新文章

  1. Supervisor进程管理开机自启
  2. 超好用!5款开源的移动自动化测试工具
  3. Node.js 根本没有这样搞性能优化的?
  4. openfoam安装中出现allmake error_如何更新OpenFOAM的版本?
  5. linux 错误信息 输出到管道,linux grep通过管道输出到head出现write error: Broken pipe错误...
  6. Ubuntu安装GoogleTest框架并测试C++代码
  7. #动态规划 0-1背包问题空间复杂度优化
  8. 快看这里,如何卸载windows11自动更新下载的文件还你C盘空间
  9. docker限制cpu、内存使用
  10. c代码生成matlab模块,使用 C Caller 模块集成 C 代码
  11. 国家专精特新小巨人申报条件及培育措施
  12. 强化学习的概念及学习过程
  13. 如何提高学生对计算机英语的兴趣论文,如何培养小学生英语学习的兴趣_英语论文.doc...
  14. 最本质的相机内参intrinsics与外参extrinsics分析,从建模,推导到求解
  15. 微信蓝牙设备开发--添加设备以及获取微信为设备生成的二维码
  16. AG9311功能应用和结构设计框图参考
  17. 瑞森助您实现优秀的LLC恒流LED照明方案
  18. ios怎么创建html,iBooks Author:关于 HTML widget 创建
  19. Linux搭建YUM仓库
  20. 佳博Gainscha GP-7645 打印机驱动

热门文章

  1. python爬虫预测_从爬虫到机器学习预测,我是如何一步一步做到的?
  2. python模拟购物车流程_用函数模拟简单的购物车(Python)
  3. 可以解压日文的软件_日文换成中文字体就不好看?我偏不信这个邪!
  4. 云盘存储 教学反思_现代教育技术
  5. python撤销_python 取消转义字符作用
  6. 2022年考研计算机组成原理_6 总线
  7. 查询一个表中一个字段相同的数据_最实用MySQL 查询当天、本周,本月、上一个月的数据...
  8. 安装webpack-cli时遇到的问题
  9. java 和mysql做Android_基于Android和Java后台的朋友圈的设计和实现
  10. supervisor入门应用