我从来没有清楚地理解 ABI 是什么。请不要将我指向维基百科的文章。如果我能理解,我就不会在这里发这么长的帖子了。
这是我对不同界面的看法:
电视遥控器是用户和电视之间的接口。它是一个现有的实体,但本身无用(不提供任何功能)。遥控器上每个按钮的所有功能都在电视机中实现。
接口:
functionality
它是该功能之间的“现有实体”层consumer
。接口本身不做任何事情。它只是调用背后的功能。现在取决于用户是谁,有不同类型的界面。
命令行界面 (CLI)命令是现有实体,消费者是用户,功能位于后面。
functionality:
我的软件功能解决了我们描述此界面的某些目的。
existing entities:
命令
consumer:
用户图形用户界面 (GUI)窗口、按钮等是现有的实体,而消费者又是用户,功能落后。
functionality:
我的软件功能解决了我们描述这个接口的一些问题。
existing entities:
窗口、按钮等。
consumer:
用户应用程序编程接口(API)函数(或者更准确地说)接口(在基于接口的编程中)是现有的实体,这里的消费者是另一个程序而不是用户,功能再次位于这一层后面。
functionality:
我的软件功能解决了我们描述这个接口的一些问题。
existing entities:
函数,接口(函数数组)。
consumer:
另一个程序/应用程序。应用程序二进制接口 (ABI)这是我的问题开始的地方。
functionality:
???
existing entities:
???
consumer:
???
- 我用不同的语言编写了软件并提供了不同类型的接口(CLI、GUI 和 API),但我不确定我是否曾经提供过任何 ABI。
ABI 涵盖详细信息,例如
- 数据类型、大小和对齐方式;
- 调用约定,它控制函数的参数如何传递和返回值的检索;
- 系统调用号以及应用程序应如何对操作系统进行系统调用;
其他 ABI 标准化细节,例如
- C++ 名称修改,
- 异常传播,以及
- 同一平台上编译器之间的调用约定,但不需要跨平台兼容性。
谁需要这些细节?请不要说操作系统。我知道汇编编程。我知道链接和加载是如何工作的。我确切地知道里面发生了什么。
为什么 C++ 名称修饰会出现?我以为我们在二进制级别上讨论。为什么语言会出现?
无论如何,我已经下载了[PDF] System V Application Binary Interface Edition 4.1 (1997-03-18)来看看它到底包含什么。好吧,大部分都没有任何意义。
为什么它包含两章(第 4 章和第 5 章)来描述ELF文件格式?事实上,这是该规范仅有的两个重要章节。其余章节是“特定于处理器的”。无论如何,我认为这是一个完全不同的话题。请不要说ELF文件格式规范就是ABI。根据定义,它不符合成为接口的条件。
我知道,既然我们在这么低的层面上谈论它,它必须非常具体。但我不确定它是如何具体“指令集架构(ISA)”的?
在哪里可以找到 Microsoft Windows 的 ABI?
所以,这些是困扰我的主要问题。