arm交叉编译器的区分

虚拟机里有arm-none-eabi-gcc编译器 和 arm-none-linux-gnueabi-gcc编译器,编译公司的代码,都是用后者。

但是,因为前几天编译修改SAMBA应用程序,死活编译不过。老提示,库不对,说启动脚本有问题,马蛋。。。。无奈,换了一个编译器,就好了。

至于怎么好的,也不知道咋回事

今天,翻看之前的保存的学习资料,发现一个问题,说启动根文件系统的时候,如果有时候卡在“ernel paic -not syncing: Attempted to kill init!,”,原因可能是配置的busybox应用的arm架构不一样,所以需要readelf下。检查架构是否一致。

然后,有的编译器有自己默认的支持的架构“(不知道哪里说了,后边再查查看!!!),比如codesourrce出品的arm-2009q1是默认支持armv5t。

然后,就想做个实验看看,换一下编译器试试,公司代码默认的编译器是arm-2007q1,网上下载的arm-2009q3,修改了makefile,编译,马蛋,提示有问题

“/usr/local/arm-2009q3/bin/../lib/gcc/arm-none-eabi/4.4.1/../../../../arm-none-eabi/include/termios.h:4: fatal error: sys/termios.h: No such file or directorycompilation terminated.”

error的意思是摸个包含的头文件没有找到!!!!难道这个编译器的C库没有???

于是,才引出下面一篇文章,真是千呼万唤始出来。。。。。。。。。。。。。。

原文地址引用,有侵权问题,,及时告知,谢谢。。。。。

文章分别讨论了各个arm编译器的不同,因为编译器有命名规则,所以从名字上可以区分基本的不同,

命名规则

交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi]

根据对操作系统的支持与否,ARM GCC可分为支持和不支持操作系统,如

arm-none-eabi:这个是没有操作系统的,自然不可能支持那些跟操作系统关系密切的函数,比如fork(2)。他使用的是newlib这个专用于嵌入式系统的C库。arm-none-linux-eabi:用于Linux的,使用Glibc

实例1、arm-none-eabi-gcc

(ARM architecture,novendor,nottarget 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,novendor,creates binaries that run on theLinuxoperating 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库是什么。

Codesourcery

Codesourcery推出的产品叫Sourcery G++ Lite Edition,其中基于command-line的编译器是免费的,在官网上可以下载,而其中包含的IDE和debug 工具是收费的,当然也有30天试用版本的。

目前CodeSourcery已经由明导国际(Mentor Graphics)收购,所以原本的网站风格已经全部变为Mentor 样式,但是 Sourcery G++ Lite Edition 同样可以注册后免费下载。

Codesourcery一直是在做ARM目标 GCC 的开发和优化,它的ARM GCC在目前在市场上非常优秀,很多 patch 可能还没被gcc接受,所以还是应该直接用它的(而且他提供Windows下[mingw交叉编译的]和Linux下的二进制版本,比较方便;如果不是很有时间和兴趣,不建议下载 src 源码包自己编译,很麻烦,Codesourcery给的shell脚本很多时候根本没办法直接用,得自行提取关键的部分手工执行,又费精力又费时间,如果想知道细节,其实不用自己编译一遍,看看他是用什么步骤构建的即可,如果你对交叉编译器感兴趣的话。

ABI 和 EABI

ABI:二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture)。在计算机中,应用二进制接口描述了应用程序(或者其他类型)和操作系统之间或其他应用程序的低级接口。

EABI:嵌入式ABI。嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。开发者使用自己的汇编语言也可以使用 EABI 作为与兼容的编译器生成的汇编语言的接口。

两者主要区别是,ABI是计算机上的,EABI是嵌入式平台上(如ARM,MIPS等)。

arm-linux-gnueabi-gcc 和 arm-linux-gnueabihf-gcc

两个交叉编译器分别适用于 armel 和 armhf 两个不同的架构,armel 和 armhf 这两种架构在对待浮点运算采取了不同的策略(有 fpu 的 arm 才能支持这两种浮点运算策略)。

初初尝试着拥抱的人,一派新鲜幸福都来不及沉浸,

arm交叉编译器的区分

相关文章:

你感兴趣的文章:

标签云: