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

一: 两个交叉编译器分别适用于 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 <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;
}

(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编译(使用“-v”选项以获取更详细的信息):
# 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模式。

其他:

一. 什么是ABI和EABI
(1)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.

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值