構築環境には、システムヘッダー、コンパイルシステム、およびライブラリが含まれています。これらのことについては、次の節で説明します。
1 組のシステムヘッダーが 32 ビットおよび 64 ビットのコンパイル環境をサポートします。64 ビットコンパイル環境用に別のインクルードパスを指定する必要はありません。
64 ビット環境をサポートするためにヘッダーに加えられた変更をより理解するには、ヘッダーの <sys/isa_defs.h> のさまざまな定義について理解しておくことをお薦めします。このヘッダー中には #define
が含まれており、それらは各命令セットアーキテクチャに対して設定されています。<sys/types.h> をインクルードすると、自動的に <sys/isa_defs.h> がインクルードされます。
次の表にあるシンボルは、コンパイル環境 (コンパイラ) によって定義されます。
__sparc | SPARC ファミリーのプロセッサアーキテクチャのいずれかであることを示します。アーキテクチャには SPARC V7、SPARC V8、および SPARC V9 があります。シンボルの sparc は、慣例上 __sparc の同義語です。 |
__sparcv8 | 『SPARC Architecture Manual』のバージョン 8 で定義されている 32 ビット SPARC V8 アーキテクチャを示します。 |
__sparcv9 | 『SPARC Architecture Manual』のバージョン 9 で定義されている 64 ビット SPARC V9 アーキテクチャを示します。 |
__i386 | このシンボルは、Intel 386 命令セットあるいはそのスーパーセットを実装するすべてのプロセッサに対する総称です。これには、386、486、および Pentium ファミリーのプロセッサのすべてのメンバーが含まれます。 |
シンボル __sparcv8 および __sparcv9 は、相互に排他的で (両方が同時に定義されることはありません) 、シンボル __sparc が定義されているときにだけ意味があります。
次に示すシンボルは、上記のシンボルのいくつかの組み合わせから派生したものです。
_ILP32 | int、long、およびポインタのサイズがすべて 32 ビットであるデータ型モデル |
_LP64 | long およびポインタのサイズがすべて 64 ビットであるデータ型モデル |
シンボル _ILP32 および _LP64 も、相互に排他的です。
完全に移植性のあるコードを書くことが不可能で、32 ビットおよび 64 ビットのそれぞれに固有のコードが必要な場合は、_ILP32 または _LP64 を使って、コードを条件付きで切り替えるようにしてください。これによって、コンパイルマシンに依存しないコンパイル環境にすることができ、アプリケーションをすべての 64 ビットプラットフォームに移植する際の移植性が高くなります。
Sun WorkShop C、C++、および Fortran のコンパイル環境が拡張され、32 ビットおよび 64 ビットアプリケーションの両方を作成できるようになりました。Sun WorkShop で提供される C コンパイラの 5.0 リリースは、64 ビットコンパイルをサポートします。
ネイティブコンパイルモードおよびクロスコンパイルモードがサポートされています。デフォルトのコンパイル環境は、これまでどおり 32 ビットアプリケーションを作成します。ただし、両モードともアーキテクチャに依存します。Sun コンパイラを使用して、Intel マシン上で SPARC オブジェクトを作成したり、SPARC マシン上で Intel オブジェクトを作成することはできません。アーキテクチャやコンパイラのモードが指定されていない場合は、適宜 __sparc または __i386 シンボルがデフォルトで定義され、この一部として _ILP32 も定義されます。これによって、既存のアプリケーションおよびハードウェアにおける相互運用性が高くなります。
たとえば、Sun WorkShop C コンパイラを使用して SPARC マシンで 64 ビットコンパイル環境を使用できるようにする場合は、-xarch=v9 フラグを cc(1) への引数として指定する必要があります。
これによって LP64 コードが含まれる ELF64 オブジェクトが生成されます。ELF64 とは、64 ビットのプロセッサおよびアーキテクチャをサポートする 64 ビットオブジェクトファイル形式のことです。一方、デフォルトの 32 ビットモードでコンパイルしたときは、ELF32 オブジェクトファイルが生成されます。
-xarch=v9 フラグ を使用すると、32 ビットまたは 64 ビットのどちらのシステムでもコードを生成できます。32 ビットコンパイラを使用すると、-xarch=v9 によって 32 ビットシステムで 64 ビットのオブジェクトを作成できますが、作成したオブジェクトは 32 ビットシステムでは実行できません。64 ビットライブラリに対するライブラリパスを指定する必要はありません。-l または -L オプションを使用してライブラリまたはライブラリパスを追加指定し、そのパスが 32 ビットライブラリだけを指している場合は、リンカーはそれを検出し、エラーを出力してリンク処理を異常終了します。
Solaris オペレーティング環境には、32 ビットおよび 64 ビットの両コンパイル環境用の共用ライブラリが含まれています。静的ライブラリについては、32 ビットのみが含まれており、64 ビットは提供されていません。
32 ビットアプリケーションは 32 ビットライブラリとリンクし、64 ビットアプリケーションは 64 ビットライブラリとリンクしなければなりません。64 ビットライブラリを使って 32 ビットアプリケーションを作成または実行することはできません。32 ビットライブラリは、これまでどおり /usr/lib および /usr/ccs/lib に置かれています。64 ビットライブラリは、SPARC プラットフォームでは適切な lib ディレクトリの sparcv9 サブディレクトリに置かれています。32 ビットライブラリの場所は変更されないので、Solaris 2.6 以前のオペレーティング環境で構築された 32 ビットアプリケーションとのバイナリの互換性があります。
64 ビットアプリケーションを構築するためには 64 ビットライブラリが必要です。64 ビットライブラリは、32 ビットおよび 64 ビットの両環境で利用できるため、ネイティブコンパイルもクロスコンパイルも可能です。コンパイラとその他のツール (たとえば ld、ar、as など) は 32 ビットプログラムで、32 ビットまたは 64 ビットシステム上で 64 ビットプログラムを構築する機能があります。もちろん、32 ビットオペレーティング環境上のシステムで作成された 64 ビットプログラムは、32 ビット環境では実行できません。