本节介绍了影响 Oracle Developer Studio 和 GCC 编译器之间的兼容性的基本概念。
C 或 C++ 语言标准并未定义任何正式的 ABI(应用程序二进制接口);但是,在特定平台上以及在使用特定指针大小时,可通过事实上的 ABI 在使用 C 级别导出接口编写的模块之间实现兼容性。
在此上下文中,平台是指以下两项的组合:
操作系统(例如 Oracle Linux 或 Oracle Solaris)
芯片系列(SPARC 或 x86)
指针大小是指二进制数据是使用 32 位 ABI 还是 64 位 ABI 构建的。某些平台可能仅支持一种指针大小,但目前,Oracle Developer Studio 产品支持的大多数平台都同时支持 32 位和 64 位程序。
Oracle Developer Studio 和 gcc 支持使用 –m32 和 –m64 选项来分别选择 32 位和 64 位 ABI。在 Solaris 10 和 Oracle Solaris 11 上,缺省模式为 32 位。在 Oracle Linux 上,缺省模式为 64 位。
要实现 C++ 语言的许多功能,编译器必须生成特定于编译器实现且多供应商平台范围 ABI 文档并未介绍的 ELF 符号以及其他二进制数据。
编译器的某些功能是由编译时或链接时选项选择的,这些功能可能会导致额外的外部符号引用,或导致编译器的二进制输出中发生超出 ABI 中定义的常规 C 级别接口的其他变化。对于这些功能,您可能需要将程序与用来创建对象文件的同一个编译器链接起来。某些功能还可能会阻止链接来自其他编译器的对象文件。
通常,您可以使用 Oracle Developer Studio 或 gcc 来编译 C 源文件,并自由地混合它们的对象文件来链接可执行文件或共享库。本节介绍了一些例外情况。
使用 C++ 时,您可以选择 Oracle Developer Studio C++ 编译器的 g++ 兼容模式,并混合使用不同编译器编译的共享库和可执行文件,但您无法混合使用来自不同编译器的对象文件。下面将介绍详细信息。
Oracle Developer Studio 12.5 发行版存在一个涉及 g++ 兼容性的具体问题,即 4.x 库和 5.x 库 ABI 之间存在兼容性问题。有关更多信息,请参见GNU ABI 兼容性。
Oracle Developer Studio 编译器生成的二进制代码如以下各个文档中所述:
SPARC ABI: http://sparc.org/technical-documents
《SPARC Assembly Language Reference Manual》(《SPARC 汇编语言参考手册》):第 6 章 "Writing Functions"http://docs.oracle.com/cd/E53394_01/html/E54833/index.html(编写函数)
《Oracle Solaris 64-bit Developer's Guide》(《Oracle Solaris 64 位开发人员指南》)
AMD64 ABI Features(AMD64 ABI 功能):https://docs.oracle.com/cd/E53394_01/html/E61689/fcowb.html
SPARC V9 ABI Features(SPARC V9 ABI 功能):https://docs.oracle.com/cd/E53394_01/html/E61689/advanced-2.html