什么是ABI(应用程序二进制接口)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (126)

这就是维基百科所说的:

在计算机软件中,应用程序二进制接口(ABI)描述应用程序(或任何类型)程序与操作系统或其他应用程序之间的低级接口。 ABI涵盖诸如数据类型,大小和对齐方式等细节; 调用约定,它控制函数参数如何传递并返回值; 系统调用号码以及应用程序应如何对操作系统进行系统调用; 以及在完整的操作系统ABI的情况下,目标文件,程序库等的二进制格式。完整的ABI(如英特尔二进制兼容性标准(iBCS))允许来自支持该ABI的操作系统的程序在没有任何其他此类系统修改的情况下运行,前提是必需的共享库存在,并且满足类似的先决条件。

我猜测ABI是一个约定或标准,编译器/链接器使用这个约定来生成目标代码。是对的吗?如果是的话,谁制定了这些公约(公司或某个组织)?没有ABI的时候是什么感觉?是否有关于我们可以参考的这些ABI的文件?

提问于
用户回答回答于

规范比惯例更适合术语,因为惯例是广泛接受的惯例的松散术语,而规范是明确定义的。

你是对的。规范由标准化机构制定。看看Windows支持的POSIX规范以及编译/构建工具链(如gcc)假定操作系统遵守它,甚至Linux内核部分(几乎完全)遵守它。

在ABI之前?即使在今天,随着新的芯片出现在机顶盒和具有嵌入式系统的其他设备上,固件也是手工制作的。

该文档是数据表中的数字逻辑内容,用于汇编语言和高级语言编程的芯片,交叉编译器工具链文档给出了应该成为ABI一部分的假设。

用户回答回答于

你对ABI的定义是正确的,直到某一点。典型的例子是syscallLinux(和其他UNIX)中的接口。

它们是代码要求操作系统履行某些职责的标准方式。

因此,它们由编写操作系统的人决定,或者在syscalls稍后添加的情况下由谁添加(如果操作系统允许的话)。例如,syscallx86上的Linux 接口声明您将syscall数字加载到其中eax,并放置其他参数ebxecx依此类推,具体取决于syscall您所做的(eax)。

通常情况下,编译器或链接器不是用于连接接口的工作,而是为您正在使用的语言提供的库。

回到Linux,GNU C库包含fopen(例如)最终调用相关的代码syscall来执行较低级别的任务(系统调用号码5 open)。

扫码关注云+社区