工具链介绍

约定

我的博客
原文链接

注意: 除非另有指定,本文档假定:

  • ARM Cortex-M3 处理器的小端模式
  • ARM EABI 应用二进制接口
  • GNU GCC 工具链

工具链

一个完整的软件工具链包括如下程序: 将源代码转化为二进制机器码;将单独的汇编/编译的代码模块链接到一起;反汇编二进制代码;转换格式。

以汇编源码文件作为起始文件,.s 文件,经过汇编器汇编生成 .o 目标文件,目标文件与链接文件 .ld 文件进行链接,通过链接器生成可执行文件,并进一步生成 .bin 文件以及可反汇编的 .lst 文件。

一个典型的 GNU 汇编工具链包括上面的过程,以及下面的程序:

  • as 作为汇编器,将高级编程语言转换为二进制机器码。它通常以 .s 作为输入,输出 .o 目标文件
  • ld 作为链接器,解析多个目标文件的外部符号引用并分配数据段,输出一个单个的可执行文件。它通常以 .o 目标文件以及 .ld 链接脚本作为输入,以 .out 可执行文件作为输出
  • objcopy.bin 文件复制并转化为 .bin 文件
  • objdump 通常用来反汇编

以 C/C++ 作为源码

如果你希望写 C/C++ 文件或混合 汇编/C 代码,编译时,你需要编译器。GNU Compiler Collection (GCC) 包含所有的工具。C/C++ 编译器 (gcc/g++) 以 C/C++ 作为源码,以及预汇编的目标感i奥文件,以及预编译的二进制文件,以这些输入生成目标文件,输出可执行文件。

在这个过程中会用到如下的程序:

  • ar 从文档中创建、调整、提取出实例
  • nlmconv 将目标代码转化为 NLM
  • nm 从目标文件中列出符号
  • ranlib 从文档中生成一个内容索引
  • readelfELF 格式的目标文件中展示信息
  • size 展示目标或文档的段以及他们的大小
  • strip 忽略嵌入到目标文件中的符号

安装

开发新的硬件平台的软件,第一步是安装开发软件需要的工具链。包括确定安装汇编器、链接器、编译器、软件库、仿真器、程序以及其他目标架构支持的工具。在本例中,我们的目标是 ARM Cortex-M3 处理器,基于 ARMv7 架构。考虑到花费的代价以及可获取程度,我们这里使用 GNU GCC 编译链。GCC 是极受欢迎的开源工具链,可以用在诸如 Intel x86ARM v4/5/6/7TI MSPAtmel AVR 等架构的设备上。因为大部分 GCC 工具是可以免费下载的,它们可以被任何人使用。注意: 当开发用的主机与目标架构不同时,会将工具链称为 交叉编译链 (即,如果你希望在基于 x86 的架构的 Linux 设备上开发 ARM 架构的软件,那么你需要这么一个交叉编译链)。

Unix 交叉编译器的名命传统可能会令人迷惑。如果你想要查找一个 ARM 编译器,那么你可能找到如下几个工具链: arm-none-linux-gnueabiarm-none-eabiarm-eabi,以及 arm-softfloat-linux-gnuUnix 交叉编译器使用如下的名命方式: arch[-vendor][-os]-abi。其中:

  • arch 为目标架构,在我们的示例情景下是 ARM
  • vendor 为工具链提供者
  • os 为目标操作系统,如果有的话,用来决定链接以及系统调用应用的库 (比如: newlibglibccrt0 等)
  • abi 指定使用应用程序二进制接口,确保不同的工具生成的二进制内容可以进行交互操作

下面的一些例子解释:

  • arm-none-eabi 目标架构为 ARM 架构,没有提供者,目标不为操作系统(即,目标为裸机程序),并遵守 ARM EABI
  • arm-none-linux-gnueabi 是可以安装到基于 Debian 的系统 (使用包管理工具 apt,包名为 gcc-arm-linux-gnueabi)。这个工具链目标为 ARM 架构,没有提供者,创建运行在 Linux 操作系统上的可执行程序,遵守 GNU EABI
  • arm-eabi 安卓 ARM 编译器

安装编译链

对于 linux 系统,只需要将编译链所在的路径导入到环境变量 PATH 中即可,如下命令:

export PATH="tool_chain/bin_path/:$PATH"

当然这一种安装方式只是临时的安装,只在当前终端下有效。如果希望启动就生效,一种选择是写入到启动脚本中,比如 ubuntu 中编辑 /etc/profile 文件。

posted @ 2022-02-07 23:04  ArvinDu  阅读(1023)  评论(0编辑  收藏  举报