编译库的 ABI 是否取决于操作系统?

编译库的 ABI 是否取决于操作系统?

我刚刚读过一个例子ABI 的。这是正确的吗

  • ABI 与 API 类似,不同之处在于 ABI 是机器语言,而 API 是高级编程语言

  • ABI 是由机器语言编译的库提供并属于其的接口吗? (如果我没猜错的话,一个自制的编译库提供了它的ABI(参见上面的例子)。操作系统可以被视为一个编译库,从而为应用程序访问其系统调用服务提供了自己的ABI。)

上面的例子并没有提到自制编译库的ABI是否依赖于操作系统。

https://en.wikipedia.org/wiki/Application_binary_interface然而提到了操作系统:

ABI 涵盖以下详细信息:

处理器指令集(详细信息如寄存器文件结构、堆栈组织、内存访问类型等)

处理器可以直接访问的基本数据类型的大小、布局和对齐方式

调用约定,控制函数参数的传递方式和返回值的检索方式;例如,是否所有参数都在堆栈上传递,或者某些参数在寄存器中传递,哪些寄存器用于哪些函数参数,以及堆栈上传递的第一个函数参数是首先还是最后压入堆栈

应用程序应如何进行系统调用操作系统并且,如果 ABI 指定直接系统调用而不是对系统调用存根的过程调用,则系统调用号

而对于完整的操作系统ABI来说,则是目标文件、程序库等的二进制格式。

编译库的 ABI 是否取决于操作系统? (我想不会。即使编译的库通过操作系统的 ABI 使用系统调用服务,依赖于操作系统(的 ABI)的是编译的库而不是其 ABI。)

编译库的 ABI 可以独立于操作系统(的 ABI)吗?

谢谢。

答案1

已编译库的 ABI 取决于其目标,并且不一定包括操作系统。有一些用于没有操作系统的嵌入式系统的库,也有一些针对 Java 等平台的库,它抽象了操作系统的 ABI。

正如你所说,操作系统的 ABI 决定了库(或程序)如何调用它;它不一定决定如何调用该库。决定库 ABI 的实际上是它的 API 以及它使用的编译器的细节。编译器通常会遵循目标平台的 ABI,但这不是特定于操作系统的;例如在 Linux 上,平台 ABI 是系统 V ELF ABI,具有特定于体系结构的处理器补充。

然而,操作系统的 ABI 可能会泄漏到库的 ABI 中,例如,如果库直接在其 ABI 中公开系统特定的结构。

相关内容