交叉编译

编译工具链

本地编译

在当前 PC 编译出来的可执行程序,可在当前 PC 环境中执行。即在当前 PC 环境下编译出了相同 CPU 体系结构的可执行程序。如 x86 PC 编译的可执行程序可运行在 x86 的 CPU 上。

交叉编译

交叉编译,是一个和本地编译相对应的概念,交叉编译通俗地讲就是一种平台上编译出的程序能够运行在不同体系结构的平台上,比如在 PC 平台(X86 CPU)上编译出能运行在 ARM CPU 的程序,

交叉编译的原因

之所以要有交叉编译,主要原因是:嵌入式系统中的资源太少。具体的解释就是:所要运行的目标环境中,各种资源,都相对有限,所以很难进行直接的本地编译。嵌入式开发板的 CPU、RAM、Falsh 等硬件资源相对比较紧张,在已经运行了嵌入式 Linux 的前提下,没法方便的进行本地编译。因为编译,开发,都需要相对比较多的 CPU,内存,硬盘等资源,而嵌入式开发上的资源,只够嵌入式(Linux)系统运行的,没太多剩余的资源,供你本地编译。

编译概念

host:编译工具运行的系统架构平台

target:编译产物运行的系统架构平台

什么是交叉编译工具链

交叉编译工具链是一个由编译器、连接器和解释器组成的综合开发工具集,交叉编译工具链主要由 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 等)。