Commit | Line | Data |
---|---|---|
1df2fdb5 | 1 | /* PPC64 ELF support for BFD. |
6f2750fe | 2 | Copyright (C) 2003-2016 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 | |
ba761f19 AM |
157 | #ifndef RELOC_MACROS_GEN_FUNC |
158 | /* Fake relocation only used internally by ld. */ | |
159 | RELOC_NUMBER (R_PPC64_LO_DS_OPT, 128) | |
160 | #endif | |
a680de9a PB |
161 | |
162 | /* Power9 split rel16 for addpcis. */ | |
163 | RELOC_NUMBER (R_PPC64_REL16DX_HA, 246) | |
164 | ||
e054468f | 165 | /* Support STT_GNU_IFUNC plt calls. */ |
28ec585f | 166 | RELOC_NUMBER (R_PPC64_JMP_IREL, 247) |
e054468f AM |
167 | RELOC_NUMBER (R_PPC64_IRELATIVE, 248) |
168 | ||
28ec585f AM |
169 | /* These are GNU extensions used in PIC code sequences. */ |
170 | RELOC_NUMBER (R_PPC64_REL16, 249) | |
171 | RELOC_NUMBER (R_PPC64_REL16_LO, 250) | |
172 | RELOC_NUMBER (R_PPC64_REL16_HI, 251) | |
173 | RELOC_NUMBER (R_PPC64_REL16_HA, 252) | |
174 | ||
1df2fdb5 | 175 | /* These are GNU extensions to enable C++ vtable garbage collection. */ |
5255ffd3 AM |
176 | RELOC_NUMBER (R_PPC64_GNU_VTINHERIT, 253) |
177 | RELOC_NUMBER (R_PPC64_GNU_VTENTRY, 254) | |
1df2fdb5 AM |
178 | |
179 | END_RELOC_NUMBERS (R_PPC64_max) | |
180 | ||
f9c6b907 AM |
181 | #define IS_PPC64_TLS_RELOC(R) \ |
182 | (((R) >= R_PPC64_TLS && (R) <= R_PPC64_DTPREL16_HIGHESTA) \ | |
183 | || ((R) >= R_PPC64_TPREL16_HIGH && (R) <= R_PPC64_DTPREL16_HIGHA)) | |
5255ffd3 | 184 | |
ee67d69a AM |
185 | |
186 | /* e_flags bits specifying ABI. | |
187 | 1 for original function descriptor using ABI, | |
188 | 2 for revised ABI without function descriptors, | |
189 | 0 for unspecified or not using any features affected by the differences. */ | |
190 | #define EF_PPC64_ABI 3 | |
191 | ||
6911b7dc AM |
192 | /* The ELFv2 ABI uses three bits in the symbol st_other field of a |
193 | function definition to specify the number of instructions between a | |
194 | function's global entry point and local entry point. | |
195 | The global entry point is used when it is necessary to set up the | |
196 | toc pointer (r2) for the function. Callers must enter the global | |
197 | entry point with r12 set to the global entry point address. On | |
198 | return from the function, r2 may have a different value to that | |
199 | which it had on entry. | |
200 | The local entry point is used when r2 is known to already be valid | |
201 | for the function. There is no requirement on r12 when using the | |
202 | local entry point, and on return r2 will contain the same value as | |
203 | at entry. | |
204 | A value of zero in these bits means that the function has a single | |
205 | entry point with no requirement on r12 or r2, and that on return r2 | |
206 | will contain the same value as at entry. | |
207 | Values of one and seven are reserved. */ | |
208 | #define STO_PPC64_LOCAL_BIT 5 | |
209 | #define STO_PPC64_LOCAL_MASK (7 << STO_PPC64_LOCAL_BIT) | |
210 | ||
211 | // 3 bit other field to bytes. | |
212 | static inline unsigned int | |
213 | ppc64_decode_local_entry(unsigned int other) | |
214 | { | |
215 | return ((1 << other) >> 2) << 2; | |
216 | } | |
217 | ||
218 | // bytes to field value. | |
219 | static inline unsigned int | |
220 | ppc64_encode_local_entry(unsigned int val) | |
221 | { | |
222 | return (val >= 4 * 4 | |
223 | ? (val >= 8 * 4 | |
224 | ? (val >= 16 * 4 ? 6 : 5) | |
225 | : 4) | |
226 | : (val >= 2 * 4 | |
227 | ? 3 | |
228 | : (val >= 1 * 4 ? 2 : 0))); | |
229 | } | |
230 | ||
231 | /* st_other to number of bytes. */ | |
232 | #define PPC64_LOCAL_ENTRY_OFFSET(other) \ | |
233 | ppc64_decode_local_entry (((other) & STO_PPC64_LOCAL_MASK) \ | |
234 | >> STO_PPC64_LOCAL_BIT) | |
235 | /* number of bytes to st_other. */ | |
236 | #define PPC64_SET_LOCAL_ENTRY_OFFSET(val) \ | |
237 | ppc64_encode_local_entry (val) << STO_PPC64_LOCAL_BIT | |
238 | ||
1df2fdb5 AM |
239 | /* Specify the start of the .glink section. */ |
240 | #define DT_PPC64_GLINK DT_LOPROC | |
241 | ||
242 | /* Specify the start and size of the .opd section. */ | |
243 | #define DT_PPC64_OPD (DT_LOPROC + 1) | |
244 | #define DT_PPC64_OPDSZ (DT_LOPROC + 2) | |
245 | ||
e8910a83 AM |
246 | /* Specify whether various optimisations are possible. */ |
247 | #define DT_PPC64_OPT (DT_LOPROC + 3) | |
248 | #define PPC64_OPT_TLS 1 | |
249 | #define PPC64_OPT_MULTI_TOC 2 | |
a7f2871e | 250 | |
1df2fdb5 | 251 | #endif /* _ELF_PPC64_H */ |