区分API和ABI?

API是Application Programming Interface的缩写,即应用程序接口。 一个API是不同代码片段的连接纽带。它定义了一个函数的参数,函数的返回值,以及一些属性比如继承是否被允许。 因此API是用来约束编译器的:一个API是给编译器的一些指令,它规定了源代码可以做以及不可以做哪些事。

ABI是Application Binary Interface的缩写,应用程序二进制接口。 一个ABI是不同二进制片段的连接纽带。 它定义了函数被调用的规则:参数在调用者和被调用者之间如何传递,返回值怎么提供给调用者,库函数怎么被应用,以及程序怎么被加载到内存。 因此ABI是用来约束链接器的:一个ABI是无关的代码如何在一起工作的规则。 一个ABI也是不同进程如何在一个系统中共存的规则。 举例来说,在Linux系统中,一个ABI可能定义信号如何被执行,进程如何调用syscall,使用大端还是小端,以及栈如何增长。

ABI是系统与应用之间的协议. 一个BINARY(EXEC, LIB)必需符合ABI才能在相应的系统上运行。比如在PC上不管用什么样的COMPILER, 只要产生符合LINUX的ELF文件, 用相应的INSTRUCTION SET(比如INTEL, PPC, SPARC),就可以在一个LINUX机器上运行, 调用系统或别人的LIB。

ABI定义了BINARY的文件格式、内容、 以及装载/卸载程序的要求, 函数调用时参数传递规则, 寄存器, 堆栈的使用等。

保持一个稳定的 ABI 要比保持稳定的 API 要难得多。比如,在内核中 int register_netdevice(struct net_device *dev) 这个内核函数原型基本上是不会变的,所以保持这个 API 稳定是很简单的,但它的 ABI 就未必了,就算是这个函数定义本身没变,即 API 没变,而 struct net_device 的定义变了,里面多了或者少了某一个字段,它的 ABI 就变了,你之前编译好的二进制模块就很可能会出错了,必须重新编译才行。

参考

  • What Is the ABI(程序二进制接口)?
  • API、ABI区别
  • 深入解析ABI
  • C++ 工程实践(4):二进制兼容性
  • C++库二进制兼容Binary Compatible教程

你可能感兴趣的:(区分API和ABI?)