アプリケーション内でグローバル宣言したデータはメモリに配置されます。このメモリに配置されているデータを参照(ロード,ストア)する際,配置位置に依存することのない参照(Position Independent Data:PID)を実現するために用意されるポインタが「グローバル・ポインタ(gp)」です。
グローバル・ポインタ(gp)に設定するアドレス値は,グローバル・ポインタ・シンボル(gpシンボル)の値をアドレス値として設定します。
- | gpシンボルは,固定シンボル名“__gp_data”で扱います。 |
- | gpシンボルは,スタートアップ・ルーチンで参照シンボル(.extern)として宣言してください。 |
- | gpシンボルは,rlink内で外部定義シンボル(.public)を作成しアドレス値を決定します。 |
- | gpシンボルの定義/参照に対する動作は以下のとおりです。 |
(a) | gpシンボルが“.extern”宣言のみ存在している場合 |
rlinkが定義情報を作成し,自動でアドレス値を設定します。
定義されたアドレス値を使用します。
(c) | gpシンボルが存在しない(使用されていない)場合 |
gp相対を参照するコードに対して,次のエラー・メッセージが出力されます。
Undefined external symbol "GP-symbol (__gp_data)" referenced in "FILE"
|
gpシンボル値は,再配置属性がsdata,sbss,sdata23,およびsbss23のセクションから以下の優先順位で決定します。
以下に,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(ゼロ)として設定します。