ILD

arm ABI
作者:Herbert Yuan 邮箱:yuanjp89@163.com
发布时间:2018-1-1 站点:Inside Linux Development

严格的讲,旧的和新的ARM ABIs都是ARM EABI specification的子集。但是常常使用EABI表示新的,OABI或者old-ABI表示旧的。但是仍然有一些程序有时将old ABI二进制称为EABI。


GCC视角

新ABI不仅是新的ABI规范,也是新的GCC目标。


新的(EABI)实际就是ARM官方的AAPCS。


1 Legacy ABI

传给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


2 Arm EABI

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


3 Arm floating points

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变种有:


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


Copyright © linuxdev.cc 2017-2024. Some Rights Reserved.