ABI与API

ABI与API

  • ABI 应用程序二进制接口
  • 调用约定类型表示名称修饰这三者的统称,即是众所周知的应用二进制接口(ABI)。

以下引自维基百科

维基:应用二进制接口

在软件开发中,应用二进制接口(英语:application binary interface,缩写为ABI)是指两程序模块间的接口;通常其中一个程序模块会是库或操作系统所提供的服务,而另一边的模块则是用户所运行的程序。

一个ABI定义了机器代码如何访问数据结构与运算程序,此处所定义的界面相当低端并且相依于硬件。而类似概念的API则在源代码定义这些,则较为高端,并不直接相依于硬件,通常会是人类可阅读的代码。一个ABI常见的样貌即是调用约定:数据怎么成为计算程序的输入或者从中得到输出,x86的调用约定即是一个ABI的例子。

决定要不要采取既定的ABI(不论是否由官方提供),通常由编译器,操作系统或库的开发者来决定;然而,如果撰写一个混和多个编程语言的应用程序,就必须直接处理ABI,采用外部函数调用来达成此目的。

ABI涵盖了各种细节,如:

  • 数据类型的大小、布局和对齐;

  • 调用约定(控制着函数的参数如何传送以及如何接受返回值),例如,是所有的参数都通过栈传递,还是部分参数通过寄存器传递;哪个寄存器用于哪个函数参数;通过栈传递的第一个函数参数是最先push到栈上还是最后;

  • 系统调用的编码和一个应用如何向操作系统进行系统调用;

  • 以及在一个完整的操作系统ABI中,目标文件的二进制格式、程序库等等。

  • Linux ABI
    Linux ABI

  • LSB(Linux标准基础)

LSB指定了例如:标准库,扩展POSIX标准的许多命令和实用程序,文件系统层次结构的布局,运行级别,打印系统,包括后台处理程序(例如CUPS)和工具(例如Foomatic)

LSB设计为二进制兼容的,并为独立软件供应商提供稳定的应用程序二进制接口(ABI)。为了实现向后兼容,每个后续版本都是纯加性的。换句话说,仅添加而不删除接口。LSB采用了接口弃用策略,以便在从LSB中删除接口时为应用程序开发人员留出足够的时间。

不同的指令集(ISA),ABI肯定是不同的,ABI在linux中也是有规范的,称为Linux Standard Base(LSB),ELF,glibc,kernel都有相应的规定。

参考:
Linux标准基础档案(LSB)
Linux标准的基本核心规范

ABI是由OS的设计者来规定的,API是库函数的接口,ABI是可能并不关心功能,更关心可执行文件怎么在硬件平台运行起来,相当于指定了一些寄存器的使用规范,例如调用约定,反汇编以后,可以分析函数调用的堆栈栈帧,参数压栈顺序,还有返回地址如何保存等,对比LSB中的约定来查看。

调用约定,类型表示和名称修饰这三者的统称,即是众所周知的应用二进制接口(ABI)。

调用约定是一种定义子过程从调用处接受参数以及返回结果的方法的约定。不同调用约定的区别在于:

  • 参数和返回值放置的位置(在寄存器中;在调用栈中;两者混合)
  • 参数传递的顺序(或者单个参数不同部分的顺序)
  • 调用前设置和调用后清理的工作,在调用者和被调用者之间如何分配
  • 被调用者可以直接使用哪一个寄存器有时也包括在内。(否则的话被当成ABI的细节)
  • 哪一个寄存器被当作volatile的或者非volatile的,并且如果是volatile的,不需要被调用者恢复
发布了42 篇原创文章 · 获赞 18 · 访问量 7551

猜你喜欢

转载自blog.csdn.net/weixin_44395686/article/details/105009081