SPARC: 再配置
SPARC プラットフォームでは、再配置エントリはバイト (byte8)、ハーフワード (half16)、ワード (word32)、および拡張ワード (xword64) に適用されます。
再配置フィールドの dispn ファミリ (disp19、disp22、disp30) は、ワード整列された符号拡張の PC 相対ディスプレイスメントです。すべてワードの位置 0 の最下位ビットで値をエンコードし、値に割り当てられたビット数についてのみ異なります。
d2/disp8 および d2/disp14 バリアントは、隣接しない 2 つのビットフィールド d2 および disp n を使用して、16 および 10 ビットのディスプレイスメント値をエンコードします。
再配置フィールドの immn ファミリ (imm5、imm6、imm7、imm10、imm13、imm22) は、符号なしの整数定数を表します。すべてワードの位置 0 の最下位ビットで値をエンコードし、値に割り当てられたビット数についてのみ異なります。
再配置フィールドの simmn ファミリ (simm10、simm11、simm13、simm22) は、符号付きの整数定数を表します。すべてワードの位置 0 の最下位ビットで値をエンコードし、値に割り当てられたビット数についてのみ異なります。
SPARC: 再配置型
次の表に示すフィールド名は、再配置型がオーバーフローを検査するかどうかを通知します。計算される再配置値は意図したフィールドより大きい場合があり、再配置型によっては値の適合を検証 (V) したり結果を切り捨てたり (T) することがあります。たとえば、V-simm13 は、計算された値が simm13 フィールドの外部に 0 以外の有意ビットを持つことがないことを意味します。
表 12-16 SPARC: ELF 再配置型
|
|
|
|
R_SPARC_NONE
|
0
|
なし
|
なし
|
R_SPARC_8
|
1
|
V-byte8
|
S + A
|
R_SPARC_16
|
2
|
V-half16
|
S + A
|
R_SPARC_32
|
3
|
V-word32
|
S + A
|
R_SPARC_DISP8
|
4
|
V-byte8
|
S + A - P
|
R_SPARC_DISP16
|
5
|
V-half16
|
S + A - P
|
R_SPARC_DISP32
|
6
|
V-disp32
|
S + A - P
|
R_SPARC_WDISP30
|
7
|
V-disp30
|
(S + A - P) >> 2
|
R_SPARC_WDISP22
|
8
|
V-disp22
|
(S + A - P) >> 2
|
R_SPARC_HI22
|
9
|
T-imm22
|
(S + A) >> 10
|
R_SPARC_22
|
10
|
V-imm22
|
S + A
|
R_SPARC_13
|
11
|
V-simm13
|
S + A
|
R_SPARC_LO10
|
12
|
T-simm13
|
(S + A) & 0x3ff
|
R_SPARC_GOT10
|
13
|
T-simm13
|
G & 0x3ff
|
R_SPARC_GOT13
|
14
|
V-simm13
|
G
|
R_SPARC_GOT22
|
15
|
T-simm22
|
G >> 10
|
R_SPARC_PC10
|
16
|
T-simm13
|
(S + A - P) & 0x3ff
|
R_SPARC_PC22
|
17
|
V-disp22
|
(S + A - P) >> 10
|
R_SPARC_WPLT30
|
18
|
V-disp30
|
(L + A - P) >> 2
|
R_SPARC_COPY
|
19
|
なし
|
この表のあとの説明を参照してください。
|
R_SPARC_GLOB_DAT
|
20
|
V-word32
|
S + A
|
R_SPARC_JMP_SLOT
|
21
|
なし
|
この表のあとの説明を参照してください。
|
R_SPARC_RELATIVE
|
22
|
V-word32
|
B + A
|
R_SPARC_UA32
|
23
|
V-word32
|
S + A
|
R_SPARC_PLT32
|
24
|
V-word32
|
L + A
|
R_SPARC_HIPLT22
|
25
|
T-imm22
|
(L + A) >> 10
|
R_SPARC_LOPLT10
|
26
|
T-simm13
|
(L + A) & 0x3ff
|
R_SPARC_PCPLT32
|
27
|
V-word32
|
L + A - P
|
R_SPARC_PCPLT22
|
28
|
V-disp22
|
(L + A - P) >> 10
|
R_SPARC_PCPLT10
|
29
|
V-simm13
|
(L + A - P) & 0x3ff
|
R_SPARC_10
|
30
|
V-simm10
|
S + A
|
R_SPARC_11
|
31
|
V-simm11
|
S + A
|
R_SPARC_HH22
|
34
|
V-imm22
|
(S + A) >> 42
|
R_SPARC_HM10
|
35
|
T-simm13
|
((S + A) >> 32) & 0x3ff
|
R_SPARC_LM22
|
36
|
T-imm22
|
(S + A) >> 10
|
R_SPARC_PC_HH22
|
37
|
V-imm22
|
(S + A - P) >> 42
|
R_SPARC_PC_HM10
|
38
|
T-simm13
|
((S + A - P) >> 32) & 0x3ff
|
R_SPARC_PC_LM22
|
39
|
T-imm22
|
(S + A - P) >> 10
|
R_SPARC_WDISP16
|
40
|
V-d2/disp14
|
(S + A - P) >> 2
|
R_SPARC_WDISP19
|
41
|
V-disp19
|
(S + A - P) >> 2
|
R_SPARC_7
|
43
|
V-imm7
|
S + A
|
R_SPARC_5
|
44
|
V-imm5
|
S + A
|
R_SPARC_6
|
45
|
V-imm6
|
S + A
|
R_SPARC_HIX22
|
48
|
V-imm22
|
((S + A) ^ 0xffffffffffffffff) >> 10
|
R_SPARC_LOX10
|
49
|
T-simm13
|
((S + A) & 0x3ff) | 0x1c00
|
R_SPARC_H44
|
50
|
V-imm22
|
(S + A) >> 22
|
R_SPARC_M44
|
51
|
T-imm10
|
((S + A) >> 12) & 0x3ff
|
R_SPARC_L44
|
52
|
T-imm13
|
(S + A) & 0xfff
|
R_SPARC_REGISTER
|
53
|
V-word32
|
S + A
|
R_SPARC_UA16
|
55
|
V-half16
|
S + A
|
R_SPARC_GOTDATA_HIX22
|
80
|
V-imm22
|
((S + A - GOT) >> 10) ^ ((S + A - GOT) >> 31)
|
R_SPARC_GOTDATA_LOX10
|
81
|
T-imm13
|
((S + A - GOT) & 0x3ff) | (((S + A - GOT) >> 31) & 0x1c00)
|
R_SPARC_GOTDATA_OP_HIX22
|
82
|
T-imm22
|
(G >> 10) ^ (G >> 31)
|
R_SPARC_GOTDATA_OP_LOX10
|
83
|
T-imm13
|
(G & 0x3ff) | ((G >> 31) & 0x1c00)
|
R_SPARC_GOTDATA_OP
|
84
|
Word32
|
この表のあとの説明を参照してください。
|
R_SPARC_SIZE32
|
86
|
V-word32
|
Z + A
|
R_SPARC_WDISP10
|
88
|
V-d2/disp8
|
(S + A - P) >> 2
|
|
いくつかの再配置型には、単純な計算を超えたセマンティクスが存在します。
- R_SPARC_GOT10
-
R_SPARC_LO10 に似ていますが、シンボルの GOT エントリのアドレスを参照する点が異なります。また、R_SPARC_GOT10 は、グローバルオフセットテーブルの作成をリンカーに指示します。
- R_SPARC_GOT13
-
R_SPARC_13 に似ていますが、シンボルの GOT エントリのアドレスを参照する点が異なります。また、R_SPARC_GOT13 は、グローバルオフセットテーブルの作成をリンカーに指示します。
- R_SPARC_GOT22
-
R_SPARC_22 に似ていますが、シンボルの GOT エントリのアドレスを参照する点が異なります。また、R_SPARC_GOT22 は、グローバルオフセットテーブルの作成をリンカーに指示します。
- R_SPARC_WPLT30
-
R_SPARC_WDISP30 に似ていますが、シンボルのプロシージャーリンクテーブルエントリのアドレスを参照する点が異なります。また、R_SPARC_WPLT30 は、プロシージャーのリンクテーブル作成をリンカーに指示します。
- R_SPARC_COPY
-
リンカーは、この再配置型を作成して、動的実行可能ファイルが読み取り専用のテキストセグメントを保持できるようにします。この再配置型のオフセットメンバーは、書き込み可能セグメントの位置を参照します。シンボルテーブルインデックスは、現オブジェクトファイルと共有オブジェクトの両方に存在する必要があるシンボルを指定します。実行時、実行時リンカーは共有オブジェクトのシンボルに関連付けられているデータを、オフセットで指定されている位置にコピーします。コピー再配置を参照してください。
- R_SPARC_GLOB_DAT
-
R_SPARC_32 に似ていますが、再配置は GOT エントリを指定されたシンボルのアドレスに設定する点が異なります。この特殊な再配置型を使うと、シンボルと GOT エントリの対応付けを判定できます。
- R_SPARC_JMP_SLOT
-
リンカーは、動的オブジェクトが遅延結合を提供できるようにするため、この再配置型を作成します。この再配置型のオフセットメンバーは、プロシージャーのリンクテーブルエントリの位置を与えます。実行時リンカーは、プロシージャーのリンクテーブルエントリを変更して指定シンボルアドレスに制御を渡します。
- R_SPARC_RELATIVE
-
リンカーは、動的オブジェクト用にこの再配置型を作成します。この再配置型のオフセットメンバーは、相対アドレスを表す値が存在する、共有オブジェクト内の位置を与えます。実行時リンカーは共有オブジェクトが読み込まれる仮想アドレスに相対アドレスを加算することで、対応する仮想アドレスを計算します。この型に対する再配置エントリは、シンボルテーブルインデックスに対して値 0 を指定する必要があります。
- R_SPARC_UA32
-
R_SPARC_32 に似ていますが、整列されていないワードを参照する点が異なります。再配置されるワードは、任意整列が存在する 4 つの別個のバイトとして処理されなければなりません (アーキテクチャーの要求に従って整列されるワードとしては処理されません)。
- R_SPARC_LM22
-
R_SPARC_HI22 に似ていますが、妥当性検証ではなく切り捨てを行う点が異なります。
- R_SPARC_PC_LM22
-
R_SPARC_PC22に似ていますが、妥当性検証ではなく切り捨てを行う点が異なります。
- R_SPARC_HIX22
-
64 ビットアドレス空間の最上位 4G バイトに限定される実行可能ファイルに対して R_SPARC_LOX10 とともに使用されます。R_SPARC_HI22 に似ていますが、リンク値の 1 の補数を与えます。
- R_SPARC_LOX10
-
R_SPARC_HIX22 とともに使用されます。R_SPARC_LO10 に似ていますが、必ずリンク値のビット 10 からビット 12 までを設定します。
- R_SPARC_L44
-
再配置型 R_SPARC_H44 および R_SPARC_M44 とともに使用され、44 ビット絶対アドレス指定モデルを生成します。
- R_SPARC_REGISTER
-
レジスタシンボルの初期化に使用されます。この再配置型のオフセットメンバーには、初期化されるレジスタ番号が存在します。このレジスタに対応するレジスタシンボルが必要です。このシンボルの種類は SHN_ABS です。
- R_SPARC_GOTDATA_OP_HIX22、R_SPARC_GOTDATA_OP_LOX10、および R_SPARC_GOTDATA_OP
-
これらの再配置はコード変換に対応したものです。
64-bit SPARC: 再配置型
再配置計算に使用される次の表記は、64 ビット SPARC 固有のものです。
- O
-
再配置可能フィールドの値を計算するために使用される二次的な加数。この加数は、ELF64_R_TYPE_DATA マクロを適用することにより r_info フィールドから抽出されます。
次の表に示す再配置型は、32 ビット SPARC 用に定義された再配置型を拡張または変
更します。再配置型を参照してください。
表 12-17 64-bit SPARC: ELF 再配置型
|
|
|
|
R_SPARC_HI22
|
9
|
V-imm22
|
(S + A) >> 10
|
R_SPARC_GLOB_DAT
|
20
|
V-xword64
|
S + A
|
R_SPARC_RELATIVE
|
22
|
V-xword64
|
B + A
|
R_SPARC_64
|
32
|
V-xword64
|
S + A
|
R_SPARC_OLO10
|
33
|
V-simm13
|
((S + A) & 0x3ff) + O
|
R_SPARC_DISP64
|
46
|
V-xword64
|
S + A - P
|
R_SPARC_PLT64
|
47
|
V-xword64
|
L + A
|
R_SPARC_REGISTER
|
53
|
V-xword64
|
S + A
|
R_SPARC_UA64
|
54
|
V-xword64
|
S + A
|
R_SPARC_H34
|
85
|
V-imm22
|
(S + A) >> 12
|
R_SPARC_SIZE64
|
87
|
V-xword64
|
Z + A
|
|
次の再配置型には、単純な計算を超えたセマンティクスが存在します。
- R_SPARC_OLO10
-
R_SPARC_LO10 に似ていますが、符号付き 13 ビット即値フィールドを十分に使用するために余分なオフセットが追加される点が異なります。