Oracle® Solaris 11.2 Linkers and Libraries Guide

Exit Print View

Updated: July 2014
 
 

SPARC: Relocations

On the SPARC platform, relocation entries apply to bytes (byte8), half-words (half16), words (word32), and extended-words (xword64).

image:SPARC basic relocation entries.

The dispn family of relocation fields (disp19, disp22, disp30) are word-aligned, sign-extended, PC-relative displacements. All encode a value with its least significant bit in position 0 of the word, and differ only in the number of bits allocated to the value.

image:SPARC disp relocation entry.

The d2/disp8 and d2/disp14 variants encode 16 and 10-bit displacement values using two non-contiguous bit fields, d2, and dispn.

image:SPARC d2/disp relocation entries.

The immn family of relocation fields (imm5, imm6, imm7, imm10, imm13, imm22) represent unsigned integer constants. All encode a value with its least significant bit in position 0 of the word, and differ only in the number of bits allocated to the value.

image:SPARC imm relocation entry.

The simmn family of relocation fields (simm10, simm11, simm13, simm22) represent signed integer constants. All encode a value with its least significant bit in position 0 of the word, and differ only in the number of bits allocated to the value.

image:SPARC simm relocation entry.

SPARC: Relocation Types

Field names in the following table tell whether the relocation type checks for overflow. A calculated relocation value can be larger than the intended field, and a relocation type can verify (V) the value fits or truncate (T) the result. As an example, V-simm13 means that the computed value can not have significant, nonzero bits outside the simm13 field.

Table 12-16  SPARC: ELF Relocation Types
Name
Value
Field
Calculation
R_SPARC_NONE
0
None
None
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
None
Refer to the explanation following this table.
R_SPARC_GLOB_DAT
20
V-word32
S + A
R_SPARC_JMP_SLOT
21
None
Refer to the explanation following this table.
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
Refer to the explanation following this table.
R_SPARC_SIZE32
86
V-word32
Z + A
R_SPARC_WDISP10
88
V-d2/disp8
(S + A - P) >> 2

Note -  Additional relocations are available for thread-local storage references. These relocations are covered in Chapter 14, Thread-Local Storage.

Some relocation types have semantics beyond simple calculation.

R_SPARC_GOT10

Resembles R_SPARC_LO10, except that the relocation refers to the address of the symbol's GOT entry. Additionally, R_SPARC_GOT10 instructs the link-editor to create a global offset table.

R_SPARC_GOT13

Resembles R_SPARC_13, except that the relocation refers to the address of the symbol's GOT entry. Additionally, R_SPARC_GOT13 instructs the link-editor to create a global offset table.

R_SPARC_GOT22

Resembles R_SPARC_22, except that the relocation refers to the address of the symbol's GOT entry. Additionally, R_SPARC_GOT22 instructs the link-editor to create a global offset table.

R_SPARC_WPLT30

Resembles R_SPARC_WDISP30, except that the relocation refers to the address of the symbol's procedure linkage table entry. Additionally, R_SPARC_WPLT30 instructs the link-editor to create a procedure linkage table.

R_SPARC_COPY

Created by the link-editor for dynamic executables to preserve a read-only text segment. The relocation offset member refers to a location in a writable segment. The symbol table index specifies a symbol that should exist both in the current object file and in a shared object. During execution, the runtime linker copies data associated with the shared object's symbol to the location specified by the offset. See Copy Relocations.

R_SPARC_GLOB_DAT

Resembles R_SPARC_32, except that the relocation sets a GOT entry to the address of the specified symbol. The special relocation type enables you to determine the correspondence between symbols and GOT entries.

R_SPARC_JMP_SLOT

Created by the link-editor for dynamic objects to provide lazy binding. The relocation offset member gives the location of a procedure linkage table entry. The runtime linker modifies the procedure linkage table entry to transfer control to the designated symbol address.

R_SPARC_RELATIVE

Created by the link-editor for dynamic objects. The relocation offset member gives the location within a shared object that contains a value representing a relative address. The runtime linker computes the corresponding virtual address by adding the virtual address at which the shared object is loaded to the relative address. Relocation entries for this type must specify a value of zero for the symbol table index.

R_SPARC_UA32

Resembles R_SPARC_32, except that the relocation refers to an unaligned word. The word to be relocated must be treated as four separate bytes with arbitrary alignment, not as a word aligned according to the architecture requirements.

R_SPARC_LM22

Resembles R_SPARC_HI22, except that the relocation truncates rather than validates.

R_SPARC_PC_LM22

Resembles R_SPARC_PC22, except that the relocation truncates rather than validates.

R_SPARC_HIX22

Used with R_SPARC_LOX10 for executables that are confined to the uppermost 4 gigabytes of the 64–bit address space. Similar to R_SPARC_HI22, but supplies ones complement of linked value.

R_SPARC_LOX10

Used with R_SPARC_HIX22. Similar to R_SPARC_LO10, but always sets bits 10 through 12 of the linked value.

R_SPARC_L44

Used with the R_SPARC_H44 and R_SPARC_M44 relocation types to generate a 44-bit absolute addressing model.

R_SPARC_REGISTER

Used to initialize a register symbol. The relocation offset member contains the register number to be initialized. A corresponding register symbol must exist for this register. The symbol must be of type SHN_ABS.

R_SPARC_GOTDATA_OP_HIX22, R_SPARC_GOTDATA_OP_LOX10, and R_SPARC_GOTDATA_OP

These relocations provide for code transformations.

64-bit SPARC: Relocation Types

The following notation, used in relocation calculation, is unique to 64–bit SPARC.

O

The secondary addend used to compute the value of the relocation field. This addend is extracted from the r_info field by applying the ELF64_R_TYPE_DATA macro.

The relocations that are listed in the following table extend, or alter, the relocations defined for 32–bit SPARC. See Relocation Types.

Table 12-17  64-bit SPARC: ELF Relocation Types
Name
Value
Field
Calculation
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

The following relocation type has semantics beyond simple calculation.

R_SPARC_OLO10

Resembles R_SPARC_LO10, except that an extra offset is added to make full use of the 13-bit signed immediate field.