Linux—什么是 Toolchain 工具链,以及 binutils 常用的几种工具

  Toolchain 是文件系统和工具链。 如:一套流程里面用到的每个工具和相关的库组成的集合,就称为工具链(tool chain)。

  在软件中,工具链是一组编程工具,用于执行复杂的软件开发任务或创建软件产品,该软件产品通常是另一个计算机程序或一组相关程序。通常,形成工具链的工具是连续执行的,因此每个工具的输出或结果环境状态成为下一个工具的输入或启动环境,当引用一组相关工具但不必须连续执行时也使用该术语

  GNU 工具链 是一个包含了由 GNU 项目所产生的各种编程工具的集合。这些工具形成了一条工具链 (串行使用的一组工具),用于开发应用程序和操作系统

  GNU 工具链在针对嵌入式系统的 Linux 内核、BSD 及其它软件的开发中起着至关重要的作用GNU 工具链中的部分工具也被 Solaris, macOS, Microsoft Windows (via Cygwin and MinGW/MSYS) and Sony PlayStation 3 等其它平台直接使用或进行了移植。

  所谓的工具链,两部分的含义:

工具

  工具,是用来干活的,此处要干的活,目标是为了:生成(可以运行的程序)或库文件。而为了达成此目标,内部的执行过程和逻辑主要包含了:

编译

  编译的输入(对象) 是:程序代码

  编译输出(目标) 是:目标文件

  编译所需要的工具是:编译器

  编译器,常见的编译器,即为 gcc

链接

  链接的输入(对象) 是:程序运行时所依赖的,或者某个库所依赖的另外一个库文件

  链接的输出(目标) 是:程序的可执行文件,或者是可以被别人调用的完整的库文件

  链接所需要的工具是:链接器

  链接器,即 ld为了将程序代码,编译成可执行文件,涉及到编译,链接(等其他步骤),要依赖到很多相关的工具,最核心的是编译器 gcc,链接器 ld

  而此处,所谓的工具,主要指的就是:和程序编译链接等相关的 gcc,ld 等工具 (binutils 包含了 ld 等工具)

  上面所说的 ld,只是处理操作目标文件,二进制文件的最主要的一个工具,而和操作目标等文件相关的,还有其他很多工具的:as,objcopy,strip,ar 等等工具

  对此,GNU 官网,弄出一个 binutils,即 binary utils,二进制工具(包),集成了这些和操作二进制相关的工具集合,叫做binutils

  所以,之后你所见到的,常见的工具,就是那个著名的 GNU Binutils 了。

  链,即链条,chain。之所以能称为链,说明不止一个东西,然后,按照对应的逻辑,串在一起,链在一起。而对应的,涉及到的不止一个东西,指的是就是前面所说的那个工具,即:和程序编译链接等相关的 gcc,binutils 等工具

  按照对应的逻辑,指的就是,按照程序本身编译链接的先后顺序,即:先编译,后链接,再进行后期其他的处理等等,比如用 objcopy 去操作相应的目标文件等等

  如此的,将和程序编译链接等相关的 gcc,binutils 等工具,按照先编译后链接等相关的编译程序的内在逻辑
串起来,就成了我们所说的:工具链

binutils 常用的几种工具

  binutils 中几种工具的作用:

 █ ar :打包生成静态库。

 █ as :汇编器

 █ Id :链接器。将用户编译生成的目标文件连同系统的 libc 启动代码链接在一起形成最终的可执行文件

 █ nm :查看目标文件中的符号(全局变量、全局函数等)

 █ objcopy :将原目标文件中的内容复制到新的目标文件中,可以通过不同的命令选项调整目标文件的格式,比如去除某些 ELF 文件头

 █ objdump :用于生成反汇编文件,主要依赖 objcopy 实现,a.out 编译时需要 -g

objdump -dSsx  a.out > file(将 a.out 的输出结果重定向到文件 file 内)

 █ ranlib :为静态库文件创建索引,相当于 ar 命令的 s 选项

 █ readelf :解读 ELF 文件头

你可能感兴趣的:(操作系统,Linux,Toolchain)