Sun Studio 12: Fortran ユーザーズガイド

3.4.122 -xcode=keyword

(SPARC) SPARC プラットフォームのコードアドレス空間を指定します。

keyword の値は次のとおりです。

keyword

機能 

abs32

32 ビットの絶対アドレスを生成します。コード + データ + bss サイズを 2**32 バイトに制限します。次の 32 ビットのプラットフォームでのデフォルトです。 

abs44

44 ビットの絶対アドレスを生成します。コード + データ + bss サイズを 2**44 バイトに制限します。次の 64 ビットのプラットフォームだけで使用できます。 

abs64

64 ビットの絶対アドレスを生成します。次の 64 ビットのプラットフォームだけで使用できます。 

pic13

位置独立コード (スモールモデル) を生成します。-pic と同義です。32 ビットのプラットフォームでは 2**11 の、64 ビットのプラットフォームでは 2**10 の固有の外部シンボルを引用できます。

pic32

位置独立コード (ラージモデル) を生成します。-PIC と同義です。32 ビットのプラットフォームでは 2**30 の、64 ビットのプラットフォームでは 2**29 の固有の外部シンボルを引用できます。

-xcode=keyword を明示的に指定しなかった場合のデフォルトは、次のとおりです。

32 ビットのプラットフォームの場合は、-xcode=abs32 です。64 ビット のプラットフォームの場合は、-xcode=abs44 です。

3.4.122.1 位置独立コード

実行時のパフォーマンスを向上するために動的共有ライブラリを作成するときには、-xcode=pic13 または -xcode=pic32 を使用します。

動的実行可能ファイルのコードは、通常、メモリーの固定アドレスに結び付けられ、位置独立コードは、プロセスのどのようなアドレス空間でもロードすることができます。

位置独立コードを使用する場合は、大域オフセットテーブルを使用した直接的なリファレンスとして、再配置可能なリファレンスが作成されます。頻繁にアクセスされる共有オブジェクトの項目は、-xcode=pic13 または -xcode=pic32 を使用してコンパイルすると、位置独立コード以外のコードによって行われる多数の再配置が必要なくなるという利点があります。

大域オフセットテーブルのサイズは、8K バイトに制限されます。

-xcode={pic13|pic32} には、次のようなパフォーマンス上の影響があります。

こうした影響があるとしても、-xcode=pic13 または -xcode=pic32 を使用すると、ライブラリコードを共有できるため、必要となるシステムメモリーを大幅に減らすことができます。-xcode=pic13 または -xcode=pic32 でコンパイルした共有ライブラリ中のコードの各ページは、そのライブラリを使用する各プロセスで共有することができます。共有ライブラリ中にあるコードのページに 1 つでも -pic でコンパイルされていないメモリー参照 (直接メモリー参照) があると、このページは共有できなくなるため、ライブラリを使用したプログラムを実行するたびに、そのページのコピーが作成されます。

.o ファイルが -xcode=pic13 または -xcode=pic32 でコンパイルされているかどうかを調べるには、nm コマンドを使用する方法がもっとも簡単です。

nm file.o | grep _GLOBAL_OFFSET_TABLE_

位置独立コードを含む .o ファイルには、_GLOBAL_OFFSET_TABLE_ への未解決の外部参照があります。未解決の参照は U の文字で示されます。

-xcode=pic13 または -xcode=pic32 のどちらを使用すべきか決定するときは、elfdump -c (詳細は elfdump(1) のマニュアルページを参照) を使用することによって、セクションヘッダー (sh_name: .got) を探して、大域オフセットテーブル (GOT) のサイズを調べてください。sh_size 値が GOT のサイズです。 GOT のサイズが 8,192 バイトに満たない場合は -xcode=pic13、そうでない場合は -xcode=pic32 を指定します。

一般に、-xcode の使用方法の決定に際しては、次のガイドラインに従ってください。

動的ライブラリを構築する場合は、-xcode=pic13 または pic32 (または -pic または -PIC) オプションを使用してコンパイルしてください。Solaris の『リンカーとライブラリ』を参照してください。