Rev 5191 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5191 | serge | 1 | /* PPC64 ELF support for BFD. |
6324 | serge | 2 | Copyright (C) 2003-2015 Free Software Foundation, Inc. |
5191 | serge | 3 | |
4 | This file is part of BFD, the Binary File Descriptor library. |
||
5 | |||
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. |
||
10 | |||
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. |
||
15 | |||
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. */ |
||
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) |
||
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) |
||
46 | /* 18 unused. 32-bit reloc is R_PPC_PLTREL24. */ |
||
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) |
||
51 | /* 23 unused. 32-bit reloc is R_PPC_LOCAL24PC. */ |
||
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) |
||
60 | /* 32 unused. 32-bit reloc is R_PPC_SDAREL16. */ |
||
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) |
||
84 | |||
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) |
||
140 | RELOC_NUMBER (R_PPC64_TLSGD, 107) |
||
141 | RELOC_NUMBER (R_PPC64_TLSLD, 108) |
||
142 | RELOC_NUMBER (R_PPC64_TOCSAVE, 109) |
||
143 | |||
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 | |||
6324 | serge | 152 | /* Added for ELFv2. */ |
153 | RELOC_NUMBER (R_PPC64_REL24_NOTOC, 116) |
||
154 | RELOC_NUMBER (R_PPC64_ADDR64_LOCAL, 117) |
||
155 | RELOC_NUMBER (R_PPC64_ENTRY, 118) |
||
156 | |||
5191 | serge | 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 |
||
6324 | serge | 161 | |
162 | /* Power9 split rel16 for addpcis. */ |
||
163 | RELOC_NUMBER (R_PPC64_REL16DX_HA, 246) |
||
164 | |||
5191 | serge | 165 | /* Support STT_GNU_IFUNC plt calls. */ |
166 | RELOC_NUMBER (R_PPC64_JMP_IREL, 247) |
||
167 | RELOC_NUMBER (R_PPC64_IRELATIVE, 248) |
||
168 | |||
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 | |||
175 | /* These are GNU extensions to enable C++ vtable garbage collection. */ |
||
176 | RELOC_NUMBER (R_PPC64_GNU_VTINHERIT, 253) |
||
177 | RELOC_NUMBER (R_PPC64_GNU_VTENTRY, 254) |
||
178 | |||
179 | END_RELOC_NUMBERS (R_PPC64_max) |
||
180 | |||
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)) |
||
184 | |||
185 | |||
186 | /* e_flags bits specifying ABI. |
||
187 | 1 for original function descriptor using ABI, |
||
188 | 2 for revised ABI without function descriptors, |
||
189 | |||
190 | #define EF_PPC64_ABI 3 |
||
191 | |||
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 | |||
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 | |||
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 |
||
250 | |||
251 | #endif /* _ELF_PPC64_H */><>><>><>><>=>=> |