C ユーザーズガイド

-xcode=v

(SPARC) コードアドレス空間を指定します。v は次のいずれか 1 つでなければなりません。

表 2-7 v の値

abs32

32 ビット絶対アドレスを生成します。コード、データ、および bss を合計したサイズは 2**32 バイトに制限されます。これは 32 ビットアーキテクチャ (-xarch=generic, v7, v8, v8a, v8plus, v8plusa) でデフォルトです。

abs44

44 ビット絶対アドレスを生成します。コード、データ、および bss を合計したサイズは 2**44 バイトに制限されます。64 ビットアーキテクチャ (-xarch=v9, v9a) だけで利用できます。

abs64

64 ビット絶対アドレスを生成します。64 ビットアーキテクチャ (-xarch=v9, v9a) だけで利用できます。

pic13

共有ライブラリで使用する位置独立コード を生成します。-Kpic と同義です。32 ビットアーキテクチャでは最大 2**11 まで、64 ビットアーキテクチャでは最大 2**10 までの固有の外部シンボルを参照できます。

-xcode=pic13 コマンドは、大域オフセットテーブルのサイズが 8K バイトに制限されることを除けば、-xcode=pic32 に似ています。

pic32

共有ライブラリで使用する位置独立コード (大規模モデル) を生成します。-KPIC と同義です。32 ビットアーキテクチャでは最大 2**30 まで、64 ビットアーキテクチャでは最大 2**29 までの固有の外部シンボルを参照できます。

大域データへの参照はそれぞれ、大域オフセットテーブル内のポインタの間接参照として生成されます。各関数呼び出しは、手続きリンケージテーブルを使用して PC の相対アドレッシングモードで生成されます。ごくまれに -xcode=pic32 で大域データオブジェクトが多くなり過ぎることがありますが、その場合は大域オフセットテーブルは 32 ビットアドレス範囲も使用します。

SPARC V7 と V8 の場合のデフォルトは -xcode=abs32 です。SPARC V9 と UltraSPARC V9 (-xarch=v9|v9a) の場合のデフォルトは -xcode=abs64 です。

64 ビット Solaris 7 上で -xarch=v9 または v9a を使用して共有動的ライブラリを構築するときは、-xcode=pic13 または -xcode=pic32 オプションを指定しなければなりません。

-xcode=pic13 および -xcode=pic32 では、わずかですが、次の 2 つのパフォーマンス上の負担がかかります。

こうした負担があるとしても、-xcode=pic13 あるいは -xcode=pic32 を使用すると、ライブラリコードを共有できるため、必要となるシステムメモリーを大幅に減らすことができます。-xcode=pic13 あるいは -xcode=pic32 でコンパイルした共有ライブラリを使用するすべてのプロセスは、そのライブラリのすべてのコードを共有できます。共有ライブラリ内のコードに非 pic (すなわち、絶対) メモリー参照が 1 つでも含まれている場合、そのコードは共有不可になるため、そのライブラリを使用するプログラムを実行する場合は、その都度、コードのコピーを作成する必要があります。

.o ファイルが -xcode=pic13 または -xcode=pic32 でコンパイルされたかどうかを調べるには、次のように nm コマンドを使用すると便利です。


% nm <ファイル名>.o | grep _GLOBAL_OFFSET_TABLE_
U _GLOBAL_OFFSET_TABLE_

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

-xcode=pic13 または -xcode=pic32 を使用すべきかどうかを判断するには、nm を使用して、共有ライブラリで使用または定義されている明確な大域および静的変数の個数を確認します。_GLOBAL_OFFSET_TABLE_ のサイズが 8,192 バイトより小さい場合は、-Kpic を使用できます。そうでない場合は、-xcode=pic32 を使用する必要があります。