8.4.1 グローバル・ポインタ(gp)

アプリケーション内でグローバル宣言したデータはメモリに配置されます。このメモリに配置されているデータを参照(ロード,ストア)する際,配置位置に依存することのない参照(Position Independent Data:PID)を実現するために用意されるポインタが「グローバル・ポインタ(gp)」です。

(1)

グローバル・ポインタ(gp)の設定

グローバル・ポインタ(gp)に設定するアドレス値は,グローバル・ポインタ・シンボル(gpシンボル)の値をアドレス値として設定します。

-

gpシンボルは,固定シンボル名“__gp_data”で扱います。

-

gpシンボルは,スタートアップ・ルーチンで参照シンボル(.extern)として宣言してください。

-

gpシンボルは,rlink内で外部定義シンボル(.public)を作成しアドレス値を決定します。

-

gpシンボルの定義/参照に対する動作は以下のとおりです。

(a)

gpシンボルが“.extern”宣言のみ存在している場合

rlinkが定義情報を作成し,自動でアドレス値を設定します。

(b)

gpシンボルが定義されている場合

定義されたアドレス値を使用します。

(c)

gpシンボルが存在しない(使用されていない)場合

gp相対を参照するコードに対して,次のエラー・メッセージが出力されます。

Undefined external symbol "GP-symbol (__gp_data)" referenced in "FILE"

(2)

gpシンボル値の決定規則

gpシンボル値は,再配置属性がsdata,sbss,sdata23,およびsbss23のセクションから以下の優先順位で決定します。

図 8.1

グローバル・ポインタ値の決定規則

 

以下に,gpシンボル値の決定例を示します。

(a)

再配置属性がsdata,またはsbssのセクションが存在する場合

sdata,またはsbssセクションに対して,“1番小さいアドレスに配置されたセクションの開始アドレス”と“1番大きいアドレスに配置されたセクションの終了アドレス”の真ん中(2の倍数値,奇数の場合は最初の2の倍数値)をgpシンボルのアドレス値として設定します。

<1>

アドレスの小さい方から,sdata,sbssセクションの順で配置されている場合

<2>

アドレスの小さい方から,sbss,sdataセクションの順で配置されている場合

<3>

アドレスの小さい方から,sdata,sbssセクションの順で配置し,sdata,sbssセクションの間に対象外のセクションが存在している場合

(b)

再配置属性がsdata23,またはsbss23のセクションが存在する場合

sdata23,またはsbss23セクションに対して,“1番小さいアドレスに配置されたセクションの開始アドレス”と“1番大きいアドレスに配置されたセクションの終了アドレス”の真ん中(2の倍数値,奇数の場合は最初の2の倍数値)をgpシンボルのアドレス値として設定します。

<1>

アドレスの小さい方から,sdata23,sbss23セクションの順で配置されている場合

<2>

アドレスの小さい方から,sbss23,sdata23セクションの順で配置されている場合

<3>

アドレスの小さい方から,sdata23,sbss23セクションの順で配置し,sdata23,sbss23セクションの間に対象外のセクションが存在している場合

(c)

再配置属性がsdata,sbss,sdata23,およびsbss23のセクションが存在しない場合

sdata,sbss,sdata23,およびsbss23セクションが存在しない場合は,gpシンボルのアドレス値を0(ゼロ)として設定します。