工具链介绍
约定
注意: 除非另有指定,本文档假定:
- 以
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
从文档中生成一个内容索引readelf
从ELF
格式的目标文件中展示信息size
展示目标或文档的段以及他们的大小strip
忽略嵌入到目标文件中的符号
安装
开发新的硬件平台的软件,第一步是安装开发软件需要的工具链。包括确定安装汇编器、链接器、编译器、软件库、仿真器、程序以及其他目标架构支持的工具。在本例中,我们的目标是 ARM Cortex-M3
处理器,基于 ARMv7
架构。考虑到花费的代价以及可获取程度,我们这里使用 GNU GCC
编译链。GCC
是极受欢迎的开源工具链,可以用在诸如 Intel x86
,ARM v4/5/6/7
,TI MSP
,Atmel AVR
等架构的设备上。因为大部分 GCC
工具是可以免费下载的,它们可以被任何人使用。注意: 当开发用的主机与目标架构不同时,会将工具链称为 交叉编译链
(即,如果你希望在基于 x86
的架构的 Linux
设备上开发 ARM
架构的软件,那么你需要这么一个交叉编译链)。
Unix
交叉编译器的名命传统可能会令人迷惑。如果你想要查找一个 ARM
编译器,那么你可能找到如下几个工具链: arm-none-linux-gnueabi
,arm-none-eabi
,arm-eabi
,以及 arm-softfloat-linux-gnu
。Unix
交叉编译器使用如下的名命方式: arch
,[-vendor]
,[-os]
,-abi
。其中:
arch
为目标架构,在我们的示例情景下是ARM
vendor
为工具链提供者os
为目标操作系统,如果有的话,用来决定链接以及系统调用应用的库 (比如:newlib
,glibc
,crt0
等)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
文件。