首页 > 编程知识 正文

openssl交叉编译,交叉编译mingw

时间:2023-05-04 05:48:37 阅读:125005 作者:3061

目录一、ABI和EABI1) ABI2) eabi 2、gnueabi相关的两个交叉编译器,gnueabi和gnueabihf三。 扩展阅读四、arm工具具体介绍1 ) arm-none-eabi-gcc2) arm-none-linux-gnueabi-gcc3) arm-eabi-gcc4) armcc5 ) arm-none-gcc

https://www.cn blogs.com/wy bliw/p/11437191.html

33558 www.VJ IOT.net/typecho/index.PHP/archives/75 /

另一方面,ABI和EABI 1)描述ABI ABI 是二进制应用程序接口 (Application Binary Interface (ABI) for the ARM Architecture)计算机中的APP应用程序(或其他类型)和操作系统之间或其他APP应用程序的低级接口的APP应用程序二进制文件

ABI包含各种详细信息,包括:

数据类型的大小、布局和对齐调用规则(控制函数参数的传递方式和返回值的接受方式); 例如,哪些寄存器用于哪些函数参数:所有参数都在堆栈中传递,哪些参数在寄存器中传递; 通过堆栈传递的第一个函数参数是首先推送到堆栈还是最后推

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

完整的ABI,如智能兼容性标准(IBCs ),支持它的操作系统上的程序在支持该ABI的其他操作系统上保持不变ABI与APP应用程序编程接口(API )不同,API定义源代码和库之间的接口,因此可以在支持此API的任何系统上编译相同的代码。 使用ABI,可以在ABI兼容系统中运行编译的目标代码,而无需更改。

2 ) EABI 嵌入式ABI,嵌入式APP应用程序的二进制接口指定文件格式、数据类型、寄存器使用、堆组织优化和嵌入式软件中参数的标准规则。

开发人员还可以使用自己的汇编语言,并将EABI用作与兼容编译器生成的汇编语言的接口。

由支持EABI的编译器创建的目标文件与使用类似编译器生成的代码兼容,因此开发人员可以链接由不同编译器生成的库。

ABI与通用计算机之间的主要区别在于:在APP应用代码中允许使用特权指令、不需要动态链路、以及可能被禁止,并且堆栈帧被组织得更紧凑以节省存储器EABI广泛使用的是Power PC和ARM。

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

二、gnueabi相关的两个交叉编译器: gnueabi和gnueabihf在debian源中将这两个交叉编译器定义为:

gcc-arm-Linux-gnueabi-thegnuccompilerforarmelarchitecture

gcc-arm-Linux-gnueabihf-thegnuccompilerforarmhfarchitecture

可见,这两种交叉编译器适用于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默认为硬浮点,因此不需要hf后缀。 将以下测试中使用的c文件的内容保存到mfloat.c :

#includestdio.hintmain(void ) ) { double a、b和c; a=23.543; b=323.234; c=b/a; printf(「the13/2=%fn”,c ); printf (“哈利世界!

n”); return 0;}

使用 arm-linux-gnueabihf-gcc 编译,使用“-v”选项以获取更详细的信息:

# arm-linux-gnueabihf-gcc -v mfloat.cCOLLECT_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.cCOLLECT_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。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。