目录

  • 一、ABI 和 EABI
    • 1) ABI
    • 2) EABI
  • 二、 gnueabi 相关的两个交叉编译器:gnueabi 和 gnueabihf
  • 三. 拓展阅读
  • 四、arm工具的具体介绍
    • 1)arm-none-eabi-gcc
    • 2)arm-none-linux-gnueabi-gcc
    • 3)arm-eabi-gcc
    • 4)armcc
    • 5)arm-none-uclinuxeabi-gcc 和 arm-none-symbianelf-gcc

https://www.cnblogs.com/wybliw/p/11437191.html
http://www.vjiot.net/typecho/index.php/archives/75/

一、ABI 和 EABI

1) ABI

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

ABI涵盖了各种细节,如:

  • 数据类型的大小、布局和对齐;
  • 调用约定(控制着函数的参数如何传送以及如何接受返回值);

 例如,是所有的参数都通过栈传递,还是部分参数通过寄存器传递;哪个寄存器用于哪个函数参数;通过栈传递的第一个函数参数是最先push到栈上还是最后;

 系统调用的编码和一个应用如何向操作系统进行系统调用;以及在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等等。

 一个完整的ABI,像Intel二进制兼容标准 (iBCS) ,允许支持它的操作系统上的程序不经修改在其他支持此ABI的操作体统上运行。ABI不同于应用程序接口(API),API定义了源代码和库之间的接口,因此同样的代码可以在支持这个API的任何系统中编译,ABI允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行。

2) EABI

嵌入式ABI,嵌入式应用二进制接口指定了文件格式、数据类型、寄存器使用、堆积组织优化和在一个嵌入式软件中的参数的标准约定。

开发者使用自己的汇编语言也可以使用EABI作为与兼容的编译器生成的汇编语言的接口。

支持EABI的编译器创建的目标文件可以和使用类似编译器产生的代码兼容,这样允许开发者链接一个由不同编译器产生的库。

EABI与关于通用计算机的ABI的主要区别是应用程序代码中允许使用特权指令,不需要动态链接(有时是禁止的),和更紧凑的堆栈帧组织用来节省内存。广泛使用EABI的有Power PC和ARM。

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

二、 gnueabi 相关的两个交叉编译器:gnueabi 和 gnueabihf

在debian源里这两个交叉编译器的定义如下:

gcc-arm-linux-gnueabi – The GNU C compiler for armel architecture
gcc-arm-linux-gnueabihf – The GNU C compiler for armhf architecture

 可见这两个交叉编译器适用于 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架构(对应的编译器为gcc-arm-linux-gnueabi)采用的默认值,用fpu计算,但是传参数用普通寄存器传,这样中断的时候,只需要保存普通寄存器,中断负荷小,但是参数需要转换成浮点的再计算。
  • hard : armhf架构(对应的编译器gcc-arm-linux-gnueabihf)采用的默认值,用fpu计算,传参数也用fpu中的浮点寄存器传,省去了转换, 性能最好,但是中断负荷高。
  • arm64:64位的arm默认就是hard float的,因此不需要hf的后缀。

把以下测试使用的C文件内容保存成 mfloat.c:

#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;
}

使用 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硬件浮点模式。

使用 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模式。

三. 拓展阅读

 下文阐述了ARM代码编译时的软浮点(soft-float)和硬浮点(hard-float)的编译以及链接实现时的不同。从VFP浮点单元的引入到软浮点(soft-float)和硬浮点(hard-float)的概念。

VFP (vector floating-point)
 从ARMv5开始,就有可选的 Vector Floating Point (VFP) 模块,当然最新的如 Cortex-A8, Cortex-A9 和 Cortex-A5 可以配置成不带VFP的模式供芯片厂商选择。
VFP经过若干年的发展,有VFPv2 (一些 ARM9 / ARM11)、 VFPv3-D16(只使用16个浮点寄存器,默认为32个)和VFPv3+NEON (如大多数的Cortex-A8芯片) 。对于包含NEON的ARM芯片,NEON一般和VFP公用寄存器。

硬浮点Hard-float
 编译器将代码直接编译成发射给硬件浮点协处理器(浮点运算单元FPU)去执行。FPU通常有一套额外的寄存器来完成浮点参数传递和运算。
使用实际的硬件浮点运算单元FPU当然会带来性能的提升。因为往往一个浮点的函数调用需要几个或者几十个时钟周期。

软浮点 Soft-float
 编译器把浮点运算转换成浮点运算的函数调用和库函数调用,没有FPU的指令调用,也没有浮点寄存器的参数传递。浮点参数的传递也是通过ARM寄存器或者堆栈完成。
现在的Linux系统默认编译选择使用hard-float,即使系统没有任何浮点处理器单元,这就会产生非法指令和异常。因而一般的系统镜像都采用软浮点以兼容没有VFP的处理器。

armel ABI和armhf ABI
 在armel中,关于浮点数计算的约定有三种。以gcc为例,对应的-mfloat-abi参数值有三个:soft,softfp,hard。
soft是指所有浮点运算全部在软件层实现,效率当然不高,会存在不必要的浮点到整数、整数到浮点的转换,只适合于早期没有浮点计算单元的ARM处理器;
 softfp是目前armel的默认设置,它将浮点计算交给FPU处理,但函数参数的传递使用通用的整型寄存器而不是FPU寄存器;
 hard则使用FPU浮点寄存器将函数参数传递给FPU处理。需要注意的是,在兼容性上,soft与后两者是兼容的,但softfp和hard两种模式不兼容。
 默认情况下,armel使用softfp,因此将hard模式的armel单独作为一个abi,称之为armhf。
 而使用hard模式,在每次浮点相关函数调用时,平均能节省20个CPU周期。对ARM这样每个周期都很重要的体系结构来说,这样的提升无疑是巨大的。
在完全不改变源码和配置的情况下,在一些应用程序上,使用armhf能得到20%——25%的性能提升。对一些严重依赖于浮点运算的程序,更是可以达到300%的性能提升。

Soft-float和hard-float的编译选项
 在CodeSourcery gcc的编译参数上,使用-mfloat-abi=name来指定浮点运算处理方式。-mfpu=name来指定浮点协处理的类型。
可选类型如fpa,fpe2,fpe3,maverick,vfp,vfpv3,vfpv3-fp16,vfpv3-d16,vfpv3-d16-fp16,vfpv3xd,vfpv3xd-fp16,neon,neon-fp16,vfpv4,vfpv4-d16,fpv4-sp-d16,neon-vfpv4等。
使用-mfloat-abi=hard (等价于-mhard-float) -mfpu=vfp来选择编译成硬浮点。使用-mfloat-abi=softfp就能兼容带VFP的硬件以及soft-float的软件实现,运行时的连接器ld.so会在执行浮点运算时对于运算单元的选择,
是直接的硬件调用还是库函数调用,是执行/lib还是/lib/vfp下的libm。-mfloat-abi=soft (等价于-msoft-float)直接调用软浮点实现库。

在ARM RVCT工具链下,定义fpu模式:

  • –fpu softvfp
  • –fpu softvfp+vfpv2
  • –fpu softvfp+vfpv3
  • –fpu softvfp+vfpv_fp16
  • –fpu softvfp+vfpv_d16
  • –fpu softvfp+vfpv_d16_fp16.

定义浮点运算类型

  • –fpmode ieee_full : 所有单精度float和双精度double的精度都要和IEEE标准一致,具体的模式可以在运行时动态指定;
  • –fpmode ieee_fixed : 舍入到最接近的实现的IEEE标准,不带不精确的异常;
  • –fpmode ieee_no_fenv :舍入到最接近的实现的IEEE标准,不带异常;
  • –fpmode std :非规格数flush到0、舍入到最接近的实现的IEEE标准,不带异常;
  • –fpmode fast : 更积极的优化,可能会有一点精度损失。

四、arm工具的具体介绍

1)arm-none-eabi-gcc

arm-none-eabi-gcc (ARM architecture,no vendor,not target an operating system,complies with the ARM EABI)

Arm官方用于编译 ARM 架构的裸机系统(包括 ARM Linux 的 boot、kernel,不适用编译 Linux应用),一般适合 ARM7、Cortex-M 和 Cortex-R 内核的芯片使用,

所以不支持那些跟操作系统关系密切的函数,比如fork(2),他使用的是 newlib 这个专用于嵌入式系统的C库。

下载地址

2)arm-none-linux-gnueabi-gcc

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。

交叉编译器 arm-linux-gnueabi,arm-linux-gnueabihf,arm-none-linux等的区别相关推荐

  1. 交叉编译器arm-linux-gcc

    (一)交叉编译器简介 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,这个编译过程就叫交叉编译.简单地说,就是在一个平台上生成另一个平台上的可执行代码.(二)体系结构与操作系统 ...

  2. 2019-11-07 检查gcc交叉编译器预定义宏(ARM32/ARM64/X86-64)以及对浮点数的支持情况

    预备知识1 armel.armhf和arm64区别选择 https://www.veryarm.com/872.html 预备知识2 https://www.veryarm.com/872.html ...

  3. arm linux gnueabi编译,交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别

    本身以前一直没搞清楚这两个交叉编译器到底有什么问题,特地google一番,总结以下,但愿能帮到道上和我有一样困惑的兄弟-..linux 一. 什么是ABI和EABI 1) ABI: 二进制应用程序接口 ...

  4. 交叉编译器的命名规则及详细解释(arm/gnu/none/linux/eabi/eabihf/gcc/g++)

    在linux系统下搞嵌入式开发,交叉编译器那肯定是必备工具.用的场合多了,就会见到各种各样的编译工具,比如: arm-linux-gcc arm-linux-gnueabi-gcc arm-none- ...

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

    命名规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] [-gcc] arch – 体系架构,如ARM,MIPS vendor – 工具链提供商 os ...

  6. centos arm linux gcc,CentOS安装arm-linux-gcc交叉编译器

    (注:首先需要明确需要安装centos系统的位数,即是32位的还是64位的.) 1.下载并解压文件:下载arm-linux-gcc-4.4.3.tgz到任意的目录下,进入这个文件夹 输入命令:# ta ...

  7. Linux安装arm交叉编译器

    Linux安装arm交叉编译器 总结一下Linux(本文是基于Ubuntu16.04 64位版)下arm交叉编译工具链的安装及配置步骤,按照此顺序可以避免很多不必要的错误. 注意:建议在执行以下所有命 ...

  8. Linux下安装和配置ARM交叉编译器

    本篇为基于Linux-Ubuntu20.04下配置安装ARM交叉编译器,"arm-linux-gcc交叉编译器"云盘链接放置文章底部,有需要可自提 1. 第一步 在windows下 ...

  9. linux编译freebsd,freebsd下作x86/arm linux的交叉编译器

    freebsd下作x86/arm linux的交叉编译器 2009-05-13 01:40:08来源:未知 阅读 () 以纯粹的源码编译交叉编译器,还是头一遭.以往都是利用目标主机上的头文件和库文件作 ...

  10. 嵌入式ARM+Linux 多个不同版本的交叉编译器的切换方法

    工欲善其事,必先利其器!软件工具的选择与使用,是开发人员必须重视的事情. 我这里在VM虚拟机安装的CentOS 6.5,开发编译基于ARM的嵌入式Linux,安装了几个版本的交叉编译器,以下是如何切换 ...

最新文章

  1. TVM图优化与算子融合
  2. MyBatis中使用流式查询避免数据量过大导致OOM
  3. 操作系统学习:实模式进入保护模式
  4. 不管你的x86能不能升级Win 11,反正树莓派能!|安装教程
  5. 向代码节添加代码编程实现
  6. Django上传文件及分页
  7. Unity之CharacterController2D学习笔记(1)——基础使用
  8. java循环标号_java 标号 break 自循环
  9. 解读:滴滴“猜你去哪儿”功能的算法实现
  10. 360 nginx+php,windows Nginx+PHP7+Mysql独立环境部署
  11. 对文式编程的一些误解
  12. 回发或回调参数无效。在配置中使用 或在页面中使用 启用了事件验证....
  13. 软件任我行 10步菜鸟快易通上手教程
  14. android mp4视频下载测试地址亲测有效
  15. flask---》Marshmallow介绍及基础使用
  16. 软件“生命”系统进化论——软件以负熵为生!
  17. 使用Cajviewer打开pdf文档的一个发现
  18. 建模simulink - xpc调试手段
  19. django - celery
  20. 购物搜索引擎/比较购物网站

热门文章

  1. Spring Cloud (Eureka,Feign,Hystrix整合)
  2. 软件测试---前言篇
  3. 甘特图:项目进度管理中的跟踪工具
  4. 一款极简的在线甘特图项目管理软件
  5. Jmeter javax.swing.text.BadLocationException: Position not represented by view 解决方法
  6. 软件调试系列:软件崩溃篇之内存异常崩溃
  7. 程序员能成为自由职业者吗?
  8. 通过ip无法获得计算机名称,电脑获取不到IP地址如何解决
  9. 基于安卓的校园跳蚤市场app
  10. 视频教程-微信小程序商城15天从零实战课程-微信开发