このセクションでは、Oracle Developer Studio コンパイラと GCC コンパイラの間の互換性に影響を与える基本概念について説明します。
C および C++ の言語規格では、正式な ABI (アプリケーションバイナリインタフェース) が定義されていませんが、特定のプラットフォームおよびポインタサイズ内においては、事実上の ABI によって、C レベルのエクスポート対象インタフェースで記述されるモジュール間の互換性が可能になります。
このような文脈では、プラットフォームは次の 2 つの組み合わせとなります。
オペレーティングシステム (たとえば、Oracle Linux、または Oracle Solaris)
チップファミリ (SPARC または x86)
ポインタサイズは、バイナリが 32 ビット ABI または 64 ビット ABI のどちらを使用してビルドされているかを指します。一部のプラットフォームは 1 つのポインタサイズしかサポートしないこともありますが、Oracle Developer Studio 製品によって現在サポートされているほとんどのプラットフォームは 32 ビットプログラムと 64 ビットプログラムの両方をサポートします。
Oracle Developer Studio および gcc は、それぞれ 32 ビットおよび 64 ビットの ABI を選択するための –m32 および –m64 オプションをサポートしています。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 リリースには、4.x ライブラリと 5.x ライブラリの ABI の間で g++ の互換性に関する特定の問題があります。詳細については、GNU ABI の互換性を参照してください。
Oracle Developer Studio コンパイラによって生成されたバイナリコードは、さまざまなドキュメントで説明されています。
SPARC ABI: http://sparc.org/technical-documents
SPARC アセンブリ言語リファレンスマニュアル: 第 6 章、書き込み関数 http://docs.oracle.com/cd/E53394_01/html/E54833/index.html
Oracle Solaris 64 ビット 開発者ガイド
AMD64 ABI 機能: https://docs.oracle.com/cd/E53394_01/html/E61689/fcowb.html
SPARC V9 ABI 機能: https://docs.oracle.com/cd/E53394_01/html/E61689/advanced-2.html