一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 3524|回复: 6
收起左侧

arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别

[复制链接]
发表于 2017-4-1 11:32 | 显示全部楼层 |阅读模式
目录

: a8 x+ s7 C. b! F/ N命名规则
交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi]
  • arch - 体系架构,如ARM,MIPS
  • vendor - 工具链提供商
  • os - 目标操作系统
  • eabi - 嵌入式应用二进制接口(Embedded Application Binary Interface
    1 K/ o: I: v2 g: t
根据对操作系统的支持与否,ARM GCC可分为支持和不支持操作系统,如
  • arm-none-eabi:这个是没有操作系统的,自然不可能支持那些跟操作系统关系密切的函数,比如fork(2)。他使用的是newlib这个专用于嵌入式系统的C库。
  • arm-none-linux-eabi:用于Linux的,使用Glibc6 D' J' r5 T6 Y% t  |

! g7 Z; I+ O5 s/ x- i; f) u 实例1、arm-none-eabi-gcc
(ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)8 W% z3 g" w* ^1 s. }
用于编译 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库是什么 。

$ b0 G/ O, Z7 H. tCodesourcery
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等)。
8 |  Z. }- G$ v" J! B0 b% M9 Y# Z
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 两种模式互不兼容):. c5 _& y0 v, N4 s: G% ?
soft: 不用fpu进行浮点计算,即使有fpu浮点运算单元也不用,而是使用软件模式。
: M# X: r& R8 w  [7 Gsoftfp: armel架构(对应的编译器为 arm-linux-gnueabi-gcc )采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
& I" E9 G% s- L: i+ j' Xhard: armhf架构(对应的编译器 arm-linux-gnueabihf-gcc )采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换,性能最好,但是中断负荷高。
把以下测试使用的C文件内容保存成 mfloat.c:; }* p. @& a7 `6 P' Z
#include ( O( ~+ G0 \% B4 X' Q5 w' f, X
int main(void)+ M; Q' t- O7 ^5 C1 m- |- `! ]
{5 P7 K+ G1 g9 r
    double a,b,c;: c. A3 B8 j7 e
    a = 23.543;5 j, a+ N! i5 |0 ^( N# m) E8 Z3 i
    b = 323.234;4 B9 N! ^* s) l7 W  F6 L
    c = b/a;; ]1 v8 m- p9 R  @- s
    printf(“the 13/2 = %f”, c);
2 s6 e( }: J! `- s$ O6 Z2 w! X. P    printf(“hello world !”);
! ?' d3 y' f' `' I    return 0;
  S; Q$ r3 V& y4 X3 k# R. R" G}
1、使用 arm-linux-gnueabihf-gcc 编译,使用“-v”选项以获取更详细的信息:
: y. i5 p3 I* x* v9 m% {" \# arm-linux-gnueabihf-gcc -v mfloat.c
  k+ C# o# v! o7 v" f7 G$ q4 LCOLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=hard’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’* k2 |" C1 V5 I
-mfloat-abi=hard
可看出使用hard硬件浮点模式。
2、使用 arm-linux-gnueabi-gcc 编译:3 L& \! E  Z, j. H* S  Q/ Z5 O. ~
# arm-linux-gnueabi-gcc -v mfloat.c
7 e0 {( Q# l; `# I/ x2 FCOLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=softfp’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’) `) p( w# h: a7 u' j* o
-mfloat-abi=softfp
可看出使用softfp模式。

$ i0 ^; ~0 U+ Q1 X" C8 {
1461f9b2f976c97cbf509fac059688a1.png
交叉编译工具

5 M, j: a% d5 Q% F0 K( e参考资料
4 d8 x" P( {7 e- J& m8 M

评分

参与人数 1一乐金币 +30 收起 理由
hotdll + 30 很给力!

查看全部评分

 楼主| 发表于 2017-4-1 11:35 | 显示全部楼层
交叉编译器简介以及ARM交叉编译器arm-linux-gcc
6 D" ^7 P/ L& v+ l0 L" _( g  E1 H: Z" s3 ?+ x, T: m# T, w# ?
(一)交叉编译器简介
+ q) b6 [; q' A5 J, k( e$ S   在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,这个编译过程就叫交叉编译.简单地说,就是在一个平台上生成另一个平台上的可执行代码.! s. H( e9 R- [+ J( i  j+ n
4 U0 Z& i: I- X
(二)体系结构与操作系统
3 y: ?+ W7 O' |; o6 j3 x9 {/ g(1)常见的体系结构有ARM结构、x86结构等.+ G) o/ ~* e0 h/ w* ~" S1 z

4 v: W# i1 S. e; H& c/ Q(2)常见的操作系统有linux,windows等.5 M3 l% y' l: J

' f% B8 H5 C. N2 w/ s* S(3)同一个体系结构可以运行不同操作系统,如x86上可以运行Linux、Windows等,在ARM上可以运行Linux、WinCE.- V% S/ b2 A& m; C2 }  Q
8 m7 m& z, A. P) p
(4)同一个操作系统可以在不同的体系结构上运行,比如Linux可以运行在x86上,也可以运行在ARM上.2 J6 n# B8 i0 d9 G! s
/ u, v$ P* Z( X4 m: n3 e/ D( \* b7 K
(5)同样的程序不可能运行在多个平台上,比如Windows下应用程序不能在Linux下运行.如果一个应用程序想在另一个平台上运行,必须使用针对该平台的编译器,来重新编译该应用程序的二进制代码.比如在Linux系统下运行Windows平台的QQ软件,必须按照以下几个步骤:2 ^' d- C$ ~4 m
  1.QQ程序源代码* Q7 W  k" M5 P: n9 [
  2.使用Linux下的编译器来编译QQ软件的源代码
4 F  f) H; n4 \7 C# `, r) E  这样编译出来的可执行程序就可以在Linux下运行了.所以,如何使ARM来运行用户的应用程序呢,就需要用到针对ARM的编译器来编译程序.; i5 k% y1 i1 [7 w/ ^+ Z
" N' r& O# t0 X. D, X5 H# t
(三)使用交叉编译器的原因3 M2 y6 ]) c# s0 t2 }2 x, X. {
    ARM上可以运行操作系统,所以用户完全可以将ARM当做计算机来使用,理论上也可以在ARM上使用本地的编译器来编译程序.但是,编译器在编译程序时,会产生大量的中间文件,这会占用很大的内存和磁盘空间,且对CPU处理速度要求较高,比如S3C2440A内存、磁盘空间只有几十到100多兆,CPU只有400-500MHz,完全达不到编译程序的要求.所以,在进行ARM-linux嵌入式开发时必须在PC机(x86结构)上编译出能够运行在ARM上的程序,然后再将程序下载到ARM中来运行.这就用到了交叉编译器.
2 x- C% R; _& s, A$ E) b& o; p# x+ u, ]
   要进行交叉编译,用户需要在主机平台上安装对应的交叉编译工具链(cross compilation tool chain),然后用这个交叉编译工具链编译用户的源代码,最终生成可在目标平台上运行的代码.交叉编译工具链可以从网上下载,也可以自己制作.但编译器不是万能的,受版本限制,编译某些程序时会报错.
; ?: H! x; @( _0 j- b6 ]! E0 K! D9 [
常见的交叉编译工具链有:
% R2 Y4 b# o" ]
% b* E) B6 X9 {% [& i1 I   (1)Cross -2.95.3 tar:  该版本较早,除了编译vivi外一般不使用." f8 ]+ |" f' Z. Q" e, _9 O. g
; n- t& m/ c+ X
   (2)arm920t-eabi.tgz:  4.1.2版本的编译器,支持eabi,可以编译TX2440A开发板上的所有程序.: r5 r* K+ G% l$ a( Z$ s1 [" P  x

7 b$ N# T& n: t6 ~  ^: M4 {: ]   (3)arm-linux-gcc:  4.3.2版本的编译器,支持eabi,是最常见的交叉工具链.6 r& U& y) R/ }  I) o
% Y4 P& U( a6 K$ O; u& A
ARM交叉编译工具链的命名
. a4 a2 t; L" `$ A链接工具命名:; s) b% z! E7 J" e6 O2 \
arch-vendor-(os-)abi/ z7 u$ k3 p, U' q; Z: g
: L3 O1 o: ~2 }
1、arm-none-linux-gnueabi (ARM architecture, no vendor, linux OS, and the gnueabi ABI)/ g' ?" X. x2 L
用于编译ARM架构的u-boot、linux内核、linux应用等
2 d5 {) ]+ \4 j/ S5 K2、arm-none-eabi
+ E7 K0 n; C& L+ d用于编译ARM架构的裸机系统(包括linux的 boot、kernel)* I( Y$ v% i! a
3、arm-eabi $ t# f& g7 F8 T, U5 G8 [
Android ARM 编译器' D2 J- E! p* R
! }) g* k6 p. j" @2 v6 _* n
什么是EABI
; C9 {' f# c# ~: E   EABI,Embeded application binary interface,即嵌入式应用二进制接口,是描述可连接目标代码、库目标代码、可执行文件影像、如何连接、执行和调试以及目标代码生成过程和c、c++语言接口的规范,是编译连接工具的基础规范,也是研究它们工作原理的基础.简而言之,EABI就是一种编译规范,交叉编译器在编译时,对于浮点运算会使用硬浮点运算,而对于没有硬浮点运算的处理器,比如S3C2440,会使用软浮点,但这样会在速度上受到很大的限制,而EABI则对浮点运算进行了优化,提高了浮点运算的性能,节省了编译时间.2 x! U4 J) v8 M: Q5 B* U
(四)安装交叉工具链arm-linux-gcc 4.3.2
9 _- T7 W% B" Q- ?1 s" `! s   安装交叉编译器arm-linux-gcc就是在主机平台(pc机的Linux操作系统)上安装对应的交叉编译工具链,换句话说,是将交叉编译器arm-linux-gcc 4.3.2在Linux操作系统下安装.安装步骤:
- v( Q9 _( h0 ]+ Z% v
# E, d6 G% |& Z' P* h9 I0 L9 T! p(1)启动Samba服务器,打开共享目录/home/lishuai,将压缩文件arm-linux-gcc-4.3.2.tgz复制到/home/lishuai下.
% x( [' X: E9 D7 q
6 O: O. p; I* i; z+ d(2)解压软件包arm-linux-gcc-4.3.2.tgz.
* e$ C- Y. E: o
& i' x2 ~+ q! V/ h  [root@localhost lishuai]#tar xzvf arm-linux-gcc4.3.2.tgz1 R+ N1 U# B; w
" e( S7 I5 c9 b9 E  L3 G
   1.目录4.3.2就是该交叉编译器的目录.从arm-linux-gcc-4.3.2.tgz解压信息来看,该软件包需要解压在/usr/local/arm下,而实际却解压到了共享目录/home/lishuai下                              
, D  w' s: L2 `# n* G
9 U8 P/ x7 A: |. ~  X4 N2 {   2.进入目录/usr/local/内,并没有找到arm文件夹,所以需要新建一arm文件夹,再将目录4.3.2移动到新建目录usr/local/arm下.其中,4.3.2/bin就是arm-linux-gcc的可执行文件.
2 t# j( _" V7 h/ j& i1 C- U   [root@localhost local]#mv  /home/lishuai/usr/local/arm/4.3.2  ./      
2 Z$ U4 H: z4 I& g9 o
' S% L# p+ C$ v) R# n1 D1 t% p   3.进入目录/usr/local/arm/4.3.2/bin,可以看到不同类型的编译器.但在ARM下经常用到是arm-linux-gcc.其实它也是一个gcc编译器,与gcc使用方法一致,不过该编译器是针对arm体系结构、Linux操作系统的编译器.利用该编译器就可以编译出运行在ARM上的Linux操作系统下的应用程序.
7 n* y; J2 h1 f7 {& z
+ y% {- T2 [/ H2 d. Q  ~  4.进入目录/usr/local/arm/4.3.2/arm-none-linux-gnueabi.其中,lib目录下存放的是库文件,用户编写的应用程序在运行时就依赖于这些库文件.: b/ f& I$ V4 L" _, r
! V* L  e  S- u% F# m* L! @, a4 L/ E
  5.此时还不能编译源码,系统一般会提示找不到命令arm-linux-gcc.这是环境变量在作祟.所以必须修改环境变量PATH.
8 R) c6 h* m8 }9 ~& l/ i; j- D
: `* D5 y, D, {4 Z+ O   [root@localhost lishuai]#vi /etc/profile& B) x6 L9 M" X6 X1 @: {
9 O/ J. v% J3 v4 z  q2 o. K/ }$ v
   在"export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC"这一行的下面添加环境变量,
1 p3 r; d* }9 ~6 `9 B   输入:export PATH=/usr/local/arm/4.3.2/bin:$PATH! I; k  z. k, k% B0 U" ]$ A
   指定变量PATH为交叉编译器的路径,目的是告诉操作系统可以到目录/usr/local/arm/4.3.2/bin下查找可执行文件
4 E9 F; K; P" ~6 C2 @6 i  j) L  6.[root@localhost lishuai#:source /etc/profile  r8 a9 j$ h: ]" j. G& g( W

! n) a5 p  J. o9 s" D    //使已修改的配置文件/etc/profile生效$ ~4 e- G/ |+ s, c  u( M
5 h  N0 |, ~8 Y. S* u, H
  7.查看arm-linux-gcc编译器的版本+ I9 U1 u+ t9 `" f' t* {( Y

5 j2 O4 |. u: V/ e$ n# _$ L! m5 ?   [root@localhost lishuai]#arm-linux-gcc -v
; ]) V9 ]. R- W6 S+ A3 C, m5 M
4 Y2 Y. q: S* e0 N% k(五)arm-linu-gcc应用实例" M$ Q& W. _5 ]+ }# v1 j
实例:如何使用交叉编译器编译源码包boa-0.94.13.tar.tar
; l4 `0 R7 d% F; I( l1. 启动SMB服务器,将源码包放在共享文件夹/home/lishuai下: L% A+ a# q( H
2. 输入命令: tar xzvf boa-0.94.13.tar.tar- {. ~& m- e" I/ a( I0 `
/ e% C: @$ q1 c& B' ]) R
   // 解压该源码包           6 R& t, j- C1 X. E
* Y6 N4 l6 d+ @: `
   // 一般的源码包内有Makefile文件,执行make就可以编译,但该源码包内没有,此时执行make是无效的      
7 M: O/ Z9 r( z" d& S& \1 k" Y# G0 M  c3 ]) z; h' ^
   // 虽然没有Makefile,但找到了configure文件,通过执行configure文件可以生成Makefile5 Q8 {8 [# t3 ~. ]) z8 W% X; X
     [root@localhost lishuai]# ./configure
' s$ f5 Q- m9 g$ S/ x9 D, F$ f8 u
, O  G7 C0 Z3 P! O4 \  // 运行configure文件,生成了Makefile文件4 n  v% i% g( f' q, w5 z6 a
  // 由于要编译出在ARM平台上的程序,就需要使用交叉编译器.在Makefile文件内的绿色大写字母都是Makefile变量,可以看到变量CFLAGS = -g -o2 -pipe -Wall -l,该变量是设置编译选项;变量CC = gcc,该变量是设置需要使用的编译器.由于要使用交叉编译器arm-linux-gcc,所以该变量应设置为CC = arm-linux-gcc,CPP = arm-linux-gcc -E,保存并退出.
, H. E' O, K5 y/ j    [root@localhost lishuai]#make
* S! w9 y8 d- u4 Y1 W
( K# w# E6 I" W3 g- ]  // 执行make进行编译2 _; ~" ^7 a' K% F3 S; X8 T
  // 生成名为boa的可执行程序,该程序可下载到ARM内来执行' L0 q) u8 Y' u- ]# C; E& [$ r
0 U7 T2 s6 _3 D) G! X: M! N/ {
   其实,这个过程也叫做移植。移植就是将一个源码包经过修改、配置、交叉编译,然后下载到一个平台上运行.比如经常移植的有Bootloader、内核、QT等.
0 i1 t; s" o/ m! [" y5 A5 ]; t) @: B) e1 F

5 R, v- \$ n4 @; Whttp://www.voidcn.com/blog/hanzengyi/article/p-559330.html
发表于 2017-4-1 15:41 | 显示全部楼层
辛苦了。。。
发表于 2017-4-18 22:25 | 显示全部楼层
楼主辛苦了。对这方面一直很困惑,这下整理总结的非常详细清晰了。
发表于 2017-6-12 21:41 | 显示全部楼层
这个文章有点老了。最近研究arm的makefile和gcc,arm公司的gnu gcc编译器发布到6.x版本了,增加了一个新的微内核的lib库,比newlib还要小。0 Y0 \- h. l% \
Sourcery G++ Lite Edition 的lite版本已经不提供下载了。提供个人使用的还需要注册下载那个庞大的IDE。
1 W& L, @; B2 y
8 a9 c' ^) {: \7 Q% W4 u  g, T  V可以直接使用arm的gcc了。
 楼主| 发表于 2017-6-12 22:14 | 显示全部楼层
hotdll 发表于 2017-6-12 21:41( }2 k& `1 t) |- h
这个文章有点老了。最近研究arm的makefile和gcc,arm公司的gnu gcc编译器发布到6.x版本了,增加了一个新的 ...
$ {8 N7 p& C! }$ _$ P* _; B
这个是有点老,但了解一下还是可以的,我时不时也要看一下& I) u* o- B: r, n# {

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-3-29 18:38 , Processed in 0.054120 second(s), 32 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表