Oracle® Developer Studio 12.5:GCC 兼容性指南

退出打印视图

更新时间: 2016 年 7 月
 
 

一般兼容性概念

本节介绍了影响 Oracle Developer Studio 和 GCC 编译器之间的兼容性的基本概念。

平台和 ABI

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 兼容性

ABI 引用

Oracle Developer Studio 编译器生成的二进制代码如以下各个文档中所述: