交叉编译器 arm-linux-gnueabi 和 arm-linux-gnuea

如题所述

一. 什么是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.
二. 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中的浮点寄存器传,省去了转换, 性能最好,但是中断负荷高。
温馨提示:内容为网友见解,仅供参考
第1个回答  2017-10-18
自己之前一直没搞清楚这两个交叉编译器到底有什么问题,特意google一番,总结如下,希望能帮到道上和我有同样困惑的兄弟… 一 什么是ABI和EABI 1) ABI: 二进制应用程序接口(Application Binary Interface (ABI) for the ARM Architecture) 在计算交叉编译器 arm-linux-gnueabi 和 arm-linux-gnuea本回答被提问者采纳

交叉编译器 arm-linux-gnueabi 和 arm-linux-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这两种架构在对待浮点运算采取了不同的策略(...

交叉编译器 arm-linux-gnueabi 和 arm-linux-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的ar...

交叉编译器 arm-linux-gnueabi 和 arm-linux-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这两种架构在对待浮点运算采取了不同的策略(...

交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别...
hf是hard float的意思,它会把浮点数计算编译成浮点处理器专门的指令 写一个测试函数float fun(float f1, float f2){return f1 + f2;} 非hf: ldrr1, [fp, #-12]@ float;普通load指令 ldrr0, [fp, #-8]@ float bl__aeabi_fadd;调用一个函数实现...

ARM交叉编译器介绍
最后,arm-linux-gnueabi-gcc和arm-linux-gnueabihf-gcc是针对不同架构(armel和armhf)的交叉编译器。armel架构使用arm-linux-gnueabi-gcc,它采用softfp模式,即使有fpu也不使用,而是使用软件模式进行浮点计算。armhf架构使用arm-linux-gnueabihf-gcc,采用hard模式,使用fpu进行浮点计算,提供最佳性能,但...

交叉编译器 arm-linux-gnueabi 和 arm-linux-gnueabihf 的区别...
export ORA_NLS33=$ORACLE_HOME\/ocommon\/nls\/admin\/data LD_LIBRARY_PATH=${HOME}\/spprocpool-0.5{HOME}\/libORACLE_HOME\/libLD_LIBRARY_PATH 以上,在编译程序的时候加上 -L\/u01\/oracle\/9.2.0.4\/lib -lclntsh -locilib

交叉编译工具链 arm-arago-linux-gnueabi-gcc 中的arago和gnueabi代表...
gnueabi: C Library arago 那个段落,表示的是供应商,对于 arm 这里也可以是 hardfloat 或者 softfloat ,也就是使用的是硬浮点还是软浮点。当然其实这个东西是在编译 gcc 时,通过 --with-float= 指定而不是通过这里进行识别。但有的时候,一些编译脚本会识别这里来确定浮点运算器是软是硬。gnueabi...

arm-none-linux-gnueabi交叉工具链与arm-linux-gcc 有区别吗
export CROSS_COMPILE=\/usr\/local\/arm-2008q3\/bin\/arm-none-linux-gnueabi- 在大多数情况下,你并不需要将上面的export命令加入~\/.bashrc这样的文件,因为,你并不总是需要它们来做交叉编译。比如,你仅仅希望编译运行在开发主机上的程序时。这样,工具链就准备好了。

嵌入式ARM linux操作系统中如何构建交叉开发环境?
vmuser@Linux-host \/tmp$ # 输入vmuser用户的密码“vmuser”执行完解压命令后,交叉编译工具链将被安装到“\/opt\/gcc-4.4.4-glibc-2.11.1-multilib-1.0”目录下。交叉编译器的具体目录是“\/opt\/gcc-4.4.4-glibc-2.11.1-multilib-1.0\/arm-fsl-linux-gnueabi\/bin”,为了方便使用,还需将...

...arm-linux-gcc命令出现arm-none-linux-gnueabi: no input files是...
命令后要跟源文件名,原文件要在当前目录下,还要在$PATH中指定交叉编译工具链的位置。

相似回答