对于固件应用开发来说,编译工具链都是sdk供应商提供的,不同的项目,就有了多种编译链,不同的编译链有什么区别呢?
例如 arm-linux-gnueabihf-xx,mipsel-openwrt-linux-xx 。
交叉编译工具链,从授权上,分为免费授权版和付费授权版。
免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译制作),第二是 Codesourcery,第三是Linora。
收费版有ARM原厂提供的armcc、IAR提供的编译器等等。
所以各个sdk厂商提供的工具链,最终也都是由这三个厂商开发的。在有一些工具链的打包名字中,有时候出现linora,就是linora这个厂商提供的工具链。
arch [-vendor] [-os] [-(gnu)eabi]
arch – 体系架构,如ARM,MIPS,对于MIPS可能还分大端模式mips或者小端模式mipsel;
vendor – [可选]工具链提供商,可能有的工具链会省去这个字段,一般可能是none、芯片提供商如histbv100或者是第三方提供商如buildroot(允许自行修改),但大都是软链接,最终指向仍然是最基础的工具链;
os – [可选]目标板中运行的系统,一般为linux,但对于一些专门用于裸板或者uboot的编译工具这个字段可能是bare-metal(裸板);
gnu – [可选]所使用的C库,gnu代指使用glibC,这个字段还可能是eglibc,uclibc;
再一个一个说,
CPU体系结构主要有四大系列, ARM、X86/Atom、MIPS、PowerPC。
里面只有x86是复杂指令集,其他都是精简指令集,X86是intel首先开发制造,我们用的PC。Atom是intel开发的精简指令集架构。ARM、MIPS、PowerPC,三大嵌入式CPU架构,ARM又有多个系列, arch可能出现arm/aarch64(arm 64位处理器)等, mips是大端模式, mipsel是小端模式。
eabi – 相对于x86上面的abi,嵌入式应用二进制接口(Embedded Application Binary Interface),如果没有“eabi”字段,说明用的是旧版本的oabi(Old Application Binary Interface)。
一般这个字段还有eabihf这个选项, 两者的区别见下文 。
[-(gnu)eabi]举几个例子:gnu 等价于:glibc+oabi , gnueabi 等价于:glibc+eabi, uclibc 等价于:uclibc+oabi。
arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc
实例
1、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库。
2、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 操作系统的会用到。
3、arm-eabi-gcc
Android ARM 编译器。
4、armcc
ARM 公司推出的编译工具,功能和 arm-none-eabi 类似,可以编译裸机程序(u-boot、kernel),但是不能编译 Linux 应用程序。armcc一般和ARM开发工具一起,Keil MDK、ADS、RVDS和DS-5中的编译器都是armcc,所以 armcc 编译器都是收费的(爱国版除外,呵呵~~)。
5、arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc
arm-none-uclinuxeabi 用于uCLinux,使用Glibc。
arm-none-symbianelf 用于symbian,没用过,不知道C库是什么 。
6、arm-linux-gnueabihf-gcc,mipsel-openwrt-linux-gcc, aarch64-gcc51_glibc222-linux-gnu-gcc
参考:http://www.cnblogs.com/wxishang1991/p/5322499.html
openWRT Linux系统简介
OpenWrt是一个开源项目,是针对嵌入式设备的Linux操作系统。多用于路由器、网关等设备上。整个openwrt linux系统已经提供了很多应用和网络组件,使得固件开发更为简单。(主流路由器固件有 dd-wrt,tomato,openwrt三类)。