交叉编译学习笔记(二)——交叉编译器的命名规则

搬运自本人 CSDN 博客:https://blog.csdn.net/ajianyingxiaoqinghan/article/details/70941600


交叉编译学习笔记(二)——交叉编译器的命名规则

在进行嵌入式开发过程中,用到的交叉编译器经常是这样的名称:

  • arm-linux-gcc
  • arm-none-linux-gnueabi-gcc
  • arm-linux-gnu-gcc

上面对应的交叉编译器的前缀有<code>arm-linux-</code>, <code>arm-none-linux-gnueabi-</code>, <code>arm-linux-gnu-</code>

笔者很困惑,这些编译器同为ARM下的gcc编译器,不同的命名到底会导致这些编译器有哪些区别?于是笔者开始在网上查阅资料,并进行总结。

参考网址:
http://blog.csdn.net/zqixiao_09/article/details/51823165
http://www.cnblogs.com/wxishang1991/p/5322499.html
http://blog.csdn.net/onlyshi/article/details/51952799
https://zhidao.baidu.com/question/1691117630864232868.html

一. 交叉编译器命名规则

交叉编译工具链的命名规则:

arch [-vendor][-kernel][-system]

其中每部分的含义如下:

  • arch:体系架构,如ARM, MIPS
  • vendor:工具链提供商
  • kernel:目标内核
  • system:目标系统
    • 一般为(gnu)eabi,即嵌入式应用二进制接口(Embedded Application Binary Interface)

另外ARM GCC可以根据是否支持操作系统进行分类。如:

  • arm-none-eabi:该编译器没有操作系统,不能支持那些与操作系统关系密切的函数(如fork(2))
  • arm-none-linux-eabi:该编译器用于Linux系统

1. arch

arch,即系统架构,表明交叉编译器的目标系统平台架构,即用该交叉编译器编译出的程序是运行在哪种CPU上。
常用的arch值如:

  • <code>arm-cortex_a8-linux-gnueabi</code>中的arm
  • <code>mips-ar2315-linux-gnu中</code>的mips
  • <code>powerpc-e500v2-linux-gnuspe</code>中的powerpc
  • <code>x86_64-unknown-mingw32</code>中的x86_64

2. [-vendor]

vendor,即工具链提供商,表示该交叉编译器提供者。
vendor的值貌似是可以随便填写的…… 但一般情况下,大家把vendor携程体系架构的值。如:

  • <code>arm-cortex_a8-linux-gnueabi</code>中的cortex_a8
  • <code>mips-ar2315-linux-gnu</code>中的ar2315
  • <code>powerpc-e500v2-linux-gnuspe</code>中的e500v2

另外,也有把vendor写成交叉编译器作者名字的。

3. [-kernel]

kernel,即内核,指使用该编译器编译出程序的目标系统。对应的环境或系统主要有两种:
(1) Linux:表示有操作系统(此处主要指Linux)的环境。
(2) bare-metal:直译为裸金属,表示无操作系统的环境。
比如用该交叉编译器编译一个U-boot或者其他小程序,是运行在无嵌入式Linux系统环境中单独运行的一个程序。又比如平常我们购买的嵌入式系统开发板中,常带有一些如跑马灯的小程序,这种也是运行在无操作系统环境的程序。

4. [-system]

system,直译为系统,其实主要表示交叉编译器所选择的库函数和目标系统。
常见的值有:<code>gnu</code>, <code>gnueabi</code>, <code>uclibcgnueabi</code>

(1) gnu

其实笔者并不知道这里的gnu是不是平常我们所说的gnu…… 那么笔者就默认为是吧…… GNU是一个自由软件工程项目。至于其他更多的信息,可以自行百度……
这里的gnu,貌似就是表示用的是glibc的意思。

(2) eabi

在说明eabi之前,需要先讲一下abi:

ABI
  即二进制应用程序接口(Application Binary Interface(ABI) for the ARM Architecture)。
  计算机中,应用二进制接口描述了应用程序和操作系统之间或其他应用程序的低级接口。
  一个完整的ABI,像Intel二进制兼容标准(iBCS),允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作系统上运行。
  ABI不同于API(应用程序接口)。API定义了源代码和库之间的接口,所以同样的代码可以在支持该API的任何系统中编译。而在使用兼容ABI的系统中,ABI允许编译好的目标代码无需改动,就能运行。

EABI为嵌入式ABI,即Embedded ABI。EABI指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中参数的标准约定。
EABI与ABI的主要区别,是应用程序代码中允许使用特权指令,不需要动态链接,并且使用更紧凑的堆栈帧组织用来节省内存。广泛使用EABI的有Power PC和ARM。

(3) uclibc

uclibc,是c库中的一种。

针对上述gnu, eabi, uclibc,对应的常见组合的含义为:

  • gnu = glibc + oabi
  • gnueabi = glibc + eabi
  • uclibc = uclibc + oabi

例:

  • arm-cortex_a8-linux-gnueabi中的nueabi,即glibc+eabi
  • mips-ar2315-linux-gnu中的gnu,即glibc+oabi
  • powerpc-e500v2-linux-gnuspe中的gnuspe
  • x86_64-unknown-mingw32中的mingw32,用的是64位Windows下的mingw32的库

二. 交叉编译工具链举例

1. arm-none-eabi-gcc

  • arch: arm (ARM architecture)
  • vendor: none (NO vendor)
  • kernel: (empty) (not target an operating system)
  • system: eabi (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

  • arch: arm (ARM architecture)
  • vendor: none (NO vendor)
  • kernel: linux (creates binaries that run on the Linux operating system)
  • system: gnueabi (uses the GNU EABI)

该编译器主要用于基于ARM架构的Linux系统,可用于编译 ARM 架构的u-boot、Linux内核、linux应用等。
arm-none-linux-gnueabi基于 gcc ,使用 glibc 库,是经过 Codesourcery 公司优化过推出的编译器,且该交叉编译工具的浮点运算非常优秀。一般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-sysbianelf-gcc

  • arm-none-uclinuxeabi用于uCLinux,使用glic
  • arm-none-symbianelf用于symbian(不了解)

6. arm-linux-gnueabi-gcc & arm-linux-gnueabihf-gcc

两个交叉编译器名称上的区别在于 gnueabi 与 gnueabihf,分别适用于 armel 和 armhf 两个不同的架构,armel 和 armhf 这两种架构在浮点运算上采用了不同的策略(有 fpu 的 arm 才能支持这两种浮点运算策略)。
其实这两个交叉编译器只是在 gcc 的选项 -mfloat-abi 的默认值不同。gcc的选项-mfloat-abi有三种值:soft, softfp, hard,其值含义如下:

  • soft: 不用fpu进行浮点计算(即使有fpu浮点运算单元,也不使用fpu);
  • softfp: armel架构(对应编译器是arm-linux-gnueabi-gcc)的默认值,用 fpu 计算,但传参数时使用普通寄存器。这样中断的时候,只需要保存普通寄存器,且中断负荷小,但参数需要转换成浮点数之后再计算;
  • hard: armhf架构(对应编译器是arm-linux-gnueabihf-gcc)的默认值,用 fpu 计算,传参数也用 fpu 中的浮点寄存器传递。这样省去了转换,性能最好,但中断负荷高。

测试两个编译器的代码如下:

    #include <stdio.h>  
    int main(void)  
    {  
        double a,b,c;  
        a = 23.543;  
        b = 323.234;  
        c = b/a;  
        printf(“the 13/2 = %f\n”, c);  
        printf(“hello world !\n”);  
        return 0;  
    }  

使用“-v”选项以获取更详细的信息:
(1) 使用 arm-linux-gnueabihf-gcc 编译
输入指令如下:

arm-linux-gnueabihf-gcc -v mfloat.c

输出信息如下:
<code>COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=hard’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’
-mfloat-abi=hard</code>
可看出使用hard硬件浮点模式。
(2) 使用 arm-linux-gnueabi-gcc 编译
输入指令如下:

arm-linux-gnueabi-gcc -v mfloat.c

输出信息如下:
<code>COLLECT_GCC_OPTIONS=’-v’ ‘-march=armv7-a’ ‘-mfloat-abi=softfp’ ‘-mfpu=vfpv3-d16′ ‘-mthumb’ -mfloat-abi=softfp</code>
可看出使用softfp浮点模式。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,898评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,401评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,058评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,539评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,382评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,319评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,706评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,370评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,664评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,715评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,476评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,326评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,730评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,003评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,275评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,683评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,877评论 2 335

推荐阅读更多精彩内容