严格的讲,旧的和新的ARM ABIs都是ARM EABI specification的子集。但是常常使用EABI表示新的,OABI或者old-ABI表示旧的。但是仍然有一些程序有时将old ABI二进制称为EABI。
GCC视角
新ABI不仅是新的ABI规范,也是新的GCC目标。
新的(EABI)实际就是ARM官方的AAPCS。
传给binutils的ABI参数:-mabi=apcs-gnu -mfpu=fpa
gcc -dumpmachine: arm-unknown-linux
objdump -x 编译的二进制:
private flags = 2: [APCS-32] [FPA float format] [has entry point]
file 命令输出:
ELF 32-bit LSB executable, Arm, version 1 (Arm), for GNU/Linux 2.2.0, dynamically linked (uses shared libs), for GNU/Linux 2.2.0, stripped
readelf -h | grep Flags输出
Flags: 0x0
gcc传递给binutils的ABI参数:-mabi=aapcs-linux -mfloat-abi=soft -meabi=4
gcc -dumpmachine输出:
arm-unknown-linux-gnueabi
objdump -x输出
private flags = 4000002: [Version4 EABI] [has entry point]
file命令
ELF 32-bit LSB executable, Arm, version 1 (SYSV), for GNU/Linux 2.4.17, dynamically linked (uses shared libs), for GNU/Linux 2.4.17, stripped
readelf -h | grep Flags
Flags: 0x4000002, has entry point, Version4 EABI
Debian arm/OABI创建hardflot FPA指令。只有少数的Arm core实现了FPA (Floating Point Accelerator),所以FPA指令通常是内核通过未定义指令异常来模拟。但是效率非常低,在FIR测试程序中,比-msoft-float慢10倍。
Arm现在引入了新的浮点单元,VFP(Vector Floating Points),使用和FPA不同的指令集,而且使用IEEE-754格式。在一些新的Arm9/10/11和Cortex A核中实现了VFP。但是没有VFP的Arm核仍然很流行。
事情可能更复杂,很多arm处理器集成了许多其它FPUs和DSPs,它们都添加自己的指令集到Arm指令集。
主要的FP变种有:
有无FPA的armv3,armv4
EABI for generic Arm (>= armv4t),使用IEEE soft-float
EABI for VFP
EABI for MaverickCrunch FPU
EABI for iWMMXt
GCC和浮点数相关的预处理宏
__VFP_FP__
__MAVERICK__
__SOFTFP__
__VFP_FP__和__MAVERICK__通常互斥,如果上述3种都没有定义,则是FPA。
__VFP_FP__不意味着产生VFP代码,它只是表示浮点数的格式,当__SOFTFP__定义时,__VFP_FP__也通常被定义。测试产生VFP代码的方法是:
#if (defined(__VFP_FP__) && !defined(__SOFTFP__))
http://www.cnblogs.com/key000/archive/2011/10/18/4084771.html
https://wiki.debian.org/ArmEabiPort