C++ ABI探究和兼容性问题
ABI(Application Binary Interface)
应用程序二进制接口,描述了应用程序和操作系统之间,一个应用和它的库之间,或者应用的组成部分之间的低接口。
编程语言实现的 ABI 是一种可以使单独编译的模块协同工作的低级细节的规范。如果没有一个稳定的 ABI,就必须使用同一编译器的同一版本编译程序的所有部分。
C ABI
Oracle Solaris ABI 也是 C ABI,因为 C 是标准的 UNIX 实现语言。此外,C ABI 还指定:
- 预定义类型(char、int、float 等)的大小和布局
- 复合类型(array 和 struct)的布局
- 编程人员定义的名称的外部(链接器可见)拼写
- 机器码函数调用序列
- 堆栈布局
- 寄存器使用
C++ ABI
C++ ABI 包括 C ABI,并进行了相应的扩展。
名称改编算法是 ABI 的一部分,因为它定义编译器必须如何生成程序实体的外部引用和定义。如果两个编译器或编译器版本未以相同方式对同等声明进行改编,则包含两个编译器编译的内容的程序将无法正确链接。
C++ 还提供了一种方法,用于指定可从 C 代码访问名称,因此不应改编名称。(个人理解是导出为C可用库的时候)
ABI的不稳定性
新的或更改的语言特性可能需要对 ABI 进行更改,而不仅仅是扩展。如C++03,11,14标准。
ABI 中的任何不同之处都意味着来自不同编译器的对象文件将无法链接,或者如果可以链接,它们也不会正确运行。C++ 编程人员已习惯于每当更新编译器时,就重新编译所有