在Linux系统下搞嵌入式开发,交叉编译器那肯定是必备工具。用的场合多了,就会见到各种各样的编译工具。
交叉编译工具链概念
本地编译
在当前PC编译出来的可执行程序,可在当前PC环境中执行。即在当前PC环境下编译出了相同CPU体系结构的可执行程序。如x86 PC编译的可执行程序可运行在x86的CPU上。
交叉编译
交叉编译,是一个和本地编译相对应的概念,交叉编译通俗地讲就是一种平台上编译出的程序能够运行在不同体系结构的平台上,比如在PC平台(X86 CPU)上编译出能运行在ARM CPU的程序,
交叉编译的原因
之所以要有交叉编译,主要原因是:嵌入式系统中的资源太少。具体的解释就是:所要运行的目标环境中,各种资源,都相对有限,所以很难进行直接的本地编译。嵌入式开发板的CPU、RAM、Falsh等硬件资源相对比较紧张,在已经运行了嵌入式Linux的前提下,没法方便的进行本地编译。因为编译,开发,都需要相对比较多的CPU,内存,硬盘等资源,而嵌入式开发上的资源,只够嵌入式(Linux)系统运行的,没太多剩余的资源,供你本地编译。
什么是交叉编译工具链
交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发工具集,交叉编译工具链主要由binutils、gcc和glibc三个部分组成。有时出于减小 libc 库大小的考虑,也可以用别的 c 库来代替 glibc,例如 uClibc、dietlibc 和 newlib。建立交叉编译工具链是一个相当复杂的过程,如果不想自己经历复杂繁琐的编译过程,网上有一些编译好的可用的交叉编译工具链可以下载,当然也可以学习自己制作一个交叉编译工具链。
交叉编译工具链的分类
从授权上,分为免费授权版和付费授权版。
免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译制作),第二是 Codesourcery,第三是Linora。
收费版有ARM原厂提供的armcc、IAR提供的编译器等等,因为这些价格都比较昂贵,不适合学习用户使用,所以不做讲述。
交叉编译工具链的命名
交叉编译工具链的命名规则为:arch - vendor -os - (gnu)eabi
arch – 体系架构,如ARM,MIPS
vendor – 工具链提供商
os – 目标操作系统
eabi – 嵌入式应用二进制接口(Embedded Application Binary Interface)
arch:体系架构,如ARM,MIPS等,表示该编译器用于编译哪个目标平台的程序
vendor:工具链提供商,即谁制作出来这个交叉编译器的,vendor的值,貌似是可以自己随便填写的;更加通用的做法,是把vendor写成,体系架构的值,比如arm-cortex_a8-linux-gnueabi中的cortex_a8,就属于CPU的名字。
os:目标操作系统。即交叉编译器编译出来的程序,在什么系统中、环境中运行。而对应的环境或系统,主要有两种:有OS、无OS。一般用linux表示有操作系统。用none表示裸系统,如编译一个Uboot,或者是其他一个小程序,运行在无嵌入式Linux的环境。 比如,购买的嵌入式系统开发板,常常附带一些小程序,比如点亮LED,跑马灯等程序,就是这种,运行在无OS的环境。
ABI 和 EABI
ABI:二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口。
EABI:嵌入式ABI。嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。开发者使用自己的汇编语言也可以使用 EABI 作为与兼容的编译器生成的汇编语言的接口。
两者主要区别是,ABI是计算机上的,EABI是嵌入式平台上(如ARM,MIPS等)。
实例说明
-
arm-eabi-gcc:Android ARM 编译器。
-
arm-none-eabi-gcc:(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)
用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux 应用Application),一般适合 ARM7、Cortex-M 和Cortex-R 内核的芯片使用,所以不支持那些跟操作系统关系密切的函数,比如fork(2),他使用的是 newlib 这个专用于嵌入式系统的C库。 -
arm-none-linux-gnueabi-gcc:(ARM architecture, no vendor, creates binaries that run on the Linux operating system, and uses the GNU EABI)
主要用于基于ARM架构的Linux系统,可用于编译 ARM 架构的 u-boot、Linux内核、linux应用等。arm-none-linux-gnueabi基于GCC,使用Glibc库,经过 Codesourcery 公司优化过推出的编译器。arm-none-linux-gnueabi-xxx交叉编译工具的浮点运算非常优秀。一般ARM9、ARM11、Cortex-A 内核,带有 Linux 操作系统的会用到 -
arm-linux-gnueabihf-gcc:是由 Linaro 公司基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM(32位)系统中所有环节的代码,包括裸机程序、u-boot、Linux kernel、filesystem和App应用程序。
-
aarch64-linux-gnu-gcc:是由 Linaro 公司基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARMv8 64位目标中的裸机程序、u-boot、Linux kernel、filesystem和App应用程序。
-
arm-none-elf-gcc:是 Codesourcery 公司(目前已经被Mentor收购)基于GCC推出的的ARM交叉编译工具。可用于交叉编译ARM MCU(32位)芯片,如ARM7、ARM9、Cortex-M/R芯片程序。
-
armcc:ARM 公司推出的编译工具,功能和 arm-none-eabi 类似,可以编译裸机程序(u-boot、kernel),但是不能编译 Linux 应用程序。armcc一般和ARM开发工具一起,Keil MDK、ADS、RVDS和DS-5中的编译器都是armcc,所以 armcc 编译器都是收费的。