历史上的今天
返回首页

历史上的今天

今天是:2024年12月04日(星期三)

正在发生

2019年12月04日 | arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf的区别

2019-12-04 来源:eefocus

命名规则

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

  • arch – 体系架构,如ARM,MIPS

  • vendor – 工具链提供商

  • os – 目标操作系统

  • eabi – 嵌入式应用二进制接口(Embedded Application Binary Interface)

注意

  1. 没有vendor时,用none代替;

  2. 没有os支持时,也用none代替

  3. 同进没有vendor和os支持时,只用一个none代替,比如arm-none-eabi中的none表示既没有vendor也没有os支持。

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

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

  • arm-none-linux-eabi:没有vendor的、用于Linux的,使用Glibc

实例

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库是什么 。

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接受,所以还是应该直接用它的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 才能支持这两种浮点运算策略)。

其实这两个交叉编译器只不过是 gcc 的选项 -mfloat-abi 的默认值不同。gcc 的选项 -mfloat-abi 有三种值 soft、softfp、hard(其中后两者都要求 arm 里有 fpu 浮点运算单元,soft 与后两者是兼容的,但 softfp 和 hard 两种模式互不兼容): 
soft: 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。 
softfp: armel架构(对应的编译器为 arm-linux-gnueabi-gcc )采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。 
hard: armhf架构(对应的编译器 arm-linux-gnueabihf-gcc )采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换,性能最好,但是中断负荷高。

把以下测试使用的C文件内容保存成 mfloat.c: 
#include  
int main(void) 

double a,b,c; 
a = 23.543; 
b = 323.234; 
c = b/a; 
printf(“the 13/2 = %fn”, c); 
printf(“hello world !n”); 
return 0; 
}

1、使用 arm-linux-gnueabihf-gcc 编译,使用“-v”选项以获取更详细的信息: 
# arm-linux-gnueabihf-gcc -v mfloat.c 
COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=hard’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’ 
-mfloat-abi=hard

可看出使用hard硬件浮点模式。

2、使用 arm-linux-gnueabi-gcc 编译: 
# arm-linux-gnueabi-gcc -v mfloat.c 
COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=softfp’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’ 
-mfloat-abi=softfp

可看出使用softfp模式。

交叉编译工具

参考资料

  1. 交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别:http://www.cnblogs.com/xiaotlili/p/3306100.html

  2. arm-none-linux-gnueabi,arm-none-eabi 与arm-eabi 区别:http://blog.csdn.net/mantis_1984/article/details/21049273

  3. What’s the difference between arm-linux- / arm-none-linux-gnueabi- / arm-fsl-linux-gnueabi- in LTIB?https://community.freescale.com/thread/313490

  4. https://wiki.debian.org/ArmEabiPort

 

eabi是arm新的二进制文件接口的标准,elf是二进制目标文件的格式,而名称为arm-elf的编译器一般是老的OABI接口,裸奔程序到影响不大,在嵌入式linux中,要注意系统的接口,是老的oabi还是eabi,新的内核一般是eabi接口,但编译内核时会有兼用oabi接口的选项,默认是没选择的,需要的话编译时需要手动选上

 

那个none指的是没有操作系统的意思


推荐阅读

史海拾趣

Andigilog公司的发展小趣事

Andigilog是一家专注于提供模拟和混合信号集成电路解决方案的公司,以下是该公司发展的相关故事:

  1. 公司成立与早期发展:Andigilog成立于2002年,总部位于美国加利福尼亚州的圣何塞。该公司成立之初,专注于设计和销售模拟和混合信号集成电路(IC),以满足各种市场的需求。最初,公司的产品主要应用于电源管理、温度监测和控制等领域。

  2. 技术创新与产品推出:Andigilog在成立初期就致力于技术创新和产品研发。随着市场需求的不断变化,公司不断推出新型的集成电路产品,包括温度传感器、电源监测芯片等。这些产品具有高精度、低功耗、高集成度等优点,受到了客户的青睐。

  3. 合作伙伴关系与市场拓展:为了扩大市场份额和提升品牌知名度,Andigilog与各种合作伙伴建立了紧密的合作关系。公司与全球各地的分销商、代理商、原始设备制造商(OEM)等进行合作,共同开拓市场,推广公司的产品。此外,Andigilog还与行业内的其他公司进行技术合作和产品整合,共同提供更完整的解决方案。

  4. 全球布局与生产基地:随着业务的不断扩展,Andigilog在全球建立了多个生产基地和销售办事处。除了在美国的总部外,公司还在亚洲、欧洲等地区设立了生产工厂和销售办事处,以更好地服务全球客户。这些生产基地拥有先进的制造设备和技术,能够满足客户对产品质量和交货周期的要求。

  5. 持续发展与未来展望:作为一家专注于模拟和混合信号集成电路的公司,Andigilog将继续致力于技术创新和产品发展。公司将不断推出适应市场需求的新产品,提升生产效率和产品质量,以满足客户不断变化的需求。同时,Andigilog也将继续关注行业的发展趋势和技术变革,不断调整战略,保持在行业内的竞争优势。

Ferroxcube公司的发展小趣事

在21世纪初,随着电子行业的飞速发展,对于高性能磁性元件的需求也日益增长。Ferroxcube公司,作为世界第二大磁性元件生产商,凭借其卓越的技术和产品质量,迅速在市场上占据了一席之地。公司不断投入研发,推出了一系列创新的磁芯和磁环产品,深受客户好评。

在一次重要的行业展会上,Ferroxcube展示了一款新型的高性能磁芯,其优越的性能和稳定性吸引了众多行业内人士的关注。一家知名的电源制造商对这款产品表现出了浓厚的兴趣,并表达了合作的意愿。经过几轮深入的洽谈,双方达成了战略合作协议,Ferroxcube的磁芯成为了这家电源制造商的首选元件。

这一合作不仅为Ferroxcube带来了大量的订单,还提升了公司在行业内的知名度和影响力。公司借此机会加大了研发投入,进一步巩固了其在磁性元件领域的领先地位。

Enterpoint公司的发展小趣事

在Enterpoint公司的发展过程中,他们始终将客户服务放在首位。公司建立了一套完善的客户服务体系,为客户提供从产品咨询、技术支持到售后服务的全方位支持。这种对客户的关注和投入,不仅赢得了客户的信任和好评,也为公司的品牌建设打下了坚实的基础。

Actel公司的发展小趣事

为了进一步扩大市场份额,Enterpoint公司开始积极拓展国际市场。他们通过参加国际电子展会、建立海外销售网络等方式,不断提升品牌知名度和影响力。同时,公司还积极寻求与国际知名企业的合作机会,通过技术交流和产品合作,不断提升自身的技术实力和产品质量。

E-Mark Inc公司的发展小趣事

JKL公司是一家创新型电子企业,专注于研发新能源汽车电子控制系统。为了推动新能源汽车的发展并满足欧洲市场的需求,JKL公司决定对其产品进行E-Mark认证。在认证过程中,JKL公司积极投入研发资源,不断创新技术,提升产品的智能化和安全性。最终,JKL公司的产品成功获得了E-Mark认证,并在欧洲市场得到了广泛应用和认可。这一认证不仅加速了JKL公司新能源汽车技术的市场推广速度,也提升了公司在国际市场的竞争力。

Euroquartz公司的发展小趣事

Euroquartz自创立之初,就将产品质量和客户满意度置于公司运营的核心。为了确保这一点,公司引入了完整的AS9100 Rev D质量体系,并通过了相应的认证。这一体系要求Euroquartz在制造程序和可追溯性方面保持完整的记录,审批机关会定期进行审核,确保品质始终如一。这种对品质的执着追求,为Euroquartz赢得了客户的信赖,也为公司的发展奠定了坚实的基础。

问答坊 | AI 解惑

并口调试工具

一个并口(LPT-1)的调试工具.真的很好用.有搞PC机并口开发的朋友就用到它了! [ 本帖最后由 西门 于 2009-5-11 23:53 编辑 ]…

查看全部问答>

关于c51的时间问题!

看看下面的代码,为什么我把程序烧到单片机中之后,L1先亮,过半秒之后就L2,L3同时亮,然后一直都没有灭,为什么? #include sbit L1=P0^0; //L1,L3灯是10秒闪一次,L2是1秒闪一次, sbit L2=P0^1;//L1是有主函数的一个标记n控制的,L3直接由 ...…

查看全部问答>

请教SD卡保护区读写的问题

文档介绍SD卡有约1/10的空间是保护区(也是\"安全数字卡\"命名所在),但现在还不清楚这部分区域如果操作,如果上文件系统,更不清楚这部分的数据保护功能能否使用的了,因为文件系统不能指定扇区,也就不能指定到保护区. 1.SD的保护区如何操作? 2.如果 ...…

查看全部问答>

请问,usb的键盘扫描码和ps/2的键盘扫描码一样么? 另外ps/2的组合键(比如ctrl+c)扫描码是什么呢?

RT 谢谢了,小弟在做毕业设计,需要知道这些,可是查不出来啊,望赐教。…

查看全部问答>

求书:Computer Organization and Design:: The Hardware/Software Interface

找了好久都找不到,有这本书的同学,还请共享一下…

查看全部问答>

LWIP超过200字节数据接收乱码

在用Lwip接收SOCKET调试工具发送的超过200字节数组给LM3s8962处理时,200字节以后的数据出现乱码问题:   过程: 用SOCKET工具发送0123456789的序列,如图SocketData1.jpg:   现象: 在 Keil中调试信息,如图SocketData2.jpg: & ...…

查看全部问答>

如何给一个数组分配一段特定的存储空间

如何给一个数组分配一段特点的存储空间。如想给数组S[1024]分配一段特定存储空间。使用#pragma具体怎么操作。…

查看全部问答>

请进!!!

电路菜鸟,,请问各位,,图中的L100是什么东西呢??…

查看全部问答>

5509寄存器地址问题----多谢帮忙啊

这是我的LCD1602程序,请问这两个地址是怎么冒出来的 #define LCD_COM (*((unsigned int *)0x601000)) #define LCD_DAT (*((unsigned int *)0x601002)) #define command 0               &nb ...…

查看全部问答>