首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么是ABI(应用程序二进制接口)?

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

Stack Overflow用户
提问于 2011-01-27 18:06:34
回答 3查看 9.3K关注 0票数 19

维基百科是这样说的:

在计算机软件中,应用程序二进制接口(ABI)描述应用程序(或任何类型的)程序与操作系统或其他应用程序之间的低级接口。

ABI介绍了一些细节,比如数据类型、大小和对齐方式;调用约定,它控制如何传递函数的参数以及如何检索返回值;系统调用号以及应用程序应该如何对操作系统进行系统调用;对于完整的操作系统ABI,还包括目标文件、程序库等的二进制格式。完整的ABI (如英特尔二进制兼容性标准(iBCS) )允许来自支持该ABI的操作系统的程序无需修改即可在任何其它此类系统上运行,前提是存在必要的共享库,并且满足类似的先决条件。

我认为ABI是一种约定或标准,编译器/链接器使用这种约定来生成目标代码。是那么回事吗?如果是这样的话,是谁制定了这些约定(公司或一些组织)?没有ABIs的时候是什么样子的?有没有我们可以参考的关于这些ABIs的文档?

EN

回答 3

Stack Overflow用户

发布于 2011-01-27 18:13:11

在一定程度上,您对ABI的定义是正确的。典型的例子是Linux (和其他UNIXes)中的syscall接口。

它们是代码请求操作系统执行某些任务的标准方式。

因此,它们是由编写操作系统的人决定的,或者在后来添加syscalls的情况下,由添加它们的人决定(在操作系统允许的情况下)。例如,x86上的Linux syscall接口声明您将syscall编号加载到eax中,并将其他参数放在ebxecx等中,这取决于您正在创建的syscall (eax)。

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

回到Linux,GNU库包含用于fopen的代码(例如),它最终调用相关的syscall来执行较低级别的任务(syscall number 5,open)。可以在this PDF file中找到syscalls的列表。

票数 13
EN

Stack Overflow用户

发布于 2013-04-10 10:31:57

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

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

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

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

票数 4
EN

Stack Overflow用户

发布于 2015-04-23 03:09:29

ABI的概念大概是为了支持您的程序在其他操作系统和机器架构上的二进制兼容性。因此,假设您在x86架构上运行的某个操作系统发行版上编写了一个程序。现在,对于程序员来说,最重要的事情是你在你的机器上编写的程序应该能够在运行在相同或不同架构上的任何其他机器上完全相同地运行,为了便于讨论,让我们假设另一台机器运行在i386架构上,这就是ABI或应用程序二进制接口概念的用武之地。由于每个机器体系结构定义了操作系统内核与外部世界(即用户空间程序)对话的方式,因此每个体系结构定义了一组不同的系统调用、机器寄存器、如何使用这些寄存器、内核如何处理软件中断等。ABI是为你处理这些事情的东西,比如编译、链接、字节排序等等。系统程序员很难为运行在不同体系结构上的相同操作系统定义一个统一的ABI,这就是为什么每个机器体系结构都有自己的体系结构,你需要编译你的程序以确认这些机器具有的格式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4814977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档