这就是维基百科所说的:
在计算机软件中,应用程序二进制接口(ABI)描述应用程序(或任何类型)程序与操作系统或另一应用程序之间的低级接口.
ABI涵盖了数据类型,大小和对齐等细节; 调用约定,它控制函数参数的传递方式并返回检索的值; 系统调用号码以及应用程序应如何向操作系统进行系统调用; 并且在完整的操作系统ABI的情况下,目标文件,程序库等的二进制格式.完整的ABI(例如英特尔二进制兼容性标准(iBCS))允许来自支持该ABI的一个操作系统的程序在不修改任何其他此类系统的情况下运行,前提是存在必要的共享库,并且满足类似的先决条件.
我猜ABI是一种约定或标准,编译器/链接器使用此约定来生成目标代码.是对的吗?如果是这样,谁制定了这些约定(公司或某个组织)?什么时候没有ABI?我们可以参考哪些关于这些ABI的文件?
pax*_*blo 12
你对ABI的定义是正确的,直到某一点.典型的例子是syscallLinux(和其他UNIX)中的接口.
它们是代码请求操作系统执行某些职责的标准方法.
因此,它们由编写OS的人决定,或者在syscalls后来添加的情况下由添加它们的人决定(在操作系统允许的情况下).例如,syscallx86上的Linux 接口声明您将syscall数字加载到eax其他参数中ebx,ecx依此类推,具体取决于syscall您正在制作(eax).
通常情况下,不是编译器或链接器进行接口工作,而是为您正在使用的语言提供的库.
回到Linux,GNU C库包含fopen(例如)最终调用相关syscall执行较低级别任务(系统调用号5 open)的代码.syscalls可在此PDF文件中找到该列表.