复杂度2/5
机密度3/5
最后更新2021/04/24
ABI是Application Binary Interface的缩写。任何写过代码的码农都知道什么是API,这是平台系统为应用程序提供的预先写好的模块,完成一系列的基础功能。那么,如果再深究一下,码农写的程序到底是怎么被执行的呢?虽然说都是一条一条指令,但是这些指令之间最基础的组合关系是如何?是什么样的指令组合使得程序能够实现基础指令集指令之外复杂功能?
例如,CPU指令集里有跳转,有判断,可以完成循环功能;有地址访问,可以完成对变量的读写,对常数的访问;然而,指令集通过什么方案去控制全局变量、局部变量?如何实现子函数之间的调用关系?如何进行调用之间传递参数?等等诸如此类,都需要有一个标准去规范。这个标准就是ABI,ABI是基于CPU硬件指令集,配合操作系统规范,实现用户程序语言转化为二进制代码,能够实际被CPU完美执行。在最初始情况下,ABI甚至规范了操作系统如何能在CPU之上运行的基础。
在比较高层次,ABI也包含二进制可执行文件如何被加载到内存,其内部模块标准等等内容。因此,ABI不但与CPU有关,也与操作系统和二进制可执行程序格式有关。于是,就有了x86_64 ELF ABI, x86 ABI,ARM ABI,PowerPC ELF ABI等等各种组合定义。
确切地说,ABI必须完整包含CPU指令集,OS,二进制文件格式三项内容,但很多时候都省略了其中一项甚至两项定义,而这些省略的项目则与其它参考架构相同或者类似,甚至在此平台是唯一的,没有平行选择,因此可以省略。当前计算机CPU越来越统一到x86架构,操作系统则几乎只有Windows和Linux两个选择,在每种操作系统,Windows是PE(Portable Executable格式,COFF格式的一个变种),Linux是ELF(Executable and Linkable Format),都几乎是唯一选择。尽管其实还有DOS的COM和EXE格式,差不多已经消失在历史长河之中。因此,除了做底层编译环境或者反汇编开发,几乎没有人再关心ABI到底是怎么实现的,有什么选择,而这时候谈到PPC64 ELF ABI,AIX XCOFF ABI反而有点奇怪,我们是考古的,研究的就是古文,把奇怪转变为兴奋吧!点击下载PPC 64 ELF ABI v1.9
由于ABI是程序在被执行的时候,到底发生了什么,我们在以后将详细介绍其过程。目前,只要知道ABI决定了程序能否被当前操作系统执行就可以了。