答案 0 :(得分:65)
ABI( 应用程序二进制接口 )是一种标准,用于定义高级语言中的低级概念与特定硬件/操作系统的能力之间的映射平台的机器代码。这包括:
这些答案是:
如果没有某种标准化,不同编译器创建的(机器)代码就无法使用相同类型的库(您如何知道库代码需要以哪种方式传递函数参数或数据结构?)。
每个平台(特定硬件,操作系统软件和用特定编程语言编写的代码/用特定编译器编译的组合)定义了一整套ABI 来制作事情可互操作。这个领域的术语不清楚,有时人们只是谈论“ABI”,有时候它被称为“平台补充”,或者人们提到编程语言并且说例如“C ++ ABI”。请记住,没有一件事。
您在问题中链接的文档都是此类的特定示例(语言/操作系统/硬件特定的ABI)。
即使在特定平台上,也没有必要拥有一个且只有一个 ABI(set),因为不同的此类约定可能具有不同的优势(因此提供更好的性能/更小的代码/更好的内存使用/ ... - 取决于程序)系统设计师通常会尝试灵活/允许 例如,在32位Microsoft Windows上,有许多用于调用约定部分的函数的ABI(fastcall,stdcall,pascal,...)。
无论如何,通用stackoverflow搜索“ABI”(包括“相关”侧栏下的链接)给了很多线索来研究这个问题,我现在关闭了我的答案。
答案 1 :(得分:21)
当使用ARM上的OS内核端口时,应该引用ARM ABI。
EABI是指处理器启动以加载没有中间内核的应用程序。 (在DOS出现的时候曾经像ROM-BASIC那样),i。即固件本身是独立的应用程序,没有特定于板的显示器或任何东西。
第一个链接是与ARM ABI的过程调用相关的详细子部分。随着程序员的模型在每个版本的ARM CPU中不断发展,这些主题非常重要,并由ABI涵盖。
第二个链接是关于由OS供应商品牌SCO指定的编译器ELF生成的目标文件的二进制格式规范。也许SCO是Santa Cruz组织,它自己的Unix和Linux都有自己的风格,但是这个故事偏离了这个问题。如果您打算实现支持ELF定位ARM的链接器,您应该对此感兴趣。
除非您直接关注ARM构建工具链的实现细节,否则EABI应该没什么问题,除非您考虑到此类工具链的操作系统特定方面,因此ARM ABI也应该没什么问题。< / p>
答案 2 :(得分:1)
ABI基本上是函数/过程如何通过寄存器(编译形式)相互传递信息的地方,其中存储了返回值(指定寄存器)。在x86或x86-x64中,它称为ABI(Application binary interface)。
在ARM体系结构中,它被称为EABI(扩展应用程序二进制接口)。 2000年之前的ABI被称为OABI(旧的应用程序二进制接口),现在已经过时了。 在EABI中,信息/参数以整数形式传递。 支持硬件浮点的ARM处理器使用称为EABIHF(扩展应用程序二进制接口硬浮点)的浮点寄存器传递参数。