1 // sparc.h -- ELF definitions specific to EM_SPARC -*- C++ -*-
3 // Copyright (C) 2008-2022 Free Software Foundation, Inc.
4 // Written by David S. Miller <davem@davemloft.net>.
6 // This file is part of elfcpp.
8 // This program is free software; you can redistribute it and/or
9 // modify it under the terms of the GNU Library General Public License
10 // as published by the Free Software Foundation; either version 2, or
11 // (at your option) any later version.
13 // In addition to the permissions in the GNU Library General Public
14 // License, the Free Software Foundation gives you unlimited
15 // permission to link the compiled version of this file into
16 // combinations with other programs, and to distribute those
17 // combinations without any restriction coming from the use of this
18 // file. (The Library Public License restrictions do apply in other
19 // respects; for example, they cover modification of the file, and
20 /// distribution when not linked into a combined executable.)
22 // This program is distributed in the hope that it will be useful, but
23 // WITHOUT ANY WARRANTY; without even the implied warranty of
24 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
25 // Library General Public License for more details.
27 // You should have received a copy of the GNU Library General Public
28 // License along with this program; if not, write to the Free Software
29 // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
32 #ifndef ELFCPP_SPARC_H
33 #define ELFCPP_SPARC_H
35 // Documentation for the TLS relocs is taken from
36 // http://people.redhat.com/drepper/tls.pdf
38 // More full documentation on sparc specific ELF file
39 // format details can be found at
41 // http://docs.sun.com/app/docs/doc/819/0690/
42 // "Linker and Libraries Guide"
44 // specifically Chapter 7 "Object File Format" and
45 // Chapter 8 "Thread-Local Storage"
52 R_SPARC_NONE
= 0, // No reloc
53 R_SPARC_8
= 1, // Direct 8 bit
54 R_SPARC_16
= 2, // Direct 16 bit
55 R_SPARC_32
= 3, // Direct 32 bit
56 R_SPARC_DISP8
= 4, // PC relative 8 bit
57 R_SPARC_DISP16
= 5, // PC relative 16 bit
58 R_SPARC_DISP32
= 6, // PC relative 32 bit
59 R_SPARC_WDISP30
= 7, // PC relative 30 bit shifted
60 R_SPARC_WDISP22
= 8, // PC relative 22 bit shifted
61 R_SPARC_HI22
= 9, // High 22 bit
62 R_SPARC_22
= 10, // Direct 22 bit
63 R_SPARC_13
= 11, // Direct 13 bit
64 R_SPARC_LO10
= 12, // Truncated 10 bit
65 R_SPARC_GOT10
= 13, // Truncated 10 bit GOT entry
66 R_SPARC_GOT13
= 14, // 13 bit GOT entry
67 R_SPARC_GOT22
= 15, // 22 bit GOT entry shifted
68 R_SPARC_PC10
= 16, // PC relative 10 bit truncated
69 R_SPARC_PC22
= 17, // PC relative 22 bit shifted
70 R_SPARC_WPLT30
= 18, // 30 bit PC relative PLT address
71 R_SPARC_COPY
= 19, // Copy symbol at runtime
72 R_SPARC_GLOB_DAT
= 20, // Create GOT entry
73 R_SPARC_JMP_SLOT
= 21, // Create PLT entry
74 R_SPARC_RELATIVE
= 22, // Adjust by program base
75 R_SPARC_UA32
= 23, // Direct 32 bit unaligned
76 R_SPARC_PLT32
= 24, // Direct 32 bit ref to PLT entry
77 R_SPARC_HIPLT22
= 25, // High 22 bit PLT entry
78 R_SPARC_LOPLT10
= 26, // Truncated 10 bit PLT entry
79 R_SPARC_PCPLT32
= 27, // PC rel 32 bit ref to PLT entry
80 R_SPARC_PCPLT22
= 28, // PC rel high 22 bit PLT entry
81 R_SPARC_PCPLT10
= 29, // PC rel trunc 10 bit PLT entry
82 R_SPARC_10
= 30, // Direct 10 bit
83 R_SPARC_11
= 31, // Direct 11 bit
84 R_SPARC_64
= 32, // Direct 64 bit
85 R_SPARC_OLO10
= 33, // 10bit with secondary 13bit addend
86 R_SPARC_HH22
= 34, // Top 22 bits of direct 64 bit
87 R_SPARC_HM10
= 35, // High middle 10 bits of ...
88 R_SPARC_LM22
= 36, // Low middle 22 bits of ...
89 R_SPARC_PC_HH22
= 37, // Top 22 bits of pc rel 64 bit
90 R_SPARC_PC_HM10
= 38, // High middle 10 bit of ...
91 R_SPARC_PC_LM22
= 39, // Low miggle 22 bits of ...
92 R_SPARC_WDISP16
= 40, // PC relative 16 bit shifted
93 R_SPARC_WDISP19
= 41, // PC relative 19 bit shifted
94 R_SPARC_GLOB_JMP
= 42, // was part of v9 ABI but was removed
95 R_SPARC_7
= 43, // Direct 7 bit
96 R_SPARC_5
= 44, // Direct 5 bit
97 R_SPARC_6
= 45, // Direct 6 bit
98 R_SPARC_DISP64
= 46, // PC relative 64 bit
99 R_SPARC_PLT64
= 47, // Direct 64 bit ref to PLT entry
100 R_SPARC_HIX22
= 48, // High 22 bit complemented
101 R_SPARC_LOX10
= 49, // Truncated 11 bit complemented
102 R_SPARC_H44
= 50, // Direct high 12 of 44 bit
103 R_SPARC_M44
= 51, // Direct mid 22 of 44 bit
104 R_SPARC_L44
= 52, // Direct low 10 of 44 bit
105 R_SPARC_REGISTER
= 53, // Global register usage
106 R_SPARC_UA64
= 54, // Direct 64 bit unaligned
107 R_SPARC_UA16
= 55, // Direct 16 bit unaligned
108 R_SPARC_TLS_GD_HI22
= 56, // Initial General Dynamic reloc, high 22-bit
109 R_SPARC_TLS_GD_LO10
= 57, // Initial General Dynamic reloc, low 10-bit
110 R_SPARC_TLS_GD_ADD
= 58, // Initial General Dynamic reloc, add
111 R_SPARC_TLS_GD_CALL
= 59, // Initial General Dynamic reloc, call
112 R_SPARC_TLS_LDM_HI22
= 60, // Initial Local Dynamic reloc, high 22-bit
113 R_SPARC_TLS_LDM_LO10
= 61, // Initial Local Dynamic reloc, low 10-bit
114 R_SPARC_TLS_LDM_ADD
= 62, // Initial Local Dynamic reloc, add
115 R_SPARC_TLS_LDM_CALL
= 63, // Initial Local Dynamic reloc, call
116 R_SPARC_TLS_LDO_HIX22
= 64, // Initial Local Dynamic, high extended 22-bit
117 R_SPARC_TLS_LDO_LOX10
= 65, // Initial Local Dynamic, low extended 10-bit
118 R_SPARC_TLS_LDO_ADD
= 66, // Initial Local Dynamic, add extended
119 R_SPARC_TLS_IE_HI22
= 67, // Initial Initial Exec reloc, high 22-bit
120 R_SPARC_TLS_IE_LO10
= 68, // Initial Initial Exec reloc, low 10-bit
121 R_SPARC_TLS_IE_LD
= 69, // Initial Initial Exec reloc, load 32-bit
122 R_SPARC_TLS_IE_LDX
= 70, // Initial Initial Exec reloc, load 64-bit
123 R_SPARC_TLS_IE_ADD
= 71, // Initial Initial Exec reloc, add
124 R_SPARC_TLS_LE_HIX22
= 72, // Initial Local Exec reloc, high extended 22-bit
125 R_SPARC_TLS_LE_LOX10
= 73, // Initial Local Exec reloc, low extended 10-bit
126 R_SPARC_TLS_DTPMOD32
= 74, // Outstanding General/Local Dynamic reloc, 32-bit
127 R_SPARC_TLS_DTPMOD64
= 75, // Outstanding General/Local Dynamic reloc, 64-bit
128 R_SPARC_TLS_DTPOFF32
= 76, // Outstanding General Dynamic reloc, 32-bit
129 R_SPARC_TLS_DTPOFF64
= 77, // Outstanding General Dynamic reloc, 64-bit
130 R_SPARC_TLS_TPOFF32
= 78, // Outstanding Initial Exec reloc, 32-bit
131 R_SPARC_TLS_TPOFF64
= 79, // Outstanding Initial Exec reloc, 64-bit
133 // GOT data code transformations
134 R_SPARC_GOTDATA_HIX22
= 80,
135 R_SPARC_GOTDATA_LOX10
= 81,
136 R_SPARC_GOTDATA_OP_HIX22
= 82,
137 R_SPARC_GOTDATA_OP_LOX10
= 83,
138 R_SPARC_GOTDATA_OP
= 84,
140 R_SPARC_H34
= 85, // Direct high 12 of 34 bit
141 R_SPARC_SIZE32
= 86, // size of symbol, 32-bit
142 R_SPARC_SIZE64
= 87, // size of symbol, 64-bit
143 R_SPARC_WDISP10
= 88, // PC relative 10 bit shifted
145 R_SPARC_JMP_IREL
= 248, // Create PLT slot to IFUNC function
146 R_SPARC_IRELATIVE
= 249, // Adjust indirectly by program base
148 // GNU vtable garbage collection extensions.
149 R_SPARC_GNU_VTINHERIT
= 250,
150 R_SPARC_GNU_VTENTRY
= 251,
155 // e_flags values defined for sparc
158 EF_SPARC_EXT_MASK
= 0xffff00, // reserved for vendor extensions
159 EF_SPARC_32PLUS_MASK
= 0xffff00, // bits indicating V8+ type
160 EF_SPARC_32PLUS
= 0x000100, // generic V8+ features
161 EF_SPARC_SUN_US1
= 0x000200, // Sun UltraSPARC-I extensions
162 EF_SPARC_HAL_R1
= 0x000400, // HAL R1 extensions
163 EF_SPARC_SUN_US3
= 0x000800, // Sun UltraSPARC-III extensions
164 EF_SPARC_LEDATA
= 0x800000, // little endian data
165 EF_SPARCV9_MM
= 0x3, // memory model mask
166 EF_SPARCV9_TSO
= 0x0, // total store ordering
167 EF_SPARCV9_PSO
= 0x1, // partial store ordering
168 EF_SPARCV9_RMO
= 0x2, // relaxed store ordering
171 } // End namespace elfcpp.
173 #endif // !defined(ELFCPP_SPARC_H)