Commit | Line | Data |
---|---|---|
1df2fdb5 | 1 | /* PPC64 ELF support for BFD. |
b3adc24a | 2 | Copyright (C) 2003-2020 Free Software Foundation, Inc. |
1df2fdb5 | 3 | |
e4e42b45 | 4 | This file is part of BFD, the Binary File Descriptor library. |
1df2fdb5 | 5 | |
e4e42b45 NC |
6 | This program is free software; you can redistribute it and/or modify |
7 | it under the terms of the GNU General Public License as published by | |
8 | the Free Software Foundation; either version 3 of the License, or | |
9 | (at your option) any later version. | |
1df2fdb5 | 10 | |
e4e42b45 NC |
11 | This program is distributed in the hope that it will be useful, |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
1df2fdb5 | 15 | |
e4e42b45 NC |
16 | You should have received a copy of the GNU General Public License |
17 | along with this program; if not, write to the Free Software | |
18 | Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | |
19 | MA 02110-1301, USA. */ | |
1df2fdb5 AM |
20 | |
21 | #ifndef _ELF_PPC64_H | |
22 | #define _ELF_PPC64_H | |
23 | ||
24 | #include "elf/reloc-macros.h" | |
25 | ||
26 | /* Relocations. */ | |
27 | START_RELOC_NUMBERS (elf_ppc64_reloc_type) | |
5255ffd3 AM |
28 | RELOC_NUMBER (R_PPC64_NONE, 0) |
29 | RELOC_NUMBER (R_PPC64_ADDR32, 1) | |
30 | RELOC_NUMBER (R_PPC64_ADDR24, 2) | |
31 | RELOC_NUMBER (R_PPC64_ADDR16, 3) | |
32 | RELOC_NUMBER (R_PPC64_ADDR16_LO, 4) | |
33 | RELOC_NUMBER (R_PPC64_ADDR16_HI, 5) | |
34 | RELOC_NUMBER (R_PPC64_ADDR16_HA, 6) | |
35 | RELOC_NUMBER (R_PPC64_ADDR14, 7) | |
36 | RELOC_NUMBER (R_PPC64_ADDR14_BRTAKEN, 8) | |
37 | RELOC_NUMBER (R_PPC64_ADDR14_BRNTAKEN, 9) | |
38 | RELOC_NUMBER (R_PPC64_REL24, 10) | |
39 | RELOC_NUMBER (R_PPC64_REL14, 11) | |
40 | RELOC_NUMBER (R_PPC64_REL14_BRTAKEN, 12) | |
41 | RELOC_NUMBER (R_PPC64_REL14_BRNTAKEN, 13) | |
42 | RELOC_NUMBER (R_PPC64_GOT16, 14) | |
43 | RELOC_NUMBER (R_PPC64_GOT16_LO, 15) | |
44 | RELOC_NUMBER (R_PPC64_GOT16_HI, 16) | |
45 | RELOC_NUMBER (R_PPC64_GOT16_HA, 17) | |
1df2fdb5 | 46 | /* 18 unused. 32-bit reloc is R_PPC_PLTREL24. */ |
5255ffd3 AM |
47 | RELOC_NUMBER (R_PPC64_COPY, 19) |
48 | RELOC_NUMBER (R_PPC64_GLOB_DAT, 20) | |
49 | RELOC_NUMBER (R_PPC64_JMP_SLOT, 21) | |
50 | RELOC_NUMBER (R_PPC64_RELATIVE, 22) | |
1df2fdb5 | 51 | /* 23 unused. 32-bit reloc is R_PPC_LOCAL24PC. */ |
5255ffd3 AM |
52 | RELOC_NUMBER (R_PPC64_UADDR32, 24) |
53 | RELOC_NUMBER (R_PPC64_UADDR16, 25) | |
54 | RELOC_NUMBER (R_PPC64_REL32, 26) | |
55 | RELOC_NUMBER (R_PPC64_PLT32, 27) | |
56 | RELOC_NUMBER (R_PPC64_PLTREL32, 28) | |
57 | RELOC_NUMBER (R_PPC64_PLT16_LO, 29) | |
58 | RELOC_NUMBER (R_PPC64_PLT16_HI, 30) | |
59 | RELOC_NUMBER (R_PPC64_PLT16_HA, 31) | |
1df2fdb5 | 60 | /* 32 unused. 32-bit reloc is R_PPC_SDAREL16. */ |
5255ffd3 AM |
61 | RELOC_NUMBER (R_PPC64_SECTOFF, 33) |
62 | RELOC_NUMBER (R_PPC64_SECTOFF_LO, 34) | |
63 | RELOC_NUMBER (R_PPC64_SECTOFF_HI, 35) | |
64 | RELOC_NUMBER (R_PPC64_SECTOFF_HA, 36) | |
65 | RELOC_NUMBER (R_PPC64_REL30, 37) | |
66 | RELOC_NUMBER (R_PPC64_ADDR64, 38) | |
67 | RELOC_NUMBER (R_PPC64_ADDR16_HIGHER, 39) | |
68 | RELOC_NUMBER (R_PPC64_ADDR16_HIGHERA, 40) | |
69 | RELOC_NUMBER (R_PPC64_ADDR16_HIGHEST, 41) | |
70 | RELOC_NUMBER (R_PPC64_ADDR16_HIGHESTA, 42) | |
71 | RELOC_NUMBER (R_PPC64_UADDR64, 43) | |
72 | RELOC_NUMBER (R_PPC64_REL64, 44) | |
73 | RELOC_NUMBER (R_PPC64_PLT64, 45) | |
74 | RELOC_NUMBER (R_PPC64_PLTREL64, 46) | |
75 | RELOC_NUMBER (R_PPC64_TOC16, 47) | |
76 | RELOC_NUMBER (R_PPC64_TOC16_LO, 48) | |
77 | RELOC_NUMBER (R_PPC64_TOC16_HI, 49) | |
78 | RELOC_NUMBER (R_PPC64_TOC16_HA, 50) | |
79 | RELOC_NUMBER (R_PPC64_TOC, 51) | |
80 | RELOC_NUMBER (R_PPC64_PLTGOT16, 52) | |
81 | RELOC_NUMBER (R_PPC64_PLTGOT16_LO, 53) | |
82 | RELOC_NUMBER (R_PPC64_PLTGOT16_HI, 54) | |
83 | RELOC_NUMBER (R_PPC64_PLTGOT16_HA, 55) | |
1df2fdb5 | 84 | |
5255ffd3 AM |
85 | /* The following relocs were added in the 64-bit PowerPC ELF ABI |
86 | revision 1.2. */ | |
87 | RELOC_NUMBER (R_PPC64_ADDR16_DS, 56) | |
88 | RELOC_NUMBER (R_PPC64_ADDR16_LO_DS, 57) | |
89 | RELOC_NUMBER (R_PPC64_GOT16_DS, 58) | |
90 | RELOC_NUMBER (R_PPC64_GOT16_LO_DS, 59) | |
91 | RELOC_NUMBER (R_PPC64_PLT16_LO_DS, 60) | |
92 | RELOC_NUMBER (R_PPC64_SECTOFF_DS, 61) | |
93 | RELOC_NUMBER (R_PPC64_SECTOFF_LO_DS, 62) | |
94 | RELOC_NUMBER (R_PPC64_TOC16_DS, 63) | |
95 | RELOC_NUMBER (R_PPC64_TOC16_LO_DS, 64) | |
96 | RELOC_NUMBER (R_PPC64_PLTGOT16_DS, 65) | |
97 | RELOC_NUMBER (R_PPC64_PLTGOT16_LO_DS, 66) | |
98 | ||
99 | /* Relocs added to support TLS. PowerPC64 ELF ABI revision 1.5. */ | |
100 | RELOC_NUMBER (R_PPC64_TLS, 67) | |
101 | RELOC_NUMBER (R_PPC64_DTPMOD64, 68) | |
102 | RELOC_NUMBER (R_PPC64_TPREL16, 69) | |
103 | RELOC_NUMBER (R_PPC64_TPREL16_LO, 70) | |
104 | RELOC_NUMBER (R_PPC64_TPREL16_HI, 71) | |
105 | RELOC_NUMBER (R_PPC64_TPREL16_HA, 72) | |
106 | RELOC_NUMBER (R_PPC64_TPREL64, 73) | |
107 | RELOC_NUMBER (R_PPC64_DTPREL16, 74) | |
108 | RELOC_NUMBER (R_PPC64_DTPREL16_LO, 75) | |
109 | RELOC_NUMBER (R_PPC64_DTPREL16_HI, 76) | |
110 | RELOC_NUMBER (R_PPC64_DTPREL16_HA, 77) | |
111 | RELOC_NUMBER (R_PPC64_DTPREL64, 78) | |
112 | RELOC_NUMBER (R_PPC64_GOT_TLSGD16, 79) | |
113 | RELOC_NUMBER (R_PPC64_GOT_TLSGD16_LO, 80) | |
114 | RELOC_NUMBER (R_PPC64_GOT_TLSGD16_HI, 81) | |
115 | RELOC_NUMBER (R_PPC64_GOT_TLSGD16_HA, 82) | |
116 | RELOC_NUMBER (R_PPC64_GOT_TLSLD16, 83) | |
117 | RELOC_NUMBER (R_PPC64_GOT_TLSLD16_LO, 84) | |
118 | RELOC_NUMBER (R_PPC64_GOT_TLSLD16_HI, 85) | |
119 | RELOC_NUMBER (R_PPC64_GOT_TLSLD16_HA, 86) | |
120 | RELOC_NUMBER (R_PPC64_GOT_TPREL16_DS, 87) | |
121 | RELOC_NUMBER (R_PPC64_GOT_TPREL16_LO_DS, 88) | |
122 | RELOC_NUMBER (R_PPC64_GOT_TPREL16_HI, 89) | |
123 | RELOC_NUMBER (R_PPC64_GOT_TPREL16_HA, 90) | |
124 | RELOC_NUMBER (R_PPC64_GOT_DTPREL16_DS, 91) | |
125 | RELOC_NUMBER (R_PPC64_GOT_DTPREL16_LO_DS, 92) | |
126 | RELOC_NUMBER (R_PPC64_GOT_DTPREL16_HI, 93) | |
127 | RELOC_NUMBER (R_PPC64_GOT_DTPREL16_HA, 94) | |
128 | RELOC_NUMBER (R_PPC64_TPREL16_DS, 95) | |
129 | RELOC_NUMBER (R_PPC64_TPREL16_LO_DS, 96) | |
130 | RELOC_NUMBER (R_PPC64_TPREL16_HIGHER, 97) | |
131 | RELOC_NUMBER (R_PPC64_TPREL16_HIGHERA, 98) | |
132 | RELOC_NUMBER (R_PPC64_TPREL16_HIGHEST, 99) | |
133 | RELOC_NUMBER (R_PPC64_TPREL16_HIGHESTA, 100) | |
134 | RELOC_NUMBER (R_PPC64_DTPREL16_DS, 101) | |
135 | RELOC_NUMBER (R_PPC64_DTPREL16_LO_DS, 102) | |
136 | RELOC_NUMBER (R_PPC64_DTPREL16_HIGHER, 103) | |
137 | RELOC_NUMBER (R_PPC64_DTPREL16_HIGHERA, 104) | |
138 | RELOC_NUMBER (R_PPC64_DTPREL16_HIGHEST, 105) | |
139 | RELOC_NUMBER (R_PPC64_DTPREL16_HIGHESTA, 106) | |
727fc41e AM |
140 | RELOC_NUMBER (R_PPC64_TLSGD, 107) |
141 | RELOC_NUMBER (R_PPC64_TLSLD, 108) | |
3b421ab3 | 142 | RELOC_NUMBER (R_PPC64_TOCSAVE, 109) |
1df2fdb5 | 143 | |
f9c6b907 AM |
144 | /* Added when HA and HI relocs were changed to report overflows. */ |
145 | RELOC_NUMBER (R_PPC64_ADDR16_HIGH, 110) | |
146 | RELOC_NUMBER (R_PPC64_ADDR16_HIGHA, 111) | |
147 | RELOC_NUMBER (R_PPC64_TPREL16_HIGH, 112) | |
148 | RELOC_NUMBER (R_PPC64_TPREL16_HIGHA, 113) | |
149 | RELOC_NUMBER (R_PPC64_DTPREL16_HIGH, 114) | |
150 | RELOC_NUMBER (R_PPC64_DTPREL16_HIGHA, 115) | |
151 | ||
45965137 AM |
152 | /* Added for ELFv2. */ |
153 | RELOC_NUMBER (R_PPC64_REL24_NOTOC, 116) | |
154 | RELOC_NUMBER (R_PPC64_ADDR64_LOCAL, 117) | |
006589cf | 155 | RELOC_NUMBER (R_PPC64_ENTRY, 118) |
45965137 | 156 | |
23cedd1d AM |
157 | /* Marker reloc for inline plt call insns. */ |
158 | RELOC_NUMBER (R_PPC64_PLTSEQ, 119) | |
159 | RELOC_NUMBER (R_PPC64_PLTCALL, 120) | |
160 | ||
5663e321 AM |
161 | /* Powerxx support. */ |
162 | RELOC_NUMBER (R_PPC64_PLTSEQ_NOTOC, 121) | |
163 | RELOC_NUMBER (R_PPC64_PLTCALL_NOTOC, 122) | |
164 | RELOC_NUMBER (R_PPC64_PCREL_OPT, 123) | |
165 | ||
166 | RELOC_NUMBER (R_PPC64_D34, 128) | |
167 | RELOC_NUMBER (R_PPC64_D34_LO, 129) | |
168 | RELOC_NUMBER (R_PPC64_D34_HI30, 130) | |
169 | RELOC_NUMBER (R_PPC64_D34_HA30, 131) | |
170 | RELOC_NUMBER (R_PPC64_PCREL34, 132) | |
171 | RELOC_NUMBER (R_PPC64_GOT_PCREL34, 133) | |
172 | RELOC_NUMBER (R_PPC64_PLT_PCREL34, 134) | |
173 | RELOC_NUMBER (R_PPC64_PLT_PCREL34_NOTOC, 135) | |
174 | RELOC_NUMBER (R_PPC64_ADDR16_HIGHER34, 136) | |
175 | RELOC_NUMBER (R_PPC64_ADDR16_HIGHERA34, 137) | |
176 | RELOC_NUMBER (R_PPC64_ADDR16_HIGHEST34, 138) | |
177 | RELOC_NUMBER (R_PPC64_ADDR16_HIGHESTA34, 139) | |
178 | RELOC_NUMBER (R_PPC64_REL16_HIGHER34, 140) | |
179 | RELOC_NUMBER (R_PPC64_REL16_HIGHERA34, 141) | |
180 | RELOC_NUMBER (R_PPC64_REL16_HIGHEST34, 142) | |
181 | RELOC_NUMBER (R_PPC64_REL16_HIGHESTA34, 143) | |
182 | RELOC_NUMBER (R_PPC64_D28, 144) | |
183 | RELOC_NUMBER (R_PPC64_PCREL28, 145) | |
c213164a AM |
184 | RELOC_NUMBER (R_PPC64_TPREL34, 146) |
185 | RELOC_NUMBER (R_PPC64_DTPREL34, 147) | |
186 | RELOC_NUMBER (R_PPC64_GOT_TLSGD34, 148) | |
187 | RELOC_NUMBER (R_PPC64_GOT_TLSLD34, 149) | |
188 | RELOC_NUMBER (R_PPC64_GOT_TPREL34, 150) | |
189 | RELOC_NUMBER (R_PPC64_GOT_DTPREL34, 151) | |
5663e321 | 190 | |
ba761f19 | 191 | #ifndef RELOC_MACROS_GEN_FUNC |
4a969973 AM |
192 | /* Relocation only used internally by gas or ld. If you need to use |
193 | these reloc numbers, you can change them to some other unused value | |
7ba71655 | 194 | without affecting the ABI. They will never appear in object files. */ |
4a969973 AM |
195 | RELOC_NUMBER (R_PPC64_LO_DS_OPT, 200) |
196 | RELOC_NUMBER (R_PPC64_16DX_HA, 201) | |
ba761f19 | 197 | #endif |
a680de9a | 198 | |
4a969973 AM |
199 | RELOC_NUMBER (R_PPC64_REL16_HIGH, 240) |
200 | RELOC_NUMBER (R_PPC64_REL16_HIGHA, 241) | |
201 | RELOC_NUMBER (R_PPC64_REL16_HIGHER, 242) | |
202 | RELOC_NUMBER (R_PPC64_REL16_HIGHERA, 243) | |
203 | RELOC_NUMBER (R_PPC64_REL16_HIGHEST, 244) | |
204 | RELOC_NUMBER (R_PPC64_REL16_HIGHESTA, 245) | |
205 | ||
a680de9a PB |
206 | /* Power9 split rel16 for addpcis. */ |
207 | RELOC_NUMBER (R_PPC64_REL16DX_HA, 246) | |
208 | ||
e054468f | 209 | /* Support STT_GNU_IFUNC plt calls. */ |
28ec585f | 210 | RELOC_NUMBER (R_PPC64_JMP_IREL, 247) |
e054468f AM |
211 | RELOC_NUMBER (R_PPC64_IRELATIVE, 248) |
212 | ||
28ec585f AM |
213 | /* These are GNU extensions used in PIC code sequences. */ |
214 | RELOC_NUMBER (R_PPC64_REL16, 249) | |
215 | RELOC_NUMBER (R_PPC64_REL16_LO, 250) | |
216 | RELOC_NUMBER (R_PPC64_REL16_HI, 251) | |
217 | RELOC_NUMBER (R_PPC64_REL16_HA, 252) | |
218 | ||
1df2fdb5 | 219 | /* These are GNU extensions to enable C++ vtable garbage collection. */ |
5255ffd3 AM |
220 | RELOC_NUMBER (R_PPC64_GNU_VTINHERIT, 253) |
221 | RELOC_NUMBER (R_PPC64_GNU_VTENTRY, 254) | |
1df2fdb5 AM |
222 | |
223 | END_RELOC_NUMBERS (R_PPC64_max) | |
224 | ||
f9c6b907 AM |
225 | #define IS_PPC64_TLS_RELOC(R) \ |
226 | (((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA) \ | |
c213164a AM |
227 | || ((R) >= R_PPC64_TPREL16_HIGH && (R) <= R_PPC64_DTPREL16_HIGHA) \ |
228 | || ((R) >= R_PPC64_TPREL34 && (R) <= R_PPC64_GOT_DTPREL34)) | |
ee67d69a AM |
229 | |
230 | /* e_flags bits specifying ABI. | |
231 | 1 for original function descriptor using ABI, | |
232 | 2 for revised ABI without function descriptors, | |
233 | 0 for unspecified or not using any features affected by the differences. */ | |
234 | #define EF_PPC64_ABI 3 | |
235 | ||
6911b7dc | 236 | /* The ELFv2 ABI uses three bits in the symbol st_other field of a |
33cb30a1 | 237 | function definition to specify the number of bytes between a |
6911b7dc | 238 | function's global entry point and local entry point. |
33cb30a1 AM |
239 | Values of two to six specify powers of two from four to sixty four |
240 | bytes. For such functions: | |
6911b7dc AM |
241 | The global entry point is used when it is necessary to set up the |
242 | toc pointer (r2) for the function. Callers must enter the global | |
243 | entry point with r12 set to the global entry point address. On | |
33cb30a1 AM |
244 | return from the function r2 will contain the toc pointer for the |
245 | function. | |
6911b7dc AM |
246 | The local entry point is used when r2 is known to already be valid |
247 | for the function. There is no requirement on r12 when using the | |
248 | local entry point, and on return r2 will contain the same value as | |
249 | at entry. | |
250 | A value of zero in these bits means that the function has a single | |
251 | entry point with no requirement on r12 or r2, and that on return r2 | |
252 | will contain the same value as at entry. | |
33cb30a1 AM |
253 | A value of one means that the function has a single entry point |
254 | with no requirement on r12 or r2, and that r2 is *not* preserved. | |
255 | A value of seven is reserved. */ | |
6911b7dc AM |
256 | #define STO_PPC64_LOCAL_BIT 5 |
257 | #define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT) | |
258 | ||
259 | // 3 bit other field to bytes. | |
260 | static inline unsigned int | |
261 | ppc64_decode_local_entry(unsigned int other) | |
262 | { | |
263 | return ((1 << other) >> 2) << 2; | |
264 | } | |
265 | ||
266 | // bytes to field value. | |
267 | static inline unsigned int | |
268 | ppc64_encode_local_entry(unsigned int val) | |
269 | { | |
270 | return (val >= 4 * 4 | |
271 | ? (val >= 8 * 4 | |
272 | ? (val >= 16 * 4 ? 6 : 5) | |
273 | : 4) | |
274 | : (val >= 2 * 4 | |
275 | ? 3 | |
276 | : (val >= 1 * 4 ? 2 : 0))); | |
277 | } | |
278 | ||
279 | /* st_other to number of bytes. */ | |
280 | #define PPC64_LOCAL_ENTRY_OFFSET(other) \ | |
281 | ppc64_decode_local_entry (((other) & STO_PPC64_LOCAL_MASK) \ | |
282 | >> STO_PPC64_LOCAL_BIT) | |
283 | /* number of bytes to st_other. */ | |
284 | #define PPC64_SET_LOCAL_ENTRY_OFFSET(val) \ | |
285 | ppc64_encode_local_entry (val) << STO_PPC64_LOCAL_BIT | |
286 | ||
1df2fdb5 AM |
287 | /* Specify the start of the .glink section. */ |
288 | #define DT_PPC64_GLINK DT_LOPROC | |
289 | ||
290 | /* Specify the start and size of the .opd section. */ | |
291 | #define DT_PPC64_OPD (DT_LOPROC + 1) | |
292 | #define DT_PPC64_OPDSZ (DT_LOPROC + 2) | |
293 | ||
e8910a83 AM |
294 | /* Specify whether various optimisations are possible. */ |
295 | #define DT_PPC64_OPT (DT_LOPROC + 3) | |
296 | #define PPC64_OPT_TLS 1 | |
297 | #define PPC64_OPT_MULTI_TOC 2 | |
f378ab09 | 298 | #define PPC64_OPT_LOCALENTRY 4 |
a7f2871e | 299 | |
1df2fdb5 | 300 | #endif /* _ELF_PPC64_H */ |