リンカーとライブラリ

再配置

再配置は、記号参照を記号定義に関連付ける処理です。たとえば、プログラムが関数を呼び出すとき、関連付けられている呼び出し命令は、実行時に適切な宛先アドレスに制御を渡さなければなりません。つまり、再配置可能ファイルには、セクション内容の変更方法を示す情報が存在しなければなりません。その結果、実行可能オブジェクトファイルと共有オブジェクトファイルは、プロセスのプログラムイメージに関する正しい情報を保持できます。再配置エントリは、これらのデータを保持します。

再配置エントリは、以下の構造体 (sys/elf.h で定義されている) を持つことができます。


typedef struct {
        Elf32_Addr      r_offset;
        Elf32_Word      r_info;
} Elf32_Rel;
 
typedef struct {
        Elf32_Addr      r_offset;
        Elf32_Word      r_info;
        Elf32_Sword     r_addend;
} Elf32_Rela;

typedef struct {
        Elf64_Addr      r_offset;
        Elf64_Xword     r_info;
} Elf64_Rel;
 
typedef struct {
        Elf64_Addr      r_offset;
        Elf64_Xword     r_info;
        Elf64_Sxword    r_addend;
} Elf32_Rela;
r_offset

この構成要素は、再配置処理を適用する位置を与えます。再配置可能ファイルの場合、値はセクションの先頭から再配置の影響を受ける領域までのオフセットです。実行可能ファイルまたは共有オブジェクトの場合、値は再配置の影響を受ける領域の仮想アドレスです。

r_info

この構成要素は、再配置が行われなければならないシンボルテーブルインデックスと、適用される再配置の種類を与えます。たとえば、呼び出し命令の再配置エントリは、呼び出される関数のシンボルテーブルインデックスを保持します。インデックスが STN_UNDEF (未定義シンボルインデックス) の場合、再配置はシンボル値として 0 を使用します。再配置の種類はプロセッサに固有です。再配置の種類の動作は以下に記述します。以下のテキストが再配置エントリの再配置の種類またはシンボルテーブルインデックスを参照すると、それぞれ ELF32_R_TYPE または ELF32_R_SYM をエントリの r_info 構成要素に適用した結果が得られます。


#define ELF32_R_SYM(i)                ((i)>>8)
#define ELF32_R_TYPE(i)               ((unsigned char)(i))
#define ELF32_R_INFO(s, t)            (((s)<<8)+(unsigned char)(t))

#define ELF64_R_SYM(info)             ((info)>>32)
#define ELF64_R_TYPE(info)            ((Elf64_Word)(info))
#define ELF64_R_INFO(sym, type)       (((Elf64_Xword)(sym)<<32)+ ¥ 
                                        (Elf64_Xword)(type))

Elf64_Rel および Elf64_Rela 構造の場合、r_info フィールドはさらに 8 ビットの識別子と 24 ビットの付随的なデータに分割されます。


#define ELF64_R_TYPE_DATA(info)       (((Elf64_Xword)(info)<<32)>>40)
#define ELF64_R_TYPE_ID(info)         (((Elf64_Xword)(info)<<56)>>56)
#define ELF64_R_TYPE_INFO(data, type) (((Elf64_Xword)(data)<<8)+ ¥ 
                                        (Elf64_Xword)(type))
r_addend

この構成要素は、再配置可能フィールドに格納される値の計算に使用される定数加数を指定します。

前述したとおり、Elf32_Rela エントリにのみ明示的加数が存在します。Elf32_Rel エントリには、変更される位置に暗黙の加数が存在します。32 ビット SPARC は Elf32_Rela エントリ、64 ビット SPARC は Elf64_Rela エントリ、 IA は Elf32_Rel エントリをそれぞれ使用します。

再配置セクションは、他の 2 つのセクション (シンボルテーブルと変更されるセクション) を参照します。セクションヘッダーの sh_infosh_link 構成要素 (「セクション」で記述している) は、これらの関係を指定します。異なる複数のオブジェクトファイルに対する再配置エントリには、r_offset 構成要素に関してわずかに異なる解釈が存在します。

r_offset の解釈は異なる複数のオブジェクトファイルでは変化し、その結果、関連プログラムによる効率的アクセスが可能になっていますが、再配置タイプの意味は変化しません。

再配置型 (プロセッサ固有の)

SPARC の場合、再配置エントリは以下の命令/データフィールドの変更方法を記述します (ビット番号はボックスの下隅に表示される)。

Graphic

IA の場合、再配置エントリは以下の命令/データフィールドの変更方法を記述します (ビット番号はボックスの下隅に表示される)。

Graphic

word32 は、任意バイト整列が存在する 4 バイトを占める 32 ビットフィールドを指定します。これらの値は、IA アーキテクチャにおける他のワード値と同じバイト順序を使用します。

Graphic

64 ビット SPARC には、64 ビットワードフィールドが存在します。

Graphic

以下の計算では、が再配置可能ファイルを実行可能プログラムまたは共有オブジェクトファイルに変換することが仮定されています。概念上、リンカーは 1 つまたは複数の再配置可能ファイルを併合して出力します。リンカーは、まず入力ファイルの結合/配置方法を決め、次にシンボル値を更新し、最後に再配置を行います。実行可能オブジェクトファイルと共有オブジェクトファイルに適用される再配置は類似しており、同じ結果を実現します。後述の説明では、以下の表記が使用されています。

A

再配置可能フィールドの値を計算するために使用される加数を意味します。

B

実行時に共有オブジェクトがメモリーに読み込まれる基底アドレスを意味します。一般に共有オブジェクトファイルは 0 基底仮想アドレスで作成されますが、実行アドレスは異なります。基底アドレスについては、「プログラムヘッダー」を参照してください。

G

実行時に再配置エントリのシンボルのアドレスが存在する「大域オフセットテーブル」へのオフセットを意味します。詳細は、「大域オフセットテーブル (プロセッサ固有)」を参照してください。

GOT

「大域オフセットテーブル」のアドレスを意味します。詳細は、「大域オフセットテーブル (プロセッサ固有)」を参照してください。

L

シンボルに対する「手続きリンクテーブル」エントリの位置 (セクションオフセットまたはアドレス) を意味します。手続きリンクテーブルエントリは、関数呼び出しを適切な宛先に変更します。リンカーは初期手続きリンクテーブルを作成し、実行時リンカーは実行時にエントリを変更します。詳細は、「手続きリンクテーブル (プロセッサに固有)」を参照してください。

P

再配置される領域の位置 (セクションオフセットまたはアドレス) (r_offset を使って計算される) を意味します。

S

インデックスが再配置エントリに存在するシンボルの値を意味します。

SPARC 再配置エントリは、バイト (byte8)、ハーフワード (half16)、またはワード (その他) に適用されます。IA 再配置エントリはワードに適用されます。どの場合も r_offset 値は、影響が与えられる領域の先頭バイトのオフセットまたは仮想アドレスを指定します。再配置タイプは、変更されるビットと、これらのビットの値の計算方法を指定します。

32 ビット SPARC は明示的加数が存在する Elf32_Rela 再配置エントリのみを使用し、64 ビット SPARC は Elf64_Rela を使用します。したがって、r_addend 構成要素は再配置加数として機能します。IA は Elf32_Rel 再配置エントリのみを使用し、再配置されるフィールドは加数を保持します。すべての場合において、加数と計算された結果は同じバイト順序を使用します。

SPARC: 再配置型


注 -

表 7-26 に示されているフィールド名は、再配置型がオーバーフローを検査するかどうかを通知します。計算される再配置値は意図したフィールドより大きい場合があり、再配置の型によっては値の適合を検証 (V) したり結果を切り捨てたり (T) することがあります。たとえば、V-simm13 は、計算された値が simm13 フィールドの外部に 0 以外の有意ビットを持つことがないことを意味します。


表 7-26 SPARC: 再配置型

名前 

値 

フィールド 

計算 

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_JMP_SLOT」を参照

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_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_GOT10

この再配置型は R_SPARC_LO10 に似ています。ただし、次の点が異なります。つまり、この再配置型はシンボルの大域オフセットテーブルエントリのアドレスを参照し、かつ大域オフセットテーブルを作成するようにリンカーに指示します。

R_SPARC_GOT13

この再配置型は R_SPARC_13 に似ています。ただし、次の点が異なります。つまり、この再配置型はシンボルの大域オフセットテーブルエントリのアドレスを参照し、かつ大域オフセットテーブルを作成するようにリンカーに指示します。

R_SPARC_GOT22

この再配置型は R_SPARC_22 に似ています。ただし、次の点が異なります。つまり、この再配置型はシンボルの大域オフセットテーブルエントリのアドレスを参照し、かつ大域オフセットテーブルを作成するようにリンカーに指示します。

R_SPARC_WPLT30

この再配置型は R_SPARC_WDISP30 に類似しています。ただし、次の点が異なります。つまり、この再配置型はシンボルの手続きリンクテーブルエントリのアドレスを参照し、かつ手続きリンクテーブルを作成するようにリンカーに指示します。

R_SPARC_COPY

リンカーは、動的リンクを行うためにこの再配置型を使用します。この再配置型のオフセット構成要素は、書き込み可能セグメントの位置を参照します。シンボルテーブルインデックスは、現オブジェクトファイルと共有オブジェクトの両方に存在する必要があるシンボルを指定します。実行時、実行時リンカーは共有オブジェクトのシンボルに関連付けられているデータを、オフセットで指定されている位置にコピーします。詳細は、「再配置のコピー」を参照してください。

R_SPARC_GLOB_DAT

この再配置型は R_SPARC_32 に似ています。ただし、次の点が異なります。つまり、この再配置型は大域オフセットテーブルエントリを、指定されたシンボルのアドレスに設定します。この特殊な再配置型を使うと、シンボルと大域オフセットテーブルエントリの対応付けを判定できます。

R_SPARC_JMP_SLOT

リンカーは、動的リンクを行うためにこの再配置型を使用します。この再配置型のオフセット構成要素は、手続きリンクテーブルエントリの位置を与えます。実行時リンカーは、手続きリンクテーブルエントリを変更して指定シンボルアドレスに制御を渡します。

R_SPARC_RELATIVE

リンカーは、動的リンクを行うためにこの再配置型を使用します。この再配置型のオフセット構成要素は、相対アドレスを表す値が存在する、共有オブジェクト内の位置を与えます。実行時リンカーは共有オブジェクトが読み込まれる仮想アドレスを相対アドレスに加算することで、対応する仮想アドレスを計算します。この型に対する再配置エントリは、シンボルテーブルインデックスに対して 0 を指定しなければなりません。

R_SPARC_UA32

この再配置型は R_SPARC_32 に似ていますが、整列されていないワードを参照する点が異なります。つまり、再配置されるワードは、任意整列が存在する 4 つの別個のバイトとして処理されなければなりません (アーキテクチャの要求に従って整列されるワードとしては処理されません)。

SPARC: 再配置型


注 -

表 7-27 に示されているフィールド名は、再配置型がオーバーフローを検査するかどうかを通知します。計算される再配置値は意図したフィールドより大きい場合があり、再配置型によっては値の適合を検証 (V) したり結果を切り捨てたり (T) することがあります。たとえば、V-simm13 は、計算された値が simm13 フィールドの外部に 0 以外の有意ビットを持つことがないことを意味します。


表 7-27 SPARC: 再配置型

名前 

値 

フィールド 

計算 

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

V-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-xword64

S + A

R_SPARC_JMP_SLOT

21

なし 

R_SPARC_JMP_SLOT」を参照

R_SPARC_RELATIVE

22

V-xword64

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-disp32

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_64

32

V-xword64

S + A

R_SPARC_OLO10

33

V-simm13

( (S + A) & 0x3ff) + O

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) & 0x7f

R_SPARC_5

44

V-imm5

(S + A) & 0x1f

R_SPARC_6

45

V-imm6

(S + A) & 0x3f

R_SPARC_DISP64

46

V-xword64

S + A - P

R_SPARC_PLT64

47

V-xword64

L + 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-xword64

S + A

R_SPARC_UA64

54

V-xword64

S + A

R_SPARC_UA16

55

V-half16

S + A

いくつかの再配置型には、単純な計算を超えた意味が存在します。

R_SPARC_GOT10

この再配置型は R_SPARC_LO10 に似ています。ただし、次の点が異なります。つまり、この再配置型はシンボルの大域オフセットテーブルエントリのアドレスを参照し、かつ大域オフセットテーブルを作成するようにリンカーに指示します。

R_SPARC_GOT13

この再配置型は R_SPARC_13 に似ています。ただし、次の点が異なります。つまり、この再配置型はシンボルの大域オフセットテーブルエントリのアドレスを参照し、かつ大域オフセットテーブルを作成するようにリンカーに指示します。

R_SPARC_GOT22

この再配置型は R_SPARC_22 に似ています。ただし、次の点が異なります。つまり、この再配置型はシンボルの大域オフセットテーブルエントリのアドレスを参照し、かつ大域オフセットテーブルを作成するようにリンカーに指示します。

R_SPARC_WPLT30

この再配置型は R_SPARC_WDISP30 に似ています。ただし、次の点が異なります。つまり、この再配置型はシンボルの手続きリンクテーブルエントリのアドレスを参照し、かつ手続きリンクテーブルを作成するようにリンカーに指示します。

R_SPARC_COPY

リンカーは、動的リンクを行うためにこの再配置型を使用します。この再配置型のオフセット構成要素は、書き込み可能セグメントの位置を参照します。シンボルテーブルインデックスは、現オブジェクトファイルと共有オブジェクトの両方に存在する必要があるシンボルを指定します。実行時、実行時リンカーは共有オブジェクトのシンボルに関連付けられているデータを、オフセットで指定されている位置にコピーします。詳細は、「再配置のコピー」を参照してください。

R_SPARC_GLOB_DAT

この再配置型は R_SPARC_64 に似ています。ただし、次の点が異なります。つまり、この再配置型は大域オフセットテーブルエントリを、指定されたシンボルのアドレスに設定します。この特殊な再配置型を使うと、シンボルと大域オフセットテーブルエントリの対応付けを判定できます。

R_SPARC_JMP_SLOT

リンカーは、動的リンクを行うためにこの再配置型を作成します。この再配置型のオフセット構成要素は、手続きリンクテーブルエントリの位置を与えます。実行時リンカーは、手続きリンクテーブルエントリを変更して指定シンボルアドレスに制御を渡します。

R_SPARC_RELATIVE

リンカーは、動的リンクを行うためにこの再配置型を使用します。この再配置型のオフセット構成要素は、相対アドレスを表す値が存在する、共有オブジェクト内の位置を与えます。実行時リンカーは共有オブジェクトが読み込まれる仮想アドレスを相対アドレスに加算することで、対応する仮想アドレスを計算します。この型に対する再配置エントリは、シンボルテーブルインデックスに対して 0 を指定しなければなりません。

R_SPARC_UA32

この再配置型は R_SPARC_32 に似ていますが、整列されていないワードを参照する点が異なります。つまり、再配置されるワードは、任意整列が存在する 4 つの別個のバイトとして処理されなければなりません (アーキテクチャの要求に従って整列されるワードとしては処理されません)。

R_SPARC_OLO10

この再配置型は R_SPARC_LO10 に似ていますが、符号付き 13 ビット即値フィールドを十分に使用するために余分なオフセットが追加される点が異なります。

R_SPARC_HH22

アセンブラは、"imm22-instruction ... %hh (absolute) ..." という形式の命令を認識すると、この再配置型を使用します。

R_SPARC_HM10

アセンブラは、"simm13-instruction ... %hm (absolute) ..." という形式の命令を認識すると、この再配置型を生成します。

R_SPARC_LM22

アセンブラは、"imm22-instruction ... %lm (absolute) ..." という形式の命令を認識すると、この再配置型を使用します。この再配置型は R_SPARC_HI22 に似ていますが、妥当性検査ではなく切り捨てを行う点が異なります。

R_SPARC_PC_HH22

アセンブラは、"imm22-instruction ... %hh (pc-relative) ..." という形式の命令を認識すると、この再配置型を使用します。

R_SPARC_PC_HM10

アセンブラは、"simm13-instruction ... %hm (pc-relative) ..." という形式の命令を認識すると、この再配置型を生成します。

R_SPARC_PC_LM22

アセンブラは、"imm22-instruction ... %lm (pc-relative) ..." という形式の命令を認識すると、この再配置型を使用します。この再配置型は R_SPARC_PC22 に似ていますが、妥当性検査ではなく切り捨てを行う点が異なります。

R_SPARC_7

アセンブラは 7 ビットソフトウェアトラップ番号に対してこの再配置型を使用します。

R_SPARC_HIX22

この再配置型は、64 ビットアドレス空間の最上位 4GB に限定される実行可能ファイルに対して R_SPARC_LOX10 と共に使用されます。R_SPARC_HI22 に似ていますが、リンク値の 1 の補数を与えます。

R_SPARC_LOX10

R_SPARC_HIX22 と共に使用されます。R_SPARC_LO10 に似ていますが、必ずリンク値のビット 10 からビット 12 までを設定します。

R_SPARC_H44

アセンブラは、"imm44-instruction ... %h44 (absolute) .." という形式の命令を認識すると、この再配置型を使用します。

R_SPARC_M44

アセンブラは、"imm44-instruction ... %m44 (absolute) ..." という形式の命令を認識すると、この再配置型を生成します。

R_SPARC_L44

この再配置型は再配置型 R_SPARC_H44 および R_SPARC_M44 と共に使用され、44 ビット絶対アドレス指定モデルを生成します。アセンブラは、"imm44-instruction ... %l44 (absolute) ..." という形式の命令を認識すると、この再配置型を生成します。

R_SPARC_REGISTER

この再配置型は、レジスタシンボルを初期化するために使用されます。この再配置型のオフセット構成要素には、初期化されるレジスタ番号が存在します。SHN_ABS 型のこのレジスタには、対応するレジスタシンボルが存在しなければなりません。

IA: 再配置型

表 7-28 IA: 再配置型

名前 

値 

フィールド 

計算 

R_386_NONE

0

none 

なし 

R_386_32

1

word32

S + A

R_386_PC32

2

word32

S + A - P

R_386_GOT32

3

word32

G + A

R_386_PLT32

4

word32

L + A - P

R_386_COPY

5

なし 

なし 

R_386_GLOB_DAT

6

word32

S

R_386_JMP_SLOT

7

word32

S

R_386_RELATIVE

8

word32

B + A

R_386_GOTOFF

9

word32

S + A - GOT

R_386_GOTPC

10

word32

GOT + A - P

R_386_32PLT

11

word32

L + A

いくつかの再配置型には、単純な計算を超えた意味が存在します。

R_386_GOT32

この再配置型は、大域オフセットテーブルの基底からシンボルの大域オフセットテーブルエントリまでの距離を計算します。この再配置型はまた、大域オフセットテーブルを作成するようにリンカーに指示します。

R_386_PLT32

この再配置型はシンボルの手続きリンクテーブルエントリのアドレスを計算し、かつ手続きリンクテーブルを作成するようにリンカーに指示します。

R_386_COPY

リンカーは、動的リンクを行うためにこの再配置型を使用します。この再配置型のオフセット構成要素は、書き込み可能セグメントの位置を参照します。シンボルテーブルインデックスは、現オブジェクトファイルと共有オブジェクトの両方に存在する必要があるシンボルを指定します。実行時、実行時リンカーは共有オブジェクトのシンボルに関連付けられているデータを、オフセットで指定されている位置にコピーします。詳細は、「再配置のコピー」を参照してください。

R_386_GLOB_DAT

この再配置型は大域オフセットテーブルエントリを、指定されたシンボルのアドレスに設定します。この特殊な再配置型を使うと、シンボルと大域オフセットテーブルエントリの対応付けを判定できます。

R_386_JMP_SLOT

リンカーは、動的リンクを行うためにこの再配置型を使用します。この再配置型のオフセット構成要素は、手続きリンクテーブルエントリの位置を与えます。実行時リンカーは、手続きリンクテーブルエントリを変更して指定シンボルアドレスに制御を渡します。

R_386_RELATIVE

リンカーは、動的リンクを行うためにこの再配置型を使用します。この再配置型のオフセット構成要素は、相対アドレスを表す値が存在する、共有オブジェクト内の位置を与えます。実行時リンカーは共有オブジェクトが読み込まれる仮想アドレスに相対アドレスを加算することで、対応する仮想アドレスを計算します。この型に対する再配置エントリは、シンボルテーブルインデックスに対して 0 を指定しなければなりません。

R_386_GOTOFF

この再配置型は、シンボルの値と大域オフセットテーブルのアドレスの差を計算します。この再配置型はまた、大域オフセットテーブルを作成するようにリンカーに指示します。

R_386_GOTPC

この再配置型は R_386_PC32 に似ていますが、計算を行う際に大域オフセットテーブルのアドレスを使用する点が異なります。この再配置で参照されるシンボルは、通常 _GLOBAL_OFFSET_TABLE_ です。この再配置型はまた、大域オフセットテーブルを作成するようにリンカーに指示します。