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