elf64-mips.c revision 1.4 1 1.1 skrll /* MIPS-specific support for 64-bit ELF
2 1.1 skrll Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3 1.3 christos 2006, 2007, 2008, 2009, 2010
4 1.3 christos Free Software Foundation, Inc.
5 1.1 skrll Ian Lance Taylor, Cygnus Support
6 1.1 skrll Linker support added by Mark Mitchell, CodeSourcery, LLC.
7 1.1 skrll <mark (at) codesourcery.com>
8 1.1 skrll
9 1.1 skrll This file is part of BFD, the Binary File Descriptor library.
10 1.1 skrll
11 1.1 skrll This program is free software; you can redistribute it and/or modify
12 1.1 skrll it under the terms of the GNU General Public License as published by
13 1.1 skrll the Free Software Foundation; either version 3 of the License, or
14 1.1 skrll (at your option) any later version.
15 1.1 skrll
16 1.1 skrll This program is distributed in the hope that it will be useful,
17 1.1 skrll but WITHOUT ANY WARRANTY; without even the implied warranty of
18 1.1 skrll MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 1.1 skrll GNU General Public License for more details.
20 1.1 skrll
21 1.1 skrll You should have received a copy of the GNU General Public License
22 1.1 skrll along with this program; if not, write to the Free Software
23 1.1 skrll Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
24 1.1 skrll MA 02110-1301, USA. */
25 1.1 skrll
26 1.1 skrll
27 1.1 skrll /* This file supports the 64-bit MIPS ELF ABI.
28 1.1 skrll
29 1.1 skrll The MIPS 64-bit ELF ABI uses an unusual reloc format. This file
30 1.1 skrll overrides the usual ELF reloc handling, and handles reading and
31 1.1 skrll writing the relocations here. */
32 1.1 skrll
33 1.1 skrll /* TODO: Many things are unsupported, even if there is some code for it
34 1.1 skrll . (which was mostly stolen from elf32-mips.c and slightly adapted).
35 1.1 skrll .
36 1.1 skrll . - Relocation handling for REL relocs is wrong in many cases and
37 1.1 skrll . generally untested.
38 1.1 skrll . - Relocation handling for RELA relocs related to GOT support are
39 1.1 skrll . also likely to be wrong.
40 1.1 skrll . - Support for MIPS16 is untested.
41 1.1 skrll . - Combined relocs with RSS_* entries are unsupported.
42 1.1 skrll . - The whole GOT handling for NewABI is missing, some parts of
43 1.1 skrll . the OldABI version is still lying around and should be removed.
44 1.1 skrll */
45 1.1 skrll
46 1.1 skrll #include "sysdep.h"
47 1.1 skrll #include "bfd.h"
48 1.1 skrll #include "libbfd.h"
49 1.1 skrll #include "aout/ar.h"
50 1.1 skrll #include "bfdlink.h"
51 1.1 skrll #include "genlink.h"
52 1.1 skrll #include "elf-bfd.h"
53 1.1 skrll #include "elfxx-mips.h"
54 1.1 skrll #include "elf/mips.h"
55 1.1 skrll
56 1.1 skrll /* Get the ECOFF swapping routines. The 64-bit ABI is not supposed to
57 1.1 skrll use ECOFF. However, we support it anyhow for an easier changeover. */
58 1.1 skrll #include "coff/sym.h"
59 1.1 skrll #include "coff/symconst.h"
60 1.1 skrll #include "coff/internal.h"
61 1.1 skrll #include "coff/ecoff.h"
62 1.1 skrll /* The 64 bit versions of the mdebug data structures are in alpha.h. */
63 1.1 skrll #include "coff/alpha.h"
64 1.1 skrll #define ECOFF_SIGNED_64
65 1.1 skrll #include "ecoffswap.h"
66 1.1 skrll
67 1.1 skrll static void mips_elf64_swap_reloc_in
68 1.1 skrll (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
69 1.1 skrll static void mips_elf64_swap_reloca_in
70 1.1 skrll (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
71 1.1 skrll static void mips_elf64_swap_reloc_out
72 1.1 skrll (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
73 1.1 skrll static void mips_elf64_swap_reloca_out
74 1.1 skrll (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
75 1.1 skrll static void mips_elf64_be_swap_reloc_in
76 1.1 skrll (bfd *, const bfd_byte *, Elf_Internal_Rela *);
77 1.1 skrll static void mips_elf64_be_swap_reloc_out
78 1.1 skrll (bfd *, const Elf_Internal_Rela *, bfd_byte *);
79 1.1 skrll static void mips_elf64_be_swap_reloca_in
80 1.1 skrll (bfd *, const bfd_byte *, Elf_Internal_Rela *);
81 1.1 skrll static void mips_elf64_be_swap_reloca_out
82 1.1 skrll (bfd *, const Elf_Internal_Rela *, bfd_byte *);
83 1.1 skrll static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
84 1.1 skrll (bfd *, bfd_reloc_code_real_type);
85 1.1 skrll static reloc_howto_type *mips_elf64_rtype_to_howto
86 1.1 skrll (unsigned int, bfd_boolean);
87 1.1 skrll static void mips_elf64_info_to_howto_rel
88 1.1 skrll (bfd *, arelent *, Elf_Internal_Rela *);
89 1.1 skrll static void mips_elf64_info_to_howto_rela
90 1.1 skrll (bfd *, arelent *, Elf_Internal_Rela *);
91 1.1 skrll static long mips_elf64_get_reloc_upper_bound
92 1.1 skrll (bfd *, asection *);
93 1.1 skrll static long mips_elf64_canonicalize_reloc
94 1.1 skrll (bfd *, asection *, arelent **, asymbol **);
95 1.1 skrll static long mips_elf64_get_dynamic_reloc_upper_bound
96 1.1 skrll (bfd *);
97 1.1 skrll static long mips_elf64_canonicalize_dynamic_reloc
98 1.1 skrll (bfd *, arelent **, asymbol **);
99 1.1 skrll static bfd_boolean mips_elf64_slurp_one_reloc_table
100 1.1 skrll (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
101 1.1 skrll asymbol **, bfd_boolean);
102 1.1 skrll static bfd_boolean mips_elf64_slurp_reloc_table
103 1.1 skrll (bfd *, asection *, asymbol **, bfd_boolean);
104 1.1 skrll static void mips_elf64_write_relocs
105 1.1 skrll (bfd *, asection *, void *);
106 1.1 skrll static void mips_elf64_write_rel
107 1.1 skrll (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
108 1.1 skrll static void mips_elf64_write_rela
109 1.1 skrll (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
110 1.1 skrll static bfd_reloc_status_type mips_elf64_gprel16_reloc
111 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
112 1.1 skrll static bfd_reloc_status_type mips_elf64_literal_reloc
113 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
114 1.1 skrll static bfd_reloc_status_type mips_elf64_gprel32_reloc
115 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
116 1.1 skrll static bfd_reloc_status_type mips_elf64_shift6_reloc
117 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
118 1.1 skrll static bfd_reloc_status_type mips16_gprel_reloc
119 1.1 skrll (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
120 1.1 skrll static bfd_boolean mips_elf64_assign_gp
121 1.1 skrll (bfd *, bfd_vma *);
122 1.1 skrll static bfd_reloc_status_type mips_elf64_final_gp
123 1.1 skrll (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
124 1.1 skrll static bfd_boolean mips_elf64_object_p
125 1.1 skrll (bfd *);
126 1.2 skrll static bfd_boolean mips_elf64_is_local_label_name
127 1.2 skrll (bfd *, const char *);
128 1.1 skrll static irix_compat_t elf64_mips_irix_compat
129 1.1 skrll (bfd *);
130 1.1 skrll static bfd_boolean elf64_mips_grok_prstatus
131 1.1 skrll (bfd *, Elf_Internal_Note *);
132 1.1 skrll static bfd_boolean elf64_mips_grok_psinfo
133 1.1 skrll (bfd *, Elf_Internal_Note *);
134 1.1 skrll
135 1.1 skrll extern const bfd_target bfd_elf64_bigmips_vec;
136 1.1 skrll extern const bfd_target bfd_elf64_littlemips_vec;
137 1.1 skrll
138 1.1 skrll /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
139 1.1 skrll from smaller values. Start with zero, widen, *then* decrement. */
140 1.1 skrll #define MINUS_ONE (((bfd_vma)0) - 1)
141 1.1 skrll
142 1.1 skrll /* The number of local .got entries we reserve. */
143 1.1 skrll #define MIPS_RESERVED_GOTNO (2)
144 1.1 skrll
145 1.1 skrll /* The relocation table used for SHT_REL sections. */
147 1.1 skrll
148 1.1 skrll static reloc_howto_type mips_elf64_howto_table_rel[] =
149 1.1 skrll {
150 1.1 skrll /* No relocation. */
151 1.1 skrll HOWTO (R_MIPS_NONE, /* type */
152 1.1 skrll 0, /* rightshift */
153 1.1 skrll 0, /* size (0 = byte, 1 = short, 2 = long) */
154 1.1 skrll 0, /* bitsize */
155 1.1 skrll FALSE, /* pc_relative */
156 1.1 skrll 0, /* bitpos */
157 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
158 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
159 1.1 skrll "R_MIPS_NONE", /* name */
160 1.1 skrll FALSE, /* partial_inplace */
161 1.1 skrll 0, /* src_mask */
162 1.1 skrll 0, /* dst_mask */
163 1.1 skrll FALSE), /* pcrel_offset */
164 1.1 skrll
165 1.1 skrll /* 16 bit relocation. */
166 1.1 skrll HOWTO (R_MIPS_16, /* type */
167 1.1 skrll 0, /* rightshift */
168 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
169 1.1 skrll 16, /* bitsize */
170 1.1 skrll FALSE, /* pc_relative */
171 1.1 skrll 0, /* bitpos */
172 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
173 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
174 1.1 skrll "R_MIPS_16", /* name */
175 1.1 skrll TRUE, /* partial_inplace */
176 1.1 skrll 0x0000ffff, /* src_mask */
177 1.1 skrll 0x0000ffff, /* dst_mask */
178 1.1 skrll FALSE), /* pcrel_offset */
179 1.1 skrll
180 1.1 skrll /* 32 bit relocation. */
181 1.1 skrll HOWTO (R_MIPS_32, /* type */
182 1.1 skrll 0, /* rightshift */
183 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
184 1.1 skrll 32, /* bitsize */
185 1.1 skrll FALSE, /* pc_relative */
186 1.1 skrll 0, /* bitpos */
187 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
188 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
189 1.1 skrll "R_MIPS_32", /* name */
190 1.1 skrll TRUE, /* partial_inplace */
191 1.1 skrll 0xffffffff, /* src_mask */
192 1.1 skrll 0xffffffff, /* dst_mask */
193 1.1 skrll FALSE), /* pcrel_offset */
194 1.1 skrll
195 1.1 skrll /* 32 bit symbol relative relocation. */
196 1.1 skrll HOWTO (R_MIPS_REL32, /* type */
197 1.1 skrll 0, /* rightshift */
198 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
199 1.1 skrll 32, /* bitsize */
200 1.1 skrll FALSE, /* pc_relative */
201 1.1 skrll 0, /* bitpos */
202 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
203 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
204 1.1 skrll "R_MIPS_REL32", /* name */
205 1.1 skrll TRUE, /* partial_inplace */
206 1.1 skrll 0xffffffff, /* src_mask */
207 1.1 skrll 0xffffffff, /* dst_mask */
208 1.1 skrll FALSE), /* pcrel_offset */
209 1.1 skrll
210 1.1 skrll /* 26 bit jump address. */
211 1.1 skrll HOWTO (R_MIPS_26, /* type */
212 1.1 skrll 2, /* rightshift */
213 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
214 1.1 skrll 26, /* bitsize */
215 1.1 skrll FALSE, /* pc_relative */
216 1.1 skrll 0, /* bitpos */
217 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
218 1.1 skrll /* This needs complex overflow
219 1.1 skrll detection, because the upper 36
220 1.1 skrll bits must match the PC + 4. */
221 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
222 1.1 skrll "R_MIPS_26", /* name */
223 1.1 skrll TRUE, /* partial_inplace */
224 1.1 skrll 0x03ffffff, /* src_mask */
225 1.1 skrll 0x03ffffff, /* dst_mask */
226 1.1 skrll FALSE), /* pcrel_offset */
227 1.1 skrll
228 1.1 skrll /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
229 1.1 skrll However, the native IRIX6 tools use them, so we try our best. */
230 1.1 skrll
231 1.1 skrll /* High 16 bits of symbol value. */
232 1.1 skrll HOWTO (R_MIPS_HI16, /* type */
233 1.1 skrll 16, /* rightshift */
234 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
235 1.1 skrll 16, /* bitsize */
236 1.1 skrll FALSE, /* pc_relative */
237 1.1 skrll 0, /* bitpos */
238 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
239 1.1 skrll _bfd_mips_elf_hi16_reloc, /* special_function */
240 1.1 skrll "R_MIPS_HI16", /* name */
241 1.1 skrll TRUE, /* partial_inplace */
242 1.1 skrll 0x0000ffff, /* src_mask */
243 1.1 skrll 0x0000ffff, /* dst_mask */
244 1.1 skrll FALSE), /* pcrel_offset */
245 1.1 skrll
246 1.1 skrll /* Low 16 bits of symbol value. */
247 1.1 skrll HOWTO (R_MIPS_LO16, /* type */
248 1.1 skrll 0, /* rightshift */
249 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
250 1.1 skrll 16, /* bitsize */
251 1.1 skrll FALSE, /* pc_relative */
252 1.1 skrll 0, /* bitpos */
253 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
254 1.1 skrll _bfd_mips_elf_lo16_reloc, /* special_function */
255 1.1 skrll "R_MIPS_LO16", /* name */
256 1.1 skrll TRUE, /* partial_inplace */
257 1.1 skrll 0x0000ffff, /* src_mask */
258 1.1 skrll 0x0000ffff, /* dst_mask */
259 1.1 skrll FALSE), /* pcrel_offset */
260 1.1 skrll
261 1.1 skrll /* GP relative reference. */
262 1.1 skrll HOWTO (R_MIPS_GPREL16, /* type */
263 1.1 skrll 0, /* rightshift */
264 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
265 1.1 skrll 16, /* bitsize */
266 1.1 skrll FALSE, /* pc_relative */
267 1.1 skrll 0, /* bitpos */
268 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
269 1.1 skrll mips_elf64_gprel16_reloc, /* special_function */
270 1.1 skrll "R_MIPS_GPREL16", /* name */
271 1.1 skrll TRUE, /* partial_inplace */
272 1.1 skrll 0x0000ffff, /* src_mask */
273 1.1 skrll 0x0000ffff, /* dst_mask */
274 1.1 skrll FALSE), /* pcrel_offset */
275 1.1 skrll
276 1.1 skrll /* Reference to literal section. */
277 1.1 skrll HOWTO (R_MIPS_LITERAL, /* type */
278 1.1 skrll 0, /* rightshift */
279 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
280 1.1 skrll 16, /* bitsize */
281 1.1 skrll FALSE, /* pc_relative */
282 1.1 skrll 0, /* bitpos */
283 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
284 1.1 skrll mips_elf64_literal_reloc, /* special_function */
285 1.1 skrll "R_MIPS_LITERAL", /* name */
286 1.1 skrll TRUE, /* partial_inplace */
287 1.1 skrll 0x0000ffff, /* src_mask */
288 1.1 skrll 0x0000ffff, /* dst_mask */
289 1.1 skrll FALSE), /* pcrel_offset */
290 1.1 skrll
291 1.1 skrll /* Reference to global offset table. */
292 1.1 skrll HOWTO (R_MIPS_GOT16, /* type */
293 1.1 skrll 0, /* rightshift */
294 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
295 1.1 skrll 16, /* bitsize */
296 1.1 skrll FALSE, /* pc_relative */
297 1.1 skrll 0, /* bitpos */
298 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
299 1.1 skrll _bfd_mips_elf_got16_reloc, /* special_function */
300 1.1 skrll "R_MIPS_GOT16", /* name */
301 1.1 skrll TRUE, /* partial_inplace */
302 1.1 skrll 0x0000ffff, /* src_mask */
303 1.1 skrll 0x0000ffff, /* dst_mask */
304 1.1 skrll FALSE), /* pcrel_offset */
305 1.1 skrll
306 1.1 skrll /* 16 bit PC relative reference. Note that the ABI document has a typo
307 1.1 skrll and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
308 1.1 skrll We do the right thing here. */
309 1.1 skrll HOWTO (R_MIPS_PC16, /* type */
310 1.1 skrll 2, /* rightshift */
311 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
312 1.1 skrll 16, /* bitsize */
313 1.1 skrll TRUE, /* pc_relative */
314 1.1 skrll 0, /* bitpos */
315 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
316 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
317 1.1 skrll "R_MIPS_PC16", /* name */
318 1.1 skrll TRUE, /* partial_inplace */
319 1.1 skrll 0x0000ffff, /* src_mask */
320 1.1 skrll 0x0000ffff, /* dst_mask */
321 1.1 skrll TRUE), /* pcrel_offset */
322 1.1 skrll
323 1.1 skrll /* 16 bit call through global offset table. */
324 1.1 skrll HOWTO (R_MIPS_CALL16, /* type */
325 1.1 skrll 0, /* rightshift */
326 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
327 1.1 skrll 16, /* bitsize */
328 1.1 skrll FALSE, /* pc_relative */
329 1.1 skrll 0, /* bitpos */
330 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
331 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
332 1.1 skrll "R_MIPS_CALL16", /* name */
333 1.1 skrll TRUE, /* partial_inplace */
334 1.1 skrll 0x0000ffff, /* src_mask */
335 1.1 skrll 0x0000ffff, /* dst_mask */
336 1.1 skrll FALSE), /* pcrel_offset */
337 1.1 skrll
338 1.1 skrll /* 32 bit GP relative reference. */
339 1.1 skrll HOWTO (R_MIPS_GPREL32, /* type */
340 1.1 skrll 0, /* rightshift */
341 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
342 1.1 skrll 32, /* bitsize */
343 1.1 skrll FALSE, /* pc_relative */
344 1.1 skrll 0, /* bitpos */
345 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
346 1.1 skrll mips_elf64_gprel32_reloc, /* special_function */
347 1.1 skrll "R_MIPS_GPREL32", /* name */
348 1.1 skrll TRUE, /* partial_inplace */
349 1.1 skrll 0xffffffff, /* src_mask */
350 1.1 skrll 0xffffffff, /* dst_mask */
351 1.1 skrll FALSE), /* pcrel_offset */
352 1.1 skrll
353 1.1 skrll EMPTY_HOWTO (13),
354 1.1 skrll EMPTY_HOWTO (14),
355 1.1 skrll EMPTY_HOWTO (15),
356 1.1 skrll
357 1.1 skrll /* A 5 bit shift field. */
358 1.1 skrll HOWTO (R_MIPS_SHIFT5, /* type */
359 1.1 skrll 0, /* rightshift */
360 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
361 1.1 skrll 5, /* bitsize */
362 1.1 skrll FALSE, /* pc_relative */
363 1.1 skrll 6, /* bitpos */
364 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
365 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
366 1.1 skrll "R_MIPS_SHIFT5", /* name */
367 1.1 skrll TRUE, /* partial_inplace */
368 1.1 skrll 0x000007c0, /* src_mask */
369 1.1 skrll 0x000007c0, /* dst_mask */
370 1.1 skrll FALSE), /* pcrel_offset */
371 1.1 skrll
372 1.1 skrll /* A 6 bit shift field. */
373 1.1 skrll HOWTO (R_MIPS_SHIFT6, /* type */
374 1.1 skrll 0, /* rightshift */
375 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
376 1.1 skrll 6, /* bitsize */
377 1.1 skrll FALSE, /* pc_relative */
378 1.1 skrll 6, /* bitpos */
379 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
380 1.1 skrll mips_elf64_shift6_reloc, /* special_function */
381 1.1 skrll "R_MIPS_SHIFT6", /* name */
382 1.1 skrll TRUE, /* partial_inplace */
383 1.1 skrll 0x000007c4, /* src_mask */
384 1.1 skrll 0x000007c4, /* dst_mask */
385 1.1 skrll FALSE), /* pcrel_offset */
386 1.1 skrll
387 1.1 skrll /* 64 bit relocation. */
388 1.1 skrll HOWTO (R_MIPS_64, /* type */
389 1.1 skrll 0, /* rightshift */
390 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
391 1.1 skrll 64, /* bitsize */
392 1.1 skrll FALSE, /* pc_relative */
393 1.1 skrll 0, /* bitpos */
394 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
395 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
396 1.1 skrll "R_MIPS_64", /* name */
397 1.1 skrll TRUE, /* partial_inplace */
398 1.1 skrll MINUS_ONE, /* src_mask */
399 1.1 skrll MINUS_ONE, /* dst_mask */
400 1.1 skrll FALSE), /* pcrel_offset */
401 1.1 skrll
402 1.1 skrll /* Displacement in the global offset table. */
403 1.1 skrll HOWTO (R_MIPS_GOT_DISP, /* type */
404 1.1 skrll 0, /* rightshift */
405 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
406 1.1 skrll 16, /* bitsize */
407 1.1 skrll FALSE, /* pc_relative */
408 1.1 skrll 0, /* bitpos */
409 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
410 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
411 1.1 skrll "R_MIPS_GOT_DISP", /* name */
412 1.1 skrll TRUE, /* partial_inplace */
413 1.1 skrll 0x0000ffff, /* src_mask */
414 1.1 skrll 0x0000ffff, /* dst_mask */
415 1.1 skrll FALSE), /* pcrel_offset */
416 1.1 skrll
417 1.1 skrll /* Displacement to page pointer in the global offset table. */
418 1.1 skrll HOWTO (R_MIPS_GOT_PAGE, /* type */
419 1.1 skrll 0, /* rightshift */
420 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
421 1.1 skrll 16, /* bitsize */
422 1.1 skrll FALSE, /* pc_relative */
423 1.1 skrll 0, /* bitpos */
424 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
425 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
426 1.1 skrll "R_MIPS_GOT_PAGE", /* name */
427 1.1 skrll TRUE, /* partial_inplace */
428 1.1 skrll 0x0000ffff, /* src_mask */
429 1.1 skrll 0x0000ffff, /* dst_mask */
430 1.1 skrll FALSE), /* pcrel_offset */
431 1.1 skrll
432 1.1 skrll /* Offset from page pointer in the global offset table. */
433 1.1 skrll HOWTO (R_MIPS_GOT_OFST, /* type */
434 1.1 skrll 0, /* rightshift */
435 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
436 1.1 skrll 16, /* bitsize */
437 1.1 skrll FALSE, /* pc_relative */
438 1.1 skrll 0, /* bitpos */
439 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
440 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
441 1.1 skrll "R_MIPS_GOT_OFST", /* name */
442 1.1 skrll TRUE, /* partial_inplace */
443 1.1 skrll 0x0000ffff, /* src_mask */
444 1.1 skrll 0x0000ffff, /* dst_mask */
445 1.1 skrll FALSE), /* pcrel_offset */
446 1.1 skrll
447 1.1 skrll /* High 16 bits of displacement in global offset table. */
448 1.1 skrll HOWTO (R_MIPS_GOT_HI16, /* type */
449 1.1 skrll 0, /* rightshift */
450 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
451 1.1 skrll 16, /* bitsize */
452 1.1 skrll FALSE, /* pc_relative */
453 1.1 skrll 0, /* bitpos */
454 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
455 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
456 1.1 skrll "R_MIPS_GOT_HI16", /* name */
457 1.1 skrll TRUE, /* partial_inplace */
458 1.1 skrll 0x0000ffff, /* src_mask */
459 1.1 skrll 0x0000ffff, /* dst_mask */
460 1.1 skrll FALSE), /* pcrel_offset */
461 1.1 skrll
462 1.1 skrll /* Low 16 bits of displacement in global offset table. */
463 1.1 skrll HOWTO (R_MIPS_GOT_LO16, /* type */
464 1.1 skrll 0, /* rightshift */
465 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
466 1.1 skrll 16, /* bitsize */
467 1.1 skrll FALSE, /* pc_relative */
468 1.1 skrll 0, /* bitpos */
469 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
470 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
471 1.1 skrll "R_MIPS_GOT_LO16", /* name */
472 1.1 skrll TRUE, /* partial_inplace */
473 1.1 skrll 0x0000ffff, /* src_mask */
474 1.1 skrll 0x0000ffff, /* dst_mask */
475 1.1 skrll FALSE), /* pcrel_offset */
476 1.1 skrll
477 1.1 skrll /* 64 bit subtraction. */
478 1.1 skrll HOWTO (R_MIPS_SUB, /* type */
479 1.1 skrll 0, /* rightshift */
480 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
481 1.1 skrll 64, /* bitsize */
482 1.1 skrll FALSE, /* pc_relative */
483 1.1 skrll 0, /* bitpos */
484 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
485 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
486 1.1 skrll "R_MIPS_SUB", /* name */
487 1.1 skrll TRUE, /* partial_inplace */
488 1.1 skrll MINUS_ONE, /* src_mask */
489 1.1 skrll MINUS_ONE, /* dst_mask */
490 1.1 skrll FALSE), /* pcrel_offset */
491 1.1 skrll
492 1.1 skrll /* Insert the addend as an instruction. */
493 1.1 skrll /* FIXME: Not handled correctly. */
494 1.1 skrll HOWTO (R_MIPS_INSERT_A, /* type */
495 1.1 skrll 0, /* rightshift */
496 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
497 1.1 skrll 32, /* bitsize */
498 1.1 skrll FALSE, /* pc_relative */
499 1.1 skrll 0, /* bitpos */
500 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
501 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
502 1.1 skrll "R_MIPS_INSERT_A", /* name */
503 1.1 skrll TRUE, /* partial_inplace */
504 1.1 skrll 0xffffffff, /* src_mask */
505 1.1 skrll 0xffffffff, /* dst_mask */
506 1.1 skrll FALSE), /* pcrel_offset */
507 1.1 skrll
508 1.1 skrll /* Insert the addend as an instruction, and change all relocations
509 1.1 skrll to refer to the old instruction at the address. */
510 1.1 skrll /* FIXME: Not handled correctly. */
511 1.1 skrll HOWTO (R_MIPS_INSERT_B, /* type */
512 1.1 skrll 0, /* rightshift */
513 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
514 1.1 skrll 32, /* bitsize */
515 1.1 skrll FALSE, /* pc_relative */
516 1.1 skrll 0, /* bitpos */
517 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
518 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
519 1.1 skrll "R_MIPS_INSERT_B", /* name */
520 1.1 skrll TRUE, /* partial_inplace */
521 1.1 skrll 0xffffffff, /* src_mask */
522 1.1 skrll 0xffffffff, /* dst_mask */
523 1.1 skrll FALSE), /* pcrel_offset */
524 1.1 skrll
525 1.1 skrll /* Delete a 32 bit instruction. */
526 1.1 skrll /* FIXME: Not handled correctly. */
527 1.1 skrll HOWTO (R_MIPS_DELETE, /* type */
528 1.1 skrll 0, /* rightshift */
529 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
530 1.1 skrll 32, /* bitsize */
531 1.1 skrll FALSE, /* pc_relative */
532 1.1 skrll 0, /* bitpos */
533 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
534 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
535 1.1 skrll "R_MIPS_DELETE", /* name */
536 1.1 skrll TRUE, /* partial_inplace */
537 1.1 skrll 0xffffffff, /* src_mask */
538 1.1 skrll 0xffffffff, /* dst_mask */
539 1.1 skrll FALSE), /* pcrel_offset */
540 1.1 skrll
541 1.1 skrll /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
542 1.1 skrll We don't, because
543 1.1 skrll a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
544 1.1 skrll R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
545 1.1 skrll fallable heuristics.
546 1.1 skrll b) No other NewABI toolchain actually emits such relocations. */
547 1.1 skrll EMPTY_HOWTO (R_MIPS_HIGHER),
548 1.1 skrll EMPTY_HOWTO (R_MIPS_HIGHEST),
549 1.1 skrll
550 1.1 skrll /* High 16 bits of displacement in global offset table. */
551 1.1 skrll HOWTO (R_MIPS_CALL_HI16, /* type */
552 1.1 skrll 0, /* rightshift */
553 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
554 1.1 skrll 16, /* bitsize */
555 1.1 skrll FALSE, /* pc_relative */
556 1.1 skrll 0, /* bitpos */
557 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
558 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
559 1.1 skrll "R_MIPS_CALL_HI16", /* name */
560 1.1 skrll TRUE, /* partial_inplace */
561 1.1 skrll 0x0000ffff, /* src_mask */
562 1.1 skrll 0x0000ffff, /* dst_mask */
563 1.1 skrll FALSE), /* pcrel_offset */
564 1.1 skrll
565 1.1 skrll /* Low 16 bits of displacement in global offset table. */
566 1.1 skrll HOWTO (R_MIPS_CALL_LO16, /* type */
567 1.1 skrll 0, /* rightshift */
568 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
569 1.1 skrll 16, /* bitsize */
570 1.1 skrll FALSE, /* pc_relative */
571 1.1 skrll 0, /* bitpos */
572 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
573 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
574 1.1 skrll "R_MIPS_CALL_LO16", /* name */
575 1.1 skrll TRUE, /* partial_inplace */
576 1.1 skrll 0x0000ffff, /* src_mask */
577 1.1 skrll 0x0000ffff, /* dst_mask */
578 1.1 skrll FALSE), /* pcrel_offset */
579 1.1 skrll
580 1.1 skrll /* Section displacement, used by an associated event location section. */
581 1.1 skrll HOWTO (R_MIPS_SCN_DISP, /* type */
582 1.1 skrll 0, /* rightshift */
583 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
584 1.1 skrll 32, /* bitsize */
585 1.1 skrll FALSE, /* pc_relative */
586 1.1 skrll 0, /* bitpos */
587 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
588 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
589 1.1 skrll "R_MIPS_SCN_DISP", /* name */
590 1.1 skrll TRUE, /* partial_inplace */
591 1.1 skrll 0xffffffff, /* src_mask */
592 1.1 skrll 0xffffffff, /* dst_mask */
593 1.1 skrll FALSE), /* pcrel_offset */
594 1.1 skrll
595 1.1 skrll HOWTO (R_MIPS_REL16, /* type */
596 1.1 skrll 0, /* rightshift */
597 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
598 1.1 skrll 16, /* bitsize */
599 1.1 skrll FALSE, /* pc_relative */
600 1.1 skrll 0, /* bitpos */
601 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
602 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
603 1.1 skrll "R_MIPS_REL16", /* name */
604 1.1 skrll TRUE, /* partial_inplace */
605 1.1 skrll 0xffff, /* src_mask */
606 1.1 skrll 0xffff, /* dst_mask */
607 1.1 skrll FALSE), /* pcrel_offset */
608 1.1 skrll
609 1.1 skrll /* These two are obsolete. */
610 1.1 skrll EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
611 1.1 skrll EMPTY_HOWTO (R_MIPS_PJUMP),
612 1.1 skrll
613 1.1 skrll /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
614 1.1 skrll It must be used for multigot GOT's (and only there). */
615 1.1 skrll HOWTO (R_MIPS_RELGOT, /* type */
616 1.1 skrll 0, /* rightshift */
617 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
618 1.1 skrll 32, /* bitsize */
619 1.1 skrll FALSE, /* pc_relative */
620 1.1 skrll 0, /* bitpos */
621 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
622 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
623 1.1 skrll "R_MIPS_RELGOT", /* name */
624 1.1 skrll TRUE, /* partial_inplace */
625 1.1 skrll 0xffffffff, /* src_mask */
626 1.1 skrll 0xffffffff, /* dst_mask */
627 1.1 skrll FALSE), /* pcrel_offset */
628 1.1 skrll
629 1.1 skrll /* Protected jump conversion. This is an optimization hint. No
630 1.1 skrll relocation is required for correctness. */
631 1.1 skrll HOWTO (R_MIPS_JALR, /* type */
632 1.1 skrll 0, /* rightshift */
633 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
634 1.1 skrll 32, /* bitsize */
635 1.1 skrll FALSE, /* pc_relative */
636 1.1 skrll 0, /* bitpos */
637 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
638 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
639 1.1 skrll "R_MIPS_JALR", /* name */
640 1.1 skrll FALSE, /* partial_inplace */
641 1.1 skrll 0, /* src_mask */
642 1.1 skrll 0x00000000, /* dst_mask */
643 1.1 skrll FALSE), /* pcrel_offset */
644 1.1 skrll
645 1.1 skrll /* TLS relocations. */
646 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
647 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
648 1.1 skrll
649 1.1 skrll HOWTO (R_MIPS_TLS_DTPMOD64, /* type */
650 1.1 skrll 0, /* rightshift */
651 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
652 1.1 skrll 64, /* bitsize */
653 1.1 skrll FALSE, /* pc_relative */
654 1.1 skrll 0, /* bitpos */
655 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
656 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
657 1.1 skrll "R_MIPS_TLS_DTPMOD64", /* name */
658 1.1 skrll TRUE, /* partial_inplace */
659 1.1 skrll MINUS_ONE, /* src_mask */
660 1.1 skrll MINUS_ONE, /* dst_mask */
661 1.1 skrll FALSE), /* pcrel_offset */
662 1.1 skrll
663 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL64, /* type */
664 1.1 skrll 0, /* rightshift */
665 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
666 1.1 skrll 64, /* bitsize */
667 1.1 skrll FALSE, /* pc_relative */
668 1.1 skrll 0, /* bitpos */
669 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
670 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
671 1.1 skrll "R_MIPS_TLS_DTPREL64", /* name */
672 1.1 skrll TRUE, /* partial_inplace */
673 1.1 skrll MINUS_ONE, /* src_mask */
674 1.1 skrll MINUS_ONE, /* dst_mask */
675 1.1 skrll FALSE), /* pcrel_offset */
676 1.1 skrll
677 1.1 skrll /* TLS general dynamic variable reference. */
678 1.1 skrll HOWTO (R_MIPS_TLS_GD, /* type */
679 1.1 skrll 0, /* rightshift */
680 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
681 1.1 skrll 16, /* bitsize */
682 1.1 skrll FALSE, /* pc_relative */
683 1.1 skrll 0, /* bitpos */
684 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
685 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
686 1.1 skrll "R_MIPS_TLS_GD", /* name */
687 1.1 skrll TRUE, /* partial_inplace */
688 1.1 skrll 0x0000ffff, /* src_mask */
689 1.1 skrll 0x0000ffff, /* dst_mask */
690 1.1 skrll FALSE), /* pcrel_offset */
691 1.1 skrll
692 1.1 skrll /* TLS local dynamic variable reference. */
693 1.1 skrll HOWTO (R_MIPS_TLS_LDM, /* type */
694 1.1 skrll 0, /* rightshift */
695 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
696 1.1 skrll 16, /* bitsize */
697 1.1 skrll FALSE, /* pc_relative */
698 1.1 skrll 0, /* bitpos */
699 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
700 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
701 1.1 skrll "R_MIPS_TLS_LDM", /* name */
702 1.1 skrll TRUE, /* partial_inplace */
703 1.1 skrll 0x0000ffff, /* src_mask */
704 1.1 skrll 0x0000ffff, /* dst_mask */
705 1.1 skrll FALSE), /* pcrel_offset */
706 1.1 skrll
707 1.1 skrll /* TLS local dynamic offset. */
708 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
709 1.1 skrll 0, /* rightshift */
710 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
711 1.1 skrll 16, /* bitsize */
712 1.1 skrll FALSE, /* pc_relative */
713 1.1 skrll 0, /* bitpos */
714 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
715 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
716 1.1 skrll "R_MIPS_TLS_DTPREL_HI16", /* name */
717 1.1 skrll TRUE, /* partial_inplace */
718 1.1 skrll 0x0000ffff, /* src_mask */
719 1.1 skrll 0x0000ffff, /* dst_mask */
720 1.1 skrll FALSE), /* pcrel_offset */
721 1.1 skrll
722 1.1 skrll /* TLS local dynamic offset. */
723 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
724 1.1 skrll 0, /* rightshift */
725 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
726 1.1 skrll 16, /* bitsize */
727 1.1 skrll FALSE, /* pc_relative */
728 1.1 skrll 0, /* bitpos */
729 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
730 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
731 1.1 skrll "R_MIPS_TLS_DTPREL_LO16", /* name */
732 1.1 skrll TRUE, /* partial_inplace */
733 1.1 skrll 0x0000ffff, /* src_mask */
734 1.1 skrll 0x0000ffff, /* dst_mask */
735 1.1 skrll FALSE), /* pcrel_offset */
736 1.1 skrll
737 1.1 skrll /* TLS thread pointer offset. */
738 1.1 skrll HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
739 1.1 skrll 0, /* rightshift */
740 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
741 1.1 skrll 16, /* bitsize */
742 1.1 skrll FALSE, /* pc_relative */
743 1.1 skrll 0, /* bitpos */
744 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
745 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
746 1.1 skrll "R_MIPS_TLS_GOTTPREL", /* name */
747 1.1 skrll TRUE, /* partial_inplace */
748 1.1 skrll 0x0000ffff, /* src_mask */
749 1.1 skrll 0x0000ffff, /* dst_mask */
750 1.1 skrll FALSE), /* pcrel_offset */
751 1.1 skrll
752 1.1 skrll /* TLS IE dynamic relocations. */
753 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
754 1.1 skrll
755 1.1 skrll HOWTO (R_MIPS_TLS_TPREL64, /* type */
756 1.1 skrll 0, /* rightshift */
757 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
758 1.1 skrll 64, /* bitsize */
759 1.1 skrll FALSE, /* pc_relative */
760 1.1 skrll 0, /* bitpos */
761 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
762 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
763 1.1 skrll "R_MIPS_TLS_TPREL64", /* name */
764 1.1 skrll TRUE, /* partial_inplace */
765 1.1 skrll MINUS_ONE, /* src_mask */
766 1.1 skrll MINUS_ONE, /* dst_mask */
767 1.1 skrll FALSE), /* pcrel_offset */
768 1.1 skrll
769 1.1 skrll /* TLS thread pointer offset. */
770 1.1 skrll HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
771 1.1 skrll 0, /* rightshift */
772 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
773 1.1 skrll 16, /* bitsize */
774 1.1 skrll FALSE, /* pc_relative */
775 1.1 skrll 0, /* bitpos */
776 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
777 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
778 1.1 skrll "R_MIPS_TLS_TPREL_HI16", /* name */
779 1.1 skrll TRUE, /* partial_inplace */
780 1.1 skrll 0x0000ffff, /* src_mask */
781 1.1 skrll 0x0000ffff, /* dst_mask */
782 1.1 skrll FALSE), /* pcrel_offset */
783 1.1 skrll
784 1.1 skrll /* TLS thread pointer offset. */
785 1.1 skrll HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
786 1.1 skrll 0, /* rightshift */
787 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
788 1.1 skrll 16, /* bitsize */
789 1.1 skrll FALSE, /* pc_relative */
790 1.1 skrll 0, /* bitpos */
791 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
792 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
793 1.1 skrll "R_MIPS_TLS_TPREL_LO16", /* name */
794 1.1 skrll TRUE, /* partial_inplace */
795 1.1 skrll 0x0000ffff, /* src_mask */
796 1.1 skrll 0x0000ffff, /* dst_mask */
797 1.1 skrll FALSE), /* pcrel_offset */
798 1.1 skrll
799 1.1 skrll /* 32 bit relocation with no addend. */
800 1.1 skrll HOWTO (R_MIPS_GLOB_DAT, /* type */
801 1.1 skrll 0, /* rightshift */
802 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
803 1.1 skrll 32, /* bitsize */
804 1.1 skrll FALSE, /* pc_relative */
805 1.1 skrll 0, /* bitpos */
806 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
807 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
808 1.1 skrll "R_MIPS_GLOB_DAT", /* name */
809 1.1 skrll FALSE, /* partial_inplace */
810 1.1 skrll 0x0, /* src_mask */
811 1.1 skrll 0xffffffff, /* dst_mask */
812 1.1 skrll FALSE), /* pcrel_offset */
813 1.1 skrll };
814 1.1 skrll
815 1.1 skrll /* The relocation table used for SHT_RELA sections. */
816 1.1 skrll
817 1.1 skrll static reloc_howto_type mips_elf64_howto_table_rela[] =
818 1.1 skrll {
819 1.1 skrll /* No relocation. */
820 1.1 skrll HOWTO (R_MIPS_NONE, /* type */
821 1.1 skrll 0, /* rightshift */
822 1.1 skrll 0, /* size (0 = byte, 1 = short, 2 = long) */
823 1.1 skrll 0, /* bitsize */
824 1.1 skrll FALSE, /* pc_relative */
825 1.1 skrll 0, /* bitpos */
826 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
827 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
828 1.1 skrll "R_MIPS_NONE", /* name */
829 1.1 skrll FALSE, /* partial_inplace */
830 1.1 skrll 0, /* src_mask */
831 1.1 skrll 0, /* dst_mask */
832 1.1 skrll FALSE), /* pcrel_offset */
833 1.1 skrll
834 1.1 skrll /* 16 bit relocation. */
835 1.1 skrll HOWTO (R_MIPS_16, /* type */
836 1.1 skrll 0, /* rightshift */
837 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
838 1.1 skrll 16, /* bitsize */
839 1.1 skrll FALSE, /* pc_relative */
840 1.1 skrll 0, /* bitpos */
841 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
842 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
843 1.1 skrll "R_MIPS_16", /* name */
844 1.1 skrll FALSE, /* partial_inplace */
845 1.1 skrll 0, /* src_mask */
846 1.1 skrll 0x0000ffff, /* dst_mask */
847 1.1 skrll FALSE), /* pcrel_offset */
848 1.1 skrll
849 1.1 skrll /* 32 bit relocation. */
850 1.1 skrll HOWTO (R_MIPS_32, /* type */
851 1.1 skrll 0, /* rightshift */
852 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
853 1.1 skrll 32, /* bitsize */
854 1.1 skrll FALSE, /* pc_relative */
855 1.1 skrll 0, /* bitpos */
856 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
857 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
858 1.1 skrll "R_MIPS_32", /* name */
859 1.1 skrll FALSE, /* partial_inplace */
860 1.1 skrll 0, /* src_mask */
861 1.1 skrll 0xffffffff, /* dst_mask */
862 1.1 skrll FALSE), /* pcrel_offset */
863 1.1 skrll
864 1.1 skrll /* 32 bit symbol relative relocation. */
865 1.1 skrll HOWTO (R_MIPS_REL32, /* type */
866 1.1 skrll 0, /* rightshift */
867 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
868 1.1 skrll 32, /* bitsize */
869 1.1 skrll FALSE, /* pc_relative */
870 1.1 skrll 0, /* bitpos */
871 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
872 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
873 1.1 skrll "R_MIPS_REL32", /* name */
874 1.1 skrll FALSE, /* partial_inplace */
875 1.1 skrll 0, /* src_mask */
876 1.1 skrll 0xffffffff, /* dst_mask */
877 1.1 skrll FALSE), /* pcrel_offset */
878 1.1 skrll
879 1.1 skrll /* 26 bit jump address. */
880 1.1 skrll HOWTO (R_MIPS_26, /* type */
881 1.1 skrll 2, /* rightshift */
882 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
883 1.1 skrll 26, /* bitsize */
884 1.1 skrll FALSE, /* pc_relative */
885 1.1 skrll 0, /* bitpos */
886 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
887 1.1 skrll /* This needs complex overflow
888 1.1 skrll detection, because the upper 36
889 1.1 skrll bits must match the PC + 4. */
890 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
891 1.1 skrll "R_MIPS_26", /* name */
892 1.1 skrll FALSE, /* partial_inplace */
893 1.1 skrll 0, /* src_mask */
894 1.1 skrll 0x03ffffff, /* dst_mask */
895 1.1 skrll FALSE), /* pcrel_offset */
896 1.1 skrll
897 1.1 skrll /* High 16 bits of symbol value. */
898 1.1 skrll HOWTO (R_MIPS_HI16, /* type */
899 1.1 skrll 0, /* rightshift */
900 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
901 1.1 skrll 16, /* bitsize */
902 1.1 skrll FALSE, /* pc_relative */
903 1.1 skrll 0, /* bitpos */
904 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
905 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
906 1.1 skrll "R_MIPS_HI16", /* name */
907 1.1 skrll FALSE, /* partial_inplace */
908 1.1 skrll 0, /* src_mask */
909 1.1 skrll 0x0000ffff, /* dst_mask */
910 1.1 skrll FALSE), /* pcrel_offset */
911 1.1 skrll
912 1.1 skrll /* Low 16 bits of symbol value. */
913 1.1 skrll HOWTO (R_MIPS_LO16, /* type */
914 1.1 skrll 0, /* rightshift */
915 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
916 1.1 skrll 16, /* bitsize */
917 1.1 skrll FALSE, /* pc_relative */
918 1.1 skrll 0, /* bitpos */
919 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
920 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
921 1.1 skrll "R_MIPS_LO16", /* name */
922 1.1 skrll FALSE, /* partial_inplace */
923 1.1 skrll 0, /* src_mask */
924 1.1 skrll 0x0000ffff, /* dst_mask */
925 1.1 skrll FALSE), /* pcrel_offset */
926 1.1 skrll
927 1.1 skrll /* GP relative reference. */
928 1.1 skrll HOWTO (R_MIPS_GPREL16, /* type */
929 1.1 skrll 0, /* rightshift */
930 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
931 1.1 skrll 16, /* bitsize */
932 1.1 skrll FALSE, /* pc_relative */
933 1.1 skrll 0, /* bitpos */
934 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
935 1.1 skrll mips_elf64_gprel16_reloc, /* special_function */
936 1.1 skrll "R_MIPS_GPREL16", /* name */
937 1.1 skrll FALSE, /* partial_inplace */
938 1.1 skrll 0, /* src_mask */
939 1.1 skrll 0x0000ffff, /* dst_mask */
940 1.1 skrll FALSE), /* pcrel_offset */
941 1.1 skrll
942 1.1 skrll /* Reference to literal section. */
943 1.1 skrll HOWTO (R_MIPS_LITERAL, /* type */
944 1.1 skrll 0, /* rightshift */
945 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
946 1.1 skrll 16, /* bitsize */
947 1.1 skrll FALSE, /* pc_relative */
948 1.1 skrll 0, /* bitpos */
949 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
950 1.1 skrll mips_elf64_literal_reloc, /* special_function */
951 1.1 skrll "R_MIPS_LITERAL", /* name */
952 1.1 skrll FALSE, /* partial_inplace */
953 1.1 skrll 0, /* src_mask */
954 1.1 skrll 0x0000ffff, /* dst_mask */
955 1.1 skrll FALSE), /* pcrel_offset */
956 1.1 skrll
957 1.1 skrll /* Reference to global offset table. */
958 1.1 skrll HOWTO (R_MIPS_GOT16, /* type */
959 1.1 skrll 0, /* rightshift */
960 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
961 1.1 skrll 16, /* bitsize */
962 1.1 skrll FALSE, /* pc_relative */
963 1.1 skrll 0, /* bitpos */
964 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
965 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
966 1.1 skrll "R_MIPS_GOT16", /* name */
967 1.1 skrll FALSE, /* partial_inplace */
968 1.1 skrll 0, /* src_mask */
969 1.1 skrll 0x0000ffff, /* dst_mask */
970 1.1 skrll FALSE), /* pcrel_offset */
971 1.1 skrll
972 1.1 skrll /* 16 bit PC relative reference. Note that the ABI document has a typo
973 1.1 skrll and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
974 1.1 skrll We do the right thing here. */
975 1.1 skrll HOWTO (R_MIPS_PC16, /* type */
976 1.1 skrll 2, /* rightshift */
977 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
978 1.1 skrll 16, /* bitsize */
979 1.1 skrll TRUE, /* pc_relative */
980 1.1 skrll 0, /* bitpos */
981 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
982 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
983 1.1 skrll "R_MIPS_PC16", /* name */
984 1.1 skrll FALSE, /* partial_inplace */
985 1.1 skrll 0, /* src_mask */
986 1.1 skrll 0x0000ffff, /* dst_mask */
987 1.1 skrll TRUE), /* pcrel_offset */
988 1.1 skrll
989 1.1 skrll /* 16 bit call through global offset table. */
990 1.1 skrll HOWTO (R_MIPS_CALL16, /* type */
991 1.1 skrll 0, /* rightshift */
992 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
993 1.1 skrll 16, /* bitsize */
994 1.1 skrll FALSE, /* pc_relative */
995 1.1 skrll 0, /* bitpos */
996 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
997 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
998 1.1 skrll "R_MIPS_CALL16", /* name */
999 1.1 skrll FALSE, /* partial_inplace */
1000 1.1 skrll 0, /* src_mask */
1001 1.1 skrll 0x0000ffff, /* dst_mask */
1002 1.1 skrll FALSE), /* pcrel_offset */
1003 1.1 skrll
1004 1.1 skrll /* 32 bit GP relative reference. */
1005 1.1 skrll HOWTO (R_MIPS_GPREL32, /* type */
1006 1.1 skrll 0, /* rightshift */
1007 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1008 1.1 skrll 32, /* bitsize */
1009 1.1 skrll FALSE, /* pc_relative */
1010 1.1 skrll 0, /* bitpos */
1011 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1012 1.1 skrll mips_elf64_gprel32_reloc, /* special_function */
1013 1.1 skrll "R_MIPS_GPREL32", /* name */
1014 1.1 skrll FALSE, /* partial_inplace */
1015 1.1 skrll 0, /* src_mask */
1016 1.1 skrll 0xffffffff, /* dst_mask */
1017 1.1 skrll FALSE), /* pcrel_offset */
1018 1.1 skrll
1019 1.1 skrll EMPTY_HOWTO (13),
1020 1.1 skrll EMPTY_HOWTO (14),
1021 1.1 skrll EMPTY_HOWTO (15),
1022 1.1 skrll
1023 1.1 skrll /* A 5 bit shift field. */
1024 1.1 skrll HOWTO (R_MIPS_SHIFT5, /* type */
1025 1.1 skrll 0, /* rightshift */
1026 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1027 1.1 skrll 5, /* bitsize */
1028 1.1 skrll FALSE, /* pc_relative */
1029 1.1 skrll 6, /* bitpos */
1030 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
1031 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1032 1.1 skrll "R_MIPS_SHIFT5", /* name */
1033 1.1 skrll FALSE, /* partial_inplace */
1034 1.1 skrll 0, /* src_mask */
1035 1.1 skrll 0x000007c0, /* dst_mask */
1036 1.1 skrll FALSE), /* pcrel_offset */
1037 1.1 skrll
1038 1.1 skrll /* A 6 bit shift field. */
1039 1.1 skrll HOWTO (R_MIPS_SHIFT6, /* type */
1040 1.1 skrll 0, /* rightshift */
1041 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1042 1.1 skrll 6, /* bitsize */
1043 1.1 skrll FALSE, /* pc_relative */
1044 1.1 skrll 6, /* bitpos */
1045 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
1046 1.1 skrll mips_elf64_shift6_reloc, /* special_function */
1047 1.1 skrll "R_MIPS_SHIFT6", /* name */
1048 1.1 skrll FALSE, /* partial_inplace */
1049 1.1 skrll 0, /* src_mask */
1050 1.1 skrll 0x000007c4, /* dst_mask */
1051 1.1 skrll FALSE), /* pcrel_offset */
1052 1.1 skrll
1053 1.1 skrll /* 64 bit relocation. */
1054 1.1 skrll HOWTO (R_MIPS_64, /* type */
1055 1.1 skrll 0, /* rightshift */
1056 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
1057 1.1 skrll 64, /* bitsize */
1058 1.1 skrll FALSE, /* pc_relative */
1059 1.1 skrll 0, /* bitpos */
1060 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1061 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1062 1.1 skrll "R_MIPS_64", /* name */
1063 1.1 skrll FALSE, /* partial_inplace */
1064 1.1 skrll 0, /* src_mask */
1065 1.1 skrll MINUS_ONE, /* dst_mask */
1066 1.1 skrll FALSE), /* pcrel_offset */
1067 1.1 skrll
1068 1.1 skrll /* Displacement in the global offset table. */
1069 1.1 skrll HOWTO (R_MIPS_GOT_DISP, /* type */
1070 1.1 skrll 0, /* rightshift */
1071 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1072 1.1 skrll 16, /* bitsize */
1073 1.1 skrll FALSE, /* pc_relative */
1074 1.1 skrll 0, /* bitpos */
1075 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1076 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1077 1.1 skrll "R_MIPS_GOT_DISP", /* name */
1078 1.1 skrll FALSE, /* partial_inplace */
1079 1.1 skrll 0, /* src_mask */
1080 1.1 skrll 0x0000ffff, /* dst_mask */
1081 1.1 skrll FALSE), /* pcrel_offset */
1082 1.1 skrll
1083 1.1 skrll /* Displacement to page pointer in the global offset table. */
1084 1.1 skrll HOWTO (R_MIPS_GOT_PAGE, /* type */
1085 1.1 skrll 0, /* rightshift */
1086 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1087 1.1 skrll 16, /* bitsize */
1088 1.1 skrll FALSE, /* pc_relative */
1089 1.1 skrll 0, /* bitpos */
1090 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1091 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1092 1.1 skrll "R_MIPS_GOT_PAGE", /* name */
1093 1.1 skrll FALSE, /* partial_inplace */
1094 1.1 skrll 0, /* src_mask */
1095 1.1 skrll 0x0000ffff, /* dst_mask */
1096 1.1 skrll FALSE), /* pcrel_offset */
1097 1.1 skrll
1098 1.1 skrll /* Offset from page pointer in the global offset table. */
1099 1.1 skrll HOWTO (R_MIPS_GOT_OFST, /* type */
1100 1.1 skrll 0, /* rightshift */
1101 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1102 1.1 skrll 16, /* bitsize */
1103 1.1 skrll FALSE, /* pc_relative */
1104 1.1 skrll 0, /* bitpos */
1105 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1106 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1107 1.1 skrll "R_MIPS_GOT_OFST", /* name */
1108 1.1 skrll FALSE, /* partial_inplace */
1109 1.1 skrll 0, /* src_mask */
1110 1.1 skrll 0x0000ffff, /* dst_mask */
1111 1.1 skrll FALSE), /* pcrel_offset */
1112 1.1 skrll
1113 1.1 skrll /* High 16 bits of displacement in global offset table. */
1114 1.1 skrll HOWTO (R_MIPS_GOT_HI16, /* type */
1115 1.1 skrll 0, /* rightshift */
1116 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1117 1.1 skrll 16, /* bitsize */
1118 1.1 skrll FALSE, /* pc_relative */
1119 1.1 skrll 0, /* bitpos */
1120 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1121 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1122 1.1 skrll "R_MIPS_GOT_HI16", /* name */
1123 1.1 skrll FALSE, /* partial_inplace */
1124 1.1 skrll 0, /* src_mask */
1125 1.1 skrll 0x0000ffff, /* dst_mask */
1126 1.1 skrll FALSE), /* pcrel_offset */
1127 1.1 skrll
1128 1.1 skrll /* Low 16 bits of displacement in global offset table. */
1129 1.1 skrll HOWTO (R_MIPS_GOT_LO16, /* type */
1130 1.1 skrll 0, /* rightshift */
1131 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1132 1.1 skrll 16, /* bitsize */
1133 1.1 skrll FALSE, /* pc_relative */
1134 1.1 skrll 0, /* bitpos */
1135 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1136 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1137 1.1 skrll "R_MIPS_GOT_LO16", /* name */
1138 1.1 skrll FALSE, /* partial_inplace */
1139 1.1 skrll 0, /* src_mask */
1140 1.1 skrll 0x0000ffff, /* dst_mask */
1141 1.1 skrll FALSE), /* pcrel_offset */
1142 1.1 skrll
1143 1.1 skrll /* 64 bit subtraction. */
1144 1.1 skrll HOWTO (R_MIPS_SUB, /* type */
1145 1.1 skrll 0, /* rightshift */
1146 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
1147 1.1 skrll 64, /* bitsize */
1148 1.1 skrll FALSE, /* pc_relative */
1149 1.1 skrll 0, /* bitpos */
1150 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1151 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1152 1.1 skrll "R_MIPS_SUB", /* name */
1153 1.1 skrll FALSE, /* partial_inplace */
1154 1.1 skrll 0, /* src_mask */
1155 1.1 skrll MINUS_ONE, /* dst_mask */
1156 1.1 skrll FALSE), /* pcrel_offset */
1157 1.1 skrll
1158 1.1 skrll /* Insert the addend as an instruction. */
1159 1.1 skrll /* FIXME: Not handled correctly. */
1160 1.1 skrll HOWTO (R_MIPS_INSERT_A, /* type */
1161 1.1 skrll 0, /* rightshift */
1162 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1163 1.1 skrll 32, /* bitsize */
1164 1.1 skrll FALSE, /* pc_relative */
1165 1.1 skrll 0, /* bitpos */
1166 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1167 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1168 1.1 skrll "R_MIPS_INSERT_A", /* name */
1169 1.1 skrll FALSE, /* partial_inplace */
1170 1.1 skrll 0, /* src_mask */
1171 1.1 skrll 0xffffffff, /* dst_mask */
1172 1.1 skrll FALSE), /* pcrel_offset */
1173 1.1 skrll
1174 1.1 skrll /* Insert the addend as an instruction, and change all relocations
1175 1.1 skrll to refer to the old instruction at the address. */
1176 1.1 skrll /* FIXME: Not handled correctly. */
1177 1.1 skrll HOWTO (R_MIPS_INSERT_B, /* type */
1178 1.1 skrll 0, /* rightshift */
1179 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1180 1.1 skrll 32, /* bitsize */
1181 1.1 skrll FALSE, /* pc_relative */
1182 1.1 skrll 0, /* bitpos */
1183 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1184 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1185 1.1 skrll "R_MIPS_INSERT_B", /* name */
1186 1.1 skrll FALSE, /* partial_inplace */
1187 1.1 skrll 0, /* src_mask */
1188 1.1 skrll 0xffffffff, /* dst_mask */
1189 1.1 skrll FALSE), /* pcrel_offset */
1190 1.1 skrll
1191 1.1 skrll /* Delete a 32 bit instruction. */
1192 1.1 skrll /* FIXME: Not handled correctly. */
1193 1.1 skrll HOWTO (R_MIPS_DELETE, /* type */
1194 1.1 skrll 0, /* rightshift */
1195 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1196 1.1 skrll 32, /* bitsize */
1197 1.1 skrll FALSE, /* pc_relative */
1198 1.1 skrll 0, /* bitpos */
1199 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1200 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1201 1.1 skrll "R_MIPS_DELETE", /* name */
1202 1.1 skrll FALSE, /* partial_inplace */
1203 1.1 skrll 0, /* src_mask */
1204 1.1 skrll 0xffffffff, /* dst_mask */
1205 1.1 skrll FALSE), /* pcrel_offset */
1206 1.1 skrll
1207 1.1 skrll /* Get the higher value of a 64 bit addend. */
1208 1.1 skrll HOWTO (R_MIPS_HIGHER, /* type */
1209 1.1 skrll 0, /* rightshift */
1210 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1211 1.1 skrll 16, /* bitsize */
1212 1.1 skrll FALSE, /* pc_relative */
1213 1.1 skrll 0, /* bitpos */
1214 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1215 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1216 1.1 skrll "R_MIPS_HIGHER", /* name */
1217 1.1 skrll FALSE, /* partial_inplace */
1218 1.1 skrll 0, /* src_mask */
1219 1.1 skrll 0x0000ffff, /* dst_mask */
1220 1.1 skrll FALSE), /* pcrel_offset */
1221 1.1 skrll
1222 1.1 skrll /* Get the highest value of a 64 bit addend. */
1223 1.1 skrll HOWTO (R_MIPS_HIGHEST, /* type */
1224 1.1 skrll 0, /* rightshift */
1225 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1226 1.1 skrll 16, /* bitsize */
1227 1.1 skrll FALSE, /* pc_relative */
1228 1.1 skrll 0, /* bitpos */
1229 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1230 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1231 1.1 skrll "R_MIPS_HIGHEST", /* name */
1232 1.1 skrll FALSE, /* partial_inplace */
1233 1.1 skrll 0, /* src_mask */
1234 1.1 skrll 0x0000ffff, /* dst_mask */
1235 1.1 skrll FALSE), /* pcrel_offset */
1236 1.1 skrll
1237 1.1 skrll /* High 16 bits of displacement in global offset table. */
1238 1.1 skrll HOWTO (R_MIPS_CALL_HI16, /* type */
1239 1.1 skrll 0, /* rightshift */
1240 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1241 1.1 skrll 16, /* bitsize */
1242 1.1 skrll FALSE, /* pc_relative */
1243 1.1 skrll 0, /* bitpos */
1244 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1245 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1246 1.1 skrll "R_MIPS_CALL_HI16", /* name */
1247 1.1 skrll FALSE, /* partial_inplace */
1248 1.1 skrll 0, /* src_mask */
1249 1.1 skrll 0x0000ffff, /* dst_mask */
1250 1.1 skrll FALSE), /* pcrel_offset */
1251 1.1 skrll
1252 1.1 skrll /* Low 16 bits of displacement in global offset table. */
1253 1.1 skrll HOWTO (R_MIPS_CALL_LO16, /* type */
1254 1.1 skrll 0, /* rightshift */
1255 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1256 1.1 skrll 16, /* bitsize */
1257 1.1 skrll FALSE, /* pc_relative */
1258 1.1 skrll 0, /* bitpos */
1259 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1260 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1261 1.1 skrll "R_MIPS_CALL_LO16", /* name */
1262 1.1 skrll FALSE, /* partial_inplace */
1263 1.1 skrll 0, /* src_mask */
1264 1.1 skrll 0x0000ffff, /* dst_mask */
1265 1.1 skrll FALSE), /* pcrel_offset */
1266 1.1 skrll
1267 1.1 skrll /* Section displacement, used by an associated event location section. */
1268 1.1 skrll HOWTO (R_MIPS_SCN_DISP, /* type */
1269 1.1 skrll 0, /* rightshift */
1270 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1271 1.1 skrll 32, /* bitsize */
1272 1.1 skrll FALSE, /* pc_relative */
1273 1.1 skrll 0, /* bitpos */
1274 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1275 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1276 1.1 skrll "R_MIPS_SCN_DISP", /* name */
1277 1.1 skrll FALSE, /* partial_inplace */
1278 1.1 skrll 0, /* src_mask */
1279 1.1 skrll 0xffffffff, /* dst_mask */
1280 1.1 skrll FALSE), /* pcrel_offset */
1281 1.1 skrll
1282 1.1 skrll HOWTO (R_MIPS_REL16, /* type */
1283 1.1 skrll 0, /* rightshift */
1284 1.1 skrll 1, /* size (0 = byte, 1 = short, 2 = long) */
1285 1.1 skrll 16, /* bitsize */
1286 1.1 skrll FALSE, /* pc_relative */
1287 1.1 skrll 0, /* bitpos */
1288 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
1289 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1290 1.1 skrll "R_MIPS_REL16", /* name */
1291 1.1 skrll FALSE, /* partial_inplace */
1292 1.1 skrll 0, /* src_mask */
1293 1.1 skrll 0xffff, /* dst_mask */
1294 1.1 skrll FALSE), /* pcrel_offset */
1295 1.1 skrll
1296 1.1 skrll /* These two are obsolete. */
1297 1.1 skrll EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1298 1.1 skrll EMPTY_HOWTO (R_MIPS_PJUMP),
1299 1.1 skrll
1300 1.1 skrll /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
1301 1.1 skrll It must be used for multigot GOT's (and only there). */
1302 1.1 skrll HOWTO (R_MIPS_RELGOT, /* type */
1303 1.1 skrll 0, /* rightshift */
1304 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1305 1.1 skrll 32, /* bitsize */
1306 1.1 skrll FALSE, /* pc_relative */
1307 1.1 skrll 0, /* bitpos */
1308 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1309 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1310 1.1 skrll "R_MIPS_RELGOT", /* name */
1311 1.1 skrll FALSE, /* partial_inplace */
1312 1.1 skrll 0, /* src_mask */
1313 1.1 skrll 0xffffffff, /* dst_mask */
1314 1.1 skrll FALSE), /* pcrel_offset */
1315 1.1 skrll
1316 1.1 skrll /* Protected jump conversion. This is an optimization hint. No
1317 1.1 skrll relocation is required for correctness. */
1318 1.1 skrll HOWTO (R_MIPS_JALR, /* type */
1319 1.1 skrll 0, /* rightshift */
1320 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
1321 1.1 skrll 32, /* bitsize */
1322 1.1 skrll FALSE, /* pc_relative */
1323 1.1 skrll 0, /* bitpos */
1324 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1325 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1326 1.1 skrll "R_MIPS_JALR", /* name */
1327 1.1 skrll FALSE, /* partial_inplace */
1328 1.1 skrll 0, /* src_mask */
1329 1.1 skrll 0x00000000, /* dst_mask */
1330 1.1 skrll FALSE), /* pcrel_offset */
1331 1.1 skrll
1332 1.1 skrll /* TLS relocations. */
1333 1.1 skrll EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
1334 1.3 christos EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
1335 1.3 christos
1336 1.3 christos HOWTO (R_MIPS_TLS_DTPMOD64, /* type */
1337 1.3 christos 0, /* rightshift */
1338 1.3 christos 4, /* size (0 = byte, 1 = short, 2 = long) */
1339 1.3 christos 64, /* bitsize */
1340 1.3 christos FALSE, /* pc_relative */
1341 1.3 christos 0, /* bitpos */
1342 1.3 christos complain_overflow_dont, /* complain_on_overflow */
1343 1.3 christos _bfd_mips_elf_generic_reloc, /* special_function */
1344 1.3 christos "R_MIPS_TLS_DTPMOD64", /* name */
1345 1.4 christos FALSE, /* partial_inplace */
1346 1.3 christos 0, /* src_mask */
1347 1.3 christos MINUS_ONE, /* dst_mask */
1348 1.1 skrll FALSE), /* pcrel_offset */
1349 1.1 skrll
1350 1.1 skrll HOWTO (R_MIPS_TLS_DTPREL64, /* type */
1351 1.1 skrll 0, /* rightshift */
1352 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
1353 1.1 skrll 64, /* bitsize */
1354 1.1 skrll FALSE, /* pc_relative */
1355 1.1 skrll 0, /* bitpos */
1356 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
1357 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
1358 1.3 christos "R_MIPS_TLS_DTPREL64", /* name */
1359 1.4 christos FALSE, /* partial_inplace */
1360 1.1 skrll 0, /* src_mask */
1361 1.1 skrll MINUS_ONE, /* dst_mask */
1362 1.1 skrll FALSE), /* pcrel_offset */
1363 1.1 skrll
1364 1.1 skrll /* TLS general dynamic variable reference. */
1365 1.4 christos HOWTO (R_MIPS_TLS_GD, /* type */
1366 1.4 christos 0, /* rightshift */
1367 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1368 1.4 christos 16, /* bitsize */
1369 1.4 christos FALSE, /* pc_relative */
1370 1.4 christos 0, /* bitpos */
1371 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1372 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1373 1.4 christos "R_MIPS_TLS_GD", /* name */
1374 1.4 christos FALSE, /* partial_inplace */
1375 1.4 christos 0, /* src_mask */
1376 1.4 christos 0x0000ffff, /* dst_mask */
1377 1.4 christos FALSE), /* pcrel_offset */
1378 1.4 christos
1379 1.4 christos /* TLS local dynamic variable reference. */
1380 1.4 christos HOWTO (R_MIPS_TLS_LDM, /* type */
1381 1.4 christos 0, /* rightshift */
1382 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1383 1.4 christos 16, /* bitsize */
1384 1.4 christos FALSE, /* pc_relative */
1385 1.4 christos 0, /* bitpos */
1386 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1387 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1388 1.4 christos "R_MIPS_TLS_LDM", /* name */
1389 1.4 christos FALSE, /* partial_inplace */
1390 1.4 christos 0, /* src_mask */
1391 1.4 christos 0x0000ffff, /* dst_mask */
1392 1.4 christos FALSE), /* pcrel_offset */
1393 1.4 christos
1394 1.4 christos /* TLS local dynamic offset. */
1395 1.4 christos HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
1396 1.4 christos 0, /* rightshift */
1397 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1398 1.4 christos 16, /* bitsize */
1399 1.4 christos FALSE, /* pc_relative */
1400 1.4 christos 0, /* bitpos */
1401 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1402 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1403 1.4 christos "R_MIPS_TLS_DTPREL_HI16", /* name */
1404 1.4 christos FALSE, /* partial_inplace */
1405 1.4 christos 0, /* src_mask */
1406 1.4 christos 0x0000ffff, /* dst_mask */
1407 1.4 christos FALSE), /* pcrel_offset */
1408 1.4 christos
1409 1.4 christos /* TLS local dynamic offset. */
1410 1.4 christos HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
1411 1.4 christos 0, /* rightshift */
1412 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1413 1.4 christos 16, /* bitsize */
1414 1.4 christos FALSE, /* pc_relative */
1415 1.4 christos 0, /* bitpos */
1416 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1417 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1418 1.4 christos "R_MIPS_TLS_DTPREL_LO16", /* name */
1419 1.4 christos FALSE, /* partial_inplace */
1420 1.4 christos 0, /* src_mask */
1421 1.4 christos 0x0000ffff, /* dst_mask */
1422 1.4 christos FALSE), /* pcrel_offset */
1423 1.4 christos
1424 1.4 christos /* TLS thread pointer offset. */
1425 1.4 christos HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
1426 1.4 christos 0, /* rightshift */
1427 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1428 1.4 christos 16, /* bitsize */
1429 1.4 christos FALSE, /* pc_relative */
1430 1.4 christos 0, /* bitpos */
1431 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1432 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1433 1.4 christos "R_MIPS_TLS_GOTTPREL", /* name */
1434 1.4 christos FALSE, /* partial_inplace */
1435 1.4 christos 0, /* src_mask */
1436 1.4 christos 0x0000ffff, /* dst_mask */
1437 1.4 christos FALSE), /* pcrel_offset */
1438 1.4 christos
1439 1.4 christos /* TLS IE dynamic relocations. */
1440 1.4 christos EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
1441 1.4 christos
1442 1.4 christos HOWTO (R_MIPS_TLS_TPREL64, /* type */
1443 1.4 christos 0, /* rightshift */
1444 1.4 christos 4, /* size (0 = byte, 1 = short, 2 = long) */
1445 1.4 christos 64, /* bitsize */
1446 1.4 christos FALSE, /* pc_relative */
1447 1.4 christos 0, /* bitpos */
1448 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1449 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1450 1.4 christos "R_MIPS_TLS_TPREL64", /* name */
1451 1.4 christos FALSE, /* partial_inplace */
1452 1.4 christos 0, /* src_mask */
1453 1.4 christos MINUS_ONE, /* dst_mask */
1454 1.4 christos FALSE), /* pcrel_offset */
1455 1.4 christos
1456 1.4 christos /* TLS thread pointer offset. */
1457 1.4 christos HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
1458 1.4 christos 0, /* rightshift */
1459 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1460 1.4 christos 16, /* bitsize */
1461 1.4 christos FALSE, /* pc_relative */
1462 1.4 christos 0, /* bitpos */
1463 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1464 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1465 1.4 christos "R_MIPS_TLS_TPREL_HI16", /* name */
1466 1.4 christos FALSE, /* partial_inplace */
1467 1.4 christos 0, /* src_mask */
1468 1.4 christos 0x0000ffff, /* dst_mask */
1469 1.4 christos FALSE), /* pcrel_offset */
1470 1.4 christos
1471 1.4 christos /* TLS thread pointer offset. */
1472 1.4 christos HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
1473 1.4 christos 0, /* rightshift */
1474 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1475 1.4 christos 16, /* bitsize */
1476 1.4 christos FALSE, /* pc_relative */
1477 1.4 christos 0, /* bitpos */
1478 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1479 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1480 1.4 christos "R_MIPS_TLS_TPREL_LO16", /* name */
1481 1.4 christos FALSE, /* partial_inplace */
1482 1.4 christos 0, /* src_mask */
1483 1.4 christos 0x0000ffff, /* dst_mask */
1484 1.4 christos FALSE), /* pcrel_offset */
1485 1.4 christos
1486 1.4 christos /* 32 bit relocation with no addend. */
1487 1.4 christos HOWTO (R_MIPS_GLOB_DAT, /* type */
1488 1.4 christos 0, /* rightshift */
1489 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1490 1.4 christos 32, /* bitsize */
1491 1.4 christos FALSE, /* pc_relative */
1492 1.4 christos 0, /* bitpos */
1493 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1494 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1495 1.4 christos "R_MIPS_GLOB_DAT", /* name */
1496 1.4 christos FALSE, /* partial_inplace */
1497 1.4 christos 0x0, /* src_mask */
1498 1.4 christos 0xffffffff, /* dst_mask */
1499 1.4 christos FALSE), /* pcrel_offset */
1500 1.4 christos };
1501 1.4 christos
1502 1.4 christos static reloc_howto_type mips16_elf64_howto_table_rel[] =
1503 1.4 christos {
1504 1.4 christos /* The reloc used for the mips16 jump instruction. */
1505 1.4 christos HOWTO (R_MIPS16_26, /* type */
1506 1.4 christos 2, /* rightshift */
1507 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1508 1.4 christos 26, /* bitsize */
1509 1.4 christos FALSE, /* pc_relative */
1510 1.4 christos 0, /* bitpos */
1511 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1512 1.4 christos /* This needs complex overflow
1513 1.4 christos detection, because the upper four
1514 1.4 christos bits must match the PC. */
1515 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1516 1.4 christos "R_MIPS16_26", /* name */
1517 1.4 christos TRUE, /* partial_inplace */
1518 1.4 christos 0x3ffffff, /* src_mask */
1519 1.4 christos 0x3ffffff, /* dst_mask */
1520 1.4 christos FALSE), /* pcrel_offset */
1521 1.4 christos
1522 1.4 christos /* The reloc used for the mips16 gprel instruction. */
1523 1.4 christos HOWTO (R_MIPS16_GPREL, /* type */
1524 1.4 christos 0, /* rightshift */
1525 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1526 1.4 christos 16, /* bitsize */
1527 1.4 christos FALSE, /* pc_relative */
1528 1.4 christos 0, /* bitpos */
1529 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1530 1.4 christos mips16_gprel_reloc, /* special_function */
1531 1.4 christos "R_MIPS16_GPREL", /* name */
1532 1.4 christos TRUE, /* partial_inplace */
1533 1.4 christos 0x0000ffff, /* src_mask */
1534 1.4 christos 0x0000ffff, /* dst_mask */
1535 1.4 christos FALSE), /* pcrel_offset */
1536 1.4 christos
1537 1.4 christos /* A MIPS16 reference to the global offset table. */
1538 1.4 christos HOWTO (R_MIPS16_GOT16, /* type */
1539 1.4 christos 0, /* rightshift */
1540 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1541 1.4 christos 16, /* bitsize */
1542 1.4 christos FALSE, /* pc_relative */
1543 1.4 christos 0, /* bitpos */
1544 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1545 1.4 christos _bfd_mips_elf_got16_reloc, /* special_function */
1546 1.4 christos "R_MIPS16_GOT16", /* name */
1547 1.4 christos TRUE, /* partial_inplace */
1548 1.4 christos 0x0000ffff, /* src_mask */
1549 1.4 christos 0x0000ffff, /* dst_mask */
1550 1.4 christos FALSE), /* pcrel_offset */
1551 1.4 christos
1552 1.4 christos /* A MIPS16 call through the global offset table. */
1553 1.4 christos HOWTO (R_MIPS16_CALL16, /* type */
1554 1.4 christos 0, /* rightshift */
1555 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1556 1.4 christos 16, /* bitsize */
1557 1.4 christos FALSE, /* pc_relative */
1558 1.4 christos 0, /* bitpos */
1559 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1560 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1561 1.4 christos "R_MIPS16_CALL16", /* name */
1562 1.4 christos TRUE, /* partial_inplace */
1563 1.4 christos 0x0000ffff, /* src_mask */
1564 1.4 christos 0x0000ffff, /* dst_mask */
1565 1.4 christos FALSE), /* pcrel_offset */
1566 1.4 christos
1567 1.4 christos /* MIPS16 high 16 bits of symbol value. */
1568 1.4 christos HOWTO (R_MIPS16_HI16, /* type */
1569 1.4 christos 16, /* rightshift */
1570 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1571 1.4 christos 16, /* bitsize */
1572 1.4 christos FALSE, /* pc_relative */
1573 1.4 christos 0, /* bitpos */
1574 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1575 1.4 christos _bfd_mips_elf_hi16_reloc, /* special_function */
1576 1.4 christos "R_MIPS16_HI16", /* name */
1577 1.4 christos TRUE, /* partial_inplace */
1578 1.4 christos 0x0000ffff, /* src_mask */
1579 1.4 christos 0x0000ffff, /* dst_mask */
1580 1.4 christos FALSE), /* pcrel_offset */
1581 1.4 christos
1582 1.4 christos /* MIPS16 low 16 bits of symbol value. */
1583 1.4 christos HOWTO (R_MIPS16_LO16, /* type */
1584 1.4 christos 0, /* rightshift */
1585 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1586 1.4 christos 16, /* bitsize */
1587 1.4 christos FALSE, /* pc_relative */
1588 1.4 christos 0, /* bitpos */
1589 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1590 1.4 christos _bfd_mips_elf_lo16_reloc, /* special_function */
1591 1.4 christos "R_MIPS16_LO16", /* name */
1592 1.4 christos TRUE, /* partial_inplace */
1593 1.4 christos 0x0000ffff, /* src_mask */
1594 1.4 christos 0x0000ffff, /* dst_mask */
1595 1.4 christos FALSE), /* pcrel_offset */
1596 1.4 christos
1597 1.4 christos /* MIPS16 TLS general dynamic variable reference. */
1598 1.4 christos HOWTO (R_MIPS16_TLS_GD, /* type */
1599 1.4 christos 0, /* rightshift */
1600 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1601 1.4 christos 16, /* bitsize */
1602 1.4 christos FALSE, /* pc_relative */
1603 1.4 christos 0, /* bitpos */
1604 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1605 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1606 1.4 christos "R_MIPS16_TLS_GD", /* name */
1607 1.4 christos TRUE, /* partial_inplace */
1608 1.4 christos 0x0000ffff, /* src_mask */
1609 1.4 christos 0x0000ffff, /* dst_mask */
1610 1.4 christos FALSE), /* pcrel_offset */
1611 1.4 christos
1612 1.4 christos /* MIPS16 TLS local dynamic variable reference. */
1613 1.4 christos HOWTO (R_MIPS16_TLS_LDM, /* type */
1614 1.4 christos 0, /* rightshift */
1615 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1616 1.4 christos 16, /* bitsize */
1617 1.4 christos FALSE, /* pc_relative */
1618 1.4 christos 0, /* bitpos */
1619 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1620 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1621 1.4 christos "R_MIPS16_TLS_LDM", /* name */
1622 1.4 christos TRUE, /* partial_inplace */
1623 1.4 christos 0x0000ffff, /* src_mask */
1624 1.4 christos 0x0000ffff, /* dst_mask */
1625 1.4 christos FALSE), /* pcrel_offset */
1626 1.4 christos
1627 1.4 christos /* MIPS16 TLS local dynamic offset. */
1628 1.4 christos HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
1629 1.4 christos 0, /* rightshift */
1630 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1631 1.4 christos 16, /* bitsize */
1632 1.4 christos FALSE, /* pc_relative */
1633 1.4 christos 0, /* bitpos */
1634 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1635 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1636 1.4 christos "R_MIPS16_TLS_DTPREL_HI16", /* name */
1637 1.4 christos TRUE, /* partial_inplace */
1638 1.4 christos 0x0000ffff, /* src_mask */
1639 1.4 christos 0x0000ffff, /* dst_mask */
1640 1.4 christos FALSE), /* pcrel_offset */
1641 1.4 christos
1642 1.4 christos /* MIPS16 TLS local dynamic offset. */
1643 1.4 christos HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
1644 1.4 christos 0, /* rightshift */
1645 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1646 1.4 christos 16, /* bitsize */
1647 1.4 christos FALSE, /* pc_relative */
1648 1.4 christos 0, /* bitpos */
1649 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1650 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1651 1.4 christos "R_MIPS16_TLS_DTPREL_LO16", /* name */
1652 1.4 christos TRUE, /* partial_inplace */
1653 1.4 christos 0x0000ffff, /* src_mask */
1654 1.4 christos 0x0000ffff, /* dst_mask */
1655 1.4 christos FALSE), /* pcrel_offset */
1656 1.4 christos
1657 1.4 christos /* MIPS16 TLS thread pointer offset. */
1658 1.4 christos HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
1659 1.4 christos 0, /* rightshift */
1660 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1661 1.4 christos 16, /* bitsize */
1662 1.4 christos FALSE, /* pc_relative */
1663 1.4 christos 0, /* bitpos */
1664 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1665 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1666 1.4 christos "R_MIPS16_TLS_GOTTPREL", /* name */
1667 1.4 christos TRUE, /* partial_inplace */
1668 1.4 christos 0x0000ffff, /* src_mask */
1669 1.4 christos 0x0000ffff, /* dst_mask */
1670 1.4 christos FALSE), /* pcrel_offset */
1671 1.4 christos
1672 1.4 christos /* MIPS16 TLS thread pointer offset. */
1673 1.4 christos HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
1674 1.4 christos 0, /* rightshift */
1675 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1676 1.4 christos 16, /* bitsize */
1677 1.4 christos FALSE, /* pc_relative */
1678 1.4 christos 0, /* bitpos */
1679 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1680 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1681 1.4 christos "R_MIPS16_TLS_TPREL_HI16", /* name */
1682 1.4 christos TRUE, /* partial_inplace */
1683 1.4 christos 0x0000ffff, /* src_mask */
1684 1.4 christos 0x0000ffff, /* dst_mask */
1685 1.4 christos FALSE), /* pcrel_offset */
1686 1.4 christos
1687 1.4 christos /* MIPS16 TLS thread pointer offset. */
1688 1.4 christos HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
1689 1.4 christos 0, /* rightshift */
1690 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1691 1.4 christos 16, /* bitsize */
1692 1.4 christos FALSE, /* pc_relative */
1693 1.4 christos 0, /* bitpos */
1694 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1695 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1696 1.4 christos "R_MIPS16_TLS_TPREL_LO16", /* name */
1697 1.4 christos TRUE, /* partial_inplace */
1698 1.4 christos 0x0000ffff, /* src_mask */
1699 1.4 christos 0x0000ffff, /* dst_mask */
1700 1.4 christos FALSE), /* pcrel_offset */
1701 1.4 christos };
1702 1.4 christos
1703 1.4 christos static reloc_howto_type mips16_elf64_howto_table_rela[] =
1704 1.4 christos {
1705 1.4 christos /* The reloc used for the mips16 jump instruction. */
1706 1.4 christos HOWTO (R_MIPS16_26, /* type */
1707 1.4 christos 2, /* rightshift */
1708 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1709 1.4 christos 26, /* bitsize */
1710 1.4 christos FALSE, /* pc_relative */
1711 1.4 christos 0, /* bitpos */
1712 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1713 1.4 christos /* This needs complex overflow
1714 1.4 christos detection, because the upper four
1715 1.4 christos bits must match the PC. */
1716 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1717 1.4 christos "R_MIPS16_26", /* name */
1718 1.4 christos FALSE, /* partial_inplace */
1719 1.4 christos 0, /* src_mask */
1720 1.4 christos 0x3ffffff, /* dst_mask */
1721 1.4 christos FALSE), /* pcrel_offset */
1722 1.4 christos
1723 1.4 christos /* The reloc used for the mips16 gprel instruction. */
1724 1.4 christos HOWTO (R_MIPS16_GPREL, /* type */
1725 1.4 christos 0, /* rightshift */
1726 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1727 1.4 christos 16, /* bitsize */
1728 1.4 christos FALSE, /* pc_relative */
1729 1.4 christos 0, /* bitpos */
1730 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1731 1.4 christos mips16_gprel_reloc, /* special_function */
1732 1.4 christos "R_MIPS16_GPREL", /* name */
1733 1.4 christos FALSE, /* partial_inplace */
1734 1.4 christos 0, /* src_mask */
1735 1.4 christos 0x0000ffff, /* dst_mask */
1736 1.4 christos FALSE), /* pcrel_offset */
1737 1.4 christos
1738 1.4 christos /* A MIPS16 reference to the global offset table. */
1739 1.4 christos HOWTO (R_MIPS16_GOT16, /* type */
1740 1.4 christos 0, /* rightshift */
1741 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1742 1.4 christos 16, /* bitsize */
1743 1.4 christos FALSE, /* pc_relative */
1744 1.4 christos 0, /* bitpos */
1745 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1746 1.4 christos _bfd_mips_elf_got16_reloc, /* special_function */
1747 1.4 christos "R_MIPS16_GOT16", /* name */
1748 1.4 christos FALSE, /* partial_inplace */
1749 1.4 christos 0, /* src_mask */
1750 1.4 christos 0x0000ffff, /* dst_mask */
1751 1.4 christos FALSE), /* pcrel_offset */
1752 1.4 christos
1753 1.4 christos /* A MIPS16 call through the global offset table. */
1754 1.4 christos HOWTO (R_MIPS16_CALL16, /* type */
1755 1.4 christos 0, /* rightshift */
1756 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1757 1.4 christos 16, /* bitsize */
1758 1.4 christos FALSE, /* pc_relative */
1759 1.4 christos 0, /* bitpos */
1760 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1761 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1762 1.4 christos "R_MIPS16_CALL16", /* name */
1763 1.4 christos FALSE, /* partial_inplace */
1764 1.4 christos 0, /* src_mask */
1765 1.4 christos 0x0000ffff, /* dst_mask */
1766 1.4 christos FALSE), /* pcrel_offset */
1767 1.4 christos
1768 1.4 christos /* MIPS16 high 16 bits of symbol value. */
1769 1.4 christos HOWTO (R_MIPS16_HI16, /* type */
1770 1.4 christos 16, /* rightshift */
1771 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1772 1.4 christos 16, /* bitsize */
1773 1.4 christos FALSE, /* pc_relative */
1774 1.4 christos 0, /* bitpos */
1775 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1776 1.4 christos _bfd_mips_elf_hi16_reloc, /* special_function */
1777 1.4 christos "R_MIPS16_HI16", /* name */
1778 1.4 christos FALSE, /* partial_inplace */
1779 1.4 christos 0, /* src_mask */
1780 1.4 christos 0x0000ffff, /* dst_mask */
1781 1.4 christos FALSE), /* pcrel_offset */
1782 1.4 christos
1783 1.4 christos /* MIPS16 low 16 bits of symbol value. */
1784 1.4 christos HOWTO (R_MIPS16_LO16, /* type */
1785 1.4 christos 0, /* rightshift */
1786 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1787 1.4 christos 16, /* bitsize */
1788 1.4 christos FALSE, /* pc_relative */
1789 1.4 christos 0, /* bitpos */
1790 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1791 1.4 christos _bfd_mips_elf_lo16_reloc, /* special_function */
1792 1.4 christos "R_MIPS16_LO16", /* name */
1793 1.4 christos FALSE, /* partial_inplace */
1794 1.4 christos 0, /* src_mask */
1795 1.4 christos 0x0000ffff, /* dst_mask */
1796 1.4 christos FALSE), /* pcrel_offset */
1797 1.4 christos
1798 1.4 christos /* MIPS16 TLS general dynamic variable reference. */
1799 1.4 christos HOWTO (R_MIPS16_TLS_GD, /* type */
1800 1.4 christos 0, /* rightshift */
1801 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1802 1.4 christos 16, /* bitsize */
1803 1.4 christos FALSE, /* pc_relative */
1804 1.4 christos 0, /* bitpos */
1805 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1806 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1807 1.4 christos "R_MIPS16_TLS_GD", /* name */
1808 1.4 christos FALSE, /* partial_inplace */
1809 1.4 christos 0, /* src_mask */
1810 1.4 christos 0x0000ffff, /* dst_mask */
1811 1.4 christos FALSE), /* pcrel_offset */
1812 1.4 christos
1813 1.4 christos /* MIPS16 TLS local dynamic variable reference. */
1814 1.4 christos HOWTO (R_MIPS16_TLS_LDM, /* type */
1815 1.4 christos 0, /* rightshift */
1816 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1817 1.4 christos 16, /* bitsize */
1818 1.4 christos FALSE, /* pc_relative */
1819 1.4 christos 0, /* bitpos */
1820 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1821 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1822 1.4 christos "R_MIPS16_TLS_LDM", /* name */
1823 1.4 christos FALSE, /* partial_inplace */
1824 1.4 christos 0, /* src_mask */
1825 1.4 christos 0x0000ffff, /* dst_mask */
1826 1.4 christos FALSE), /* pcrel_offset */
1827 1.4 christos
1828 1.4 christos /* MIPS16 TLS local dynamic offset. */
1829 1.4 christos HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
1830 1.4 christos 0, /* rightshift */
1831 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1832 1.4 christos 16, /* bitsize */
1833 1.4 christos FALSE, /* pc_relative */
1834 1.4 christos 0, /* bitpos */
1835 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1836 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1837 1.4 christos "R_MIPS16_TLS_DTPREL_HI16", /* name */
1838 1.4 christos FALSE, /* partial_inplace */
1839 1.4 christos 0, /* src_mask */
1840 1.4 christos 0x0000ffff, /* dst_mask */
1841 1.4 christos FALSE), /* pcrel_offset */
1842 1.4 christos
1843 1.4 christos /* MIPS16 TLS local dynamic offset. */
1844 1.4 christos HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
1845 1.4 christos 0, /* rightshift */
1846 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1847 1.4 christos 16, /* bitsize */
1848 1.4 christos FALSE, /* pc_relative */
1849 1.4 christos 0, /* bitpos */
1850 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1851 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1852 1.4 christos "R_MIPS16_TLS_DTPREL_LO16", /* name */
1853 1.4 christos FALSE, /* partial_inplace */
1854 1.4 christos 0, /* src_mask */
1855 1.4 christos 0x0000ffff, /* dst_mask */
1856 1.4 christos FALSE), /* pcrel_offset */
1857 1.4 christos
1858 1.4 christos /* MIPS16 TLS thread pointer offset. */
1859 1.4 christos HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
1860 1.4 christos 0, /* rightshift */
1861 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1862 1.4 christos 16, /* bitsize */
1863 1.4 christos FALSE, /* pc_relative */
1864 1.4 christos 0, /* bitpos */
1865 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1866 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1867 1.4 christos "R_MIPS16_TLS_GOTTPREL", /* name */
1868 1.4 christos FALSE, /* partial_inplace */
1869 1.4 christos 0, /* src_mask */
1870 1.4 christos 0x0000ffff, /* dst_mask */
1871 1.4 christos FALSE), /* pcrel_offset */
1872 1.4 christos
1873 1.4 christos /* MIPS16 TLS thread pointer offset. */
1874 1.4 christos HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
1875 1.4 christos 0, /* rightshift */
1876 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1877 1.4 christos 16, /* bitsize */
1878 1.4 christos FALSE, /* pc_relative */
1879 1.4 christos 0, /* bitpos */
1880 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1881 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1882 1.4 christos "R_MIPS16_TLS_TPREL_HI16", /* name */
1883 1.4 christos FALSE, /* partial_inplace */
1884 1.4 christos 0, /* src_mask */
1885 1.4 christos 0x0000ffff, /* dst_mask */
1886 1.4 christos FALSE), /* pcrel_offset */
1887 1.4 christos
1888 1.4 christos /* MIPS16 TLS thread pointer offset. */
1889 1.4 christos HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
1890 1.4 christos 0, /* rightshift */
1891 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1892 1.4 christos 16, /* bitsize */
1893 1.4 christos FALSE, /* pc_relative */
1894 1.4 christos 0, /* bitpos */
1895 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1896 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1897 1.4 christos "R_MIPS16_TLS_TPREL_LO16", /* name */
1898 1.4 christos FALSE, /* partial_inplace */
1899 1.4 christos 0, /* src_mask */
1900 1.4 christos 0x0000ffff, /* dst_mask */
1901 1.4 christos FALSE), /* pcrel_offset */
1902 1.4 christos };
1903 1.4 christos
1904 1.4 christos static reloc_howto_type micromips_elf64_howto_table_rel[] =
1905 1.4 christos {
1906 1.4 christos EMPTY_HOWTO (130),
1907 1.4 christos EMPTY_HOWTO (131),
1908 1.4 christos EMPTY_HOWTO (132),
1909 1.4 christos
1910 1.4 christos /* 26 bit jump address. */
1911 1.4 christos HOWTO (R_MICROMIPS_26_S1, /* type */
1912 1.4 christos 1, /* rightshift */
1913 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1914 1.4 christos 26, /* bitsize */
1915 1.4 christos FALSE, /* pc_relative */
1916 1.4 christos 0, /* bitpos */
1917 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1918 1.4 christos /* This needs complex overflow
1919 1.4 christos detection, because the upper four
1920 1.4 christos bits must match the PC. */
1921 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
1922 1.4 christos "R_MICROMIPS_26_S1", /* name */
1923 1.4 christos TRUE, /* partial_inplace */
1924 1.4 christos 0x3ffffff, /* src_mask */
1925 1.4 christos 0x3ffffff, /* dst_mask */
1926 1.4 christos FALSE), /* pcrel_offset */
1927 1.4 christos
1928 1.4 christos /* High 16 bits of symbol value. */
1929 1.4 christos HOWTO (R_MICROMIPS_HI16, /* type */
1930 1.4 christos 16, /* rightshift */
1931 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1932 1.4 christos 16, /* bitsize */
1933 1.4 christos FALSE, /* pc_relative */
1934 1.4 christos 0, /* bitpos */
1935 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1936 1.4 christos _bfd_mips_elf_hi16_reloc, /* special_function */
1937 1.4 christos "R_MICROMIPS_HI16", /* name */
1938 1.4 christos TRUE, /* partial_inplace */
1939 1.4 christos 0x0000ffff, /* src_mask */
1940 1.4 christos 0x0000ffff, /* dst_mask */
1941 1.4 christos FALSE), /* pcrel_offset */
1942 1.4 christos
1943 1.4 christos /* Low 16 bits of symbol value. */
1944 1.4 christos HOWTO (R_MICROMIPS_LO16, /* type */
1945 1.4 christos 0, /* rightshift */
1946 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1947 1.4 christos 16, /* bitsize */
1948 1.4 christos FALSE, /* pc_relative */
1949 1.4 christos 0, /* bitpos */
1950 1.4 christos complain_overflow_dont, /* complain_on_overflow */
1951 1.4 christos _bfd_mips_elf_lo16_reloc, /* special_function */
1952 1.4 christos "R_MICROMIPS_LO16", /* name */
1953 1.4 christos TRUE, /* partial_inplace */
1954 1.4 christos 0x0000ffff, /* src_mask */
1955 1.4 christos 0x0000ffff, /* dst_mask */
1956 1.4 christos FALSE), /* pcrel_offset */
1957 1.4 christos
1958 1.4 christos /* GP relative reference. */
1959 1.4 christos HOWTO (R_MICROMIPS_GPREL16, /* type */
1960 1.4 christos 0, /* rightshift */
1961 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1962 1.4 christos 16, /* bitsize */
1963 1.4 christos FALSE, /* pc_relative */
1964 1.4 christos 0, /* bitpos */
1965 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1966 1.4 christos _bfd_mips_elf32_gprel16_reloc, /* special_function */
1967 1.4 christos "R_MICROMIPS_GPREL16", /* name */
1968 1.4 christos TRUE, /* partial_inplace */
1969 1.4 christos 0x0000ffff, /* src_mask */
1970 1.4 christos 0x0000ffff, /* dst_mask */
1971 1.4 christos FALSE), /* pcrel_offset */
1972 1.4 christos
1973 1.4 christos /* Reference to literal section. */
1974 1.4 christos HOWTO (R_MICROMIPS_LITERAL, /* type */
1975 1.4 christos 0, /* rightshift */
1976 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1977 1.4 christos 16, /* bitsize */
1978 1.4 christos FALSE, /* pc_relative */
1979 1.4 christos 0, /* bitpos */
1980 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1981 1.4 christos _bfd_mips_elf32_gprel16_reloc, /* special_function */
1982 1.4 christos "R_MICROMIPS_LITERAL", /* name */
1983 1.4 christos TRUE, /* partial_inplace */
1984 1.4 christos 0x0000ffff, /* src_mask */
1985 1.4 christos 0x0000ffff, /* dst_mask */
1986 1.4 christos FALSE), /* pcrel_offset */
1987 1.4 christos
1988 1.4 christos /* Reference to global offset table. */
1989 1.4 christos HOWTO (R_MICROMIPS_GOT16, /* type */
1990 1.4 christos 0, /* rightshift */
1991 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
1992 1.4 christos 16, /* bitsize */
1993 1.4 christos FALSE, /* pc_relative */
1994 1.4 christos 0, /* bitpos */
1995 1.4 christos complain_overflow_signed, /* complain_on_overflow */
1996 1.4 christos _bfd_mips_elf_got16_reloc, /* special_function */
1997 1.4 christos "R_MICROMIPS_GOT16", /* name */
1998 1.4 christos TRUE, /* partial_inplace */
1999 1.4 christos 0x0000ffff, /* src_mask */
2000 1.4 christos 0x0000ffff, /* dst_mask */
2001 1.4 christos FALSE), /* pcrel_offset */
2002 1.4 christos
2003 1.4 christos /* This is for microMIPS branches. */
2004 1.4 christos HOWTO (R_MICROMIPS_PC7_S1, /* type */
2005 1.4 christos 1, /* rightshift */
2006 1.4 christos 1, /* size (0 = byte, 1 = short, 2 = long) */
2007 1.4 christos 7, /* bitsize */
2008 1.4 christos TRUE, /* pc_relative */
2009 1.4 christos 0, /* bitpos */
2010 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2011 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2012 1.4 christos "R_MICROMIPS_PC7_S1", /* name */
2013 1.4 christos TRUE, /* partial_inplace */
2014 1.4 christos 0x0000007f, /* src_mask */
2015 1.4 christos 0x0000007f, /* dst_mask */
2016 1.4 christos TRUE), /* pcrel_offset */
2017 1.4 christos
2018 1.4 christos HOWTO (R_MICROMIPS_PC10_S1, /* type */
2019 1.4 christos 1, /* rightshift */
2020 1.4 christos 1, /* size (0 = byte, 1 = short, 2 = long) */
2021 1.4 christos 10, /* bitsize */
2022 1.4 christos TRUE, /* pc_relative */
2023 1.4 christos 0, /* bitpos */
2024 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2025 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2026 1.4 christos "R_MICROMIPS_PC10_S1", /* name */
2027 1.4 christos TRUE, /* partial_inplace */
2028 1.4 christos 0x000003ff, /* src_mask */
2029 1.4 christos 0x000003ff, /* dst_mask */
2030 1.4 christos TRUE), /* pcrel_offset */
2031 1.4 christos
2032 1.4 christos HOWTO (R_MICROMIPS_PC16_S1, /* type */
2033 1.4 christos 1, /* rightshift */
2034 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2035 1.4 christos 16, /* bitsize */
2036 1.4 christos TRUE, /* pc_relative */
2037 1.4 christos 0, /* bitpos */
2038 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2039 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2040 1.4 christos "R_MICROMIPS_PC16_S1", /* name */
2041 1.4 christos TRUE, /* partial_inplace */
2042 1.4 christos 0x0000ffff, /* src_mask */
2043 1.4 christos 0x0000ffff, /* dst_mask */
2044 1.4 christos TRUE), /* pcrel_offset */
2045 1.4 christos
2046 1.4 christos /* 16 bit call through global offset table. */
2047 1.4 christos HOWTO (R_MICROMIPS_CALL16, /* type */
2048 1.4 christos 0, /* rightshift */
2049 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2050 1.4 christos 16, /* bitsize */
2051 1.4 christos FALSE, /* pc_relative */
2052 1.4 christos 0, /* bitpos */
2053 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2054 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2055 1.4 christos "R_MICROMIPS_CALL16", /* name */
2056 1.4 christos TRUE, /* partial_inplace */
2057 1.4 christos 0x0000ffff, /* src_mask */
2058 1.4 christos 0x0000ffff, /* dst_mask */
2059 1.4 christos FALSE), /* pcrel_offset */
2060 1.4 christos
2061 1.4 christos EMPTY_HOWTO (143),
2062 1.4 christos EMPTY_HOWTO (144),
2063 1.4 christos
2064 1.4 christos /* Displacement in the global offset table. */
2065 1.4 christos HOWTO (R_MICROMIPS_GOT_DISP, /* type */
2066 1.4 christos 0, /* rightshift */
2067 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2068 1.4 christos 16, /* bitsize */
2069 1.4 christos FALSE, /* pc_relative */
2070 1.4 christos 0, /* bitpos */
2071 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2072 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2073 1.4 christos "R_MICROMIPS_GOT_DISP",/* name */
2074 1.4 christos TRUE, /* partial_inplace */
2075 1.4 christos 0x0000ffff, /* src_mask */
2076 1.4 christos 0x0000ffff, /* dst_mask */
2077 1.4 christos FALSE), /* pcrel_offset */
2078 1.4 christos
2079 1.4 christos /* Displacement to page pointer in the global offset table. */
2080 1.4 christos HOWTO (R_MICROMIPS_GOT_PAGE, /* type */
2081 1.4 christos 0, /* rightshift */
2082 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2083 1.4 christos 16, /* bitsize */
2084 1.4 christos FALSE, /* pc_relative */
2085 1.4 christos 0, /* bitpos */
2086 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2087 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2088 1.4 christos "R_MICROMIPS_GOT_PAGE",/* name */
2089 1.4 christos TRUE, /* partial_inplace */
2090 1.4 christos 0x0000ffff, /* src_mask */
2091 1.4 christos 0x0000ffff, /* dst_mask */
2092 1.4 christos FALSE), /* pcrel_offset */
2093 1.4 christos
2094 1.4 christos /* Offset from page pointer in the global offset table. */
2095 1.4 christos HOWTO (R_MICROMIPS_GOT_OFST, /* type */
2096 1.4 christos 0, /* rightshift */
2097 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2098 1.4 christos 16, /* bitsize */
2099 1.4 christos FALSE, /* pc_relative */
2100 1.4 christos 0, /* bitpos */
2101 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2102 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2103 1.4 christos "R_MICROMIPS_GOT_OFST",/* name */
2104 1.4 christos TRUE, /* partial_inplace */
2105 1.4 christos 0x0000ffff, /* src_mask */
2106 1.4 christos 0x0000ffff, /* dst_mask */
2107 1.4 christos FALSE), /* pcrel_offset */
2108 1.4 christos
2109 1.4 christos /* High 16 bits of displacement in global offset table. */
2110 1.4 christos HOWTO (R_MICROMIPS_GOT_HI16, /* type */
2111 1.4 christos 0, /* rightshift */
2112 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2113 1.4 christos 16, /* bitsize */
2114 1.4 christos FALSE, /* pc_relative */
2115 1.4 christos 0, /* bitpos */
2116 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2117 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2118 1.4 christos "R_MICROMIPS_GOT_HI16",/* name */
2119 1.4 christos TRUE, /* partial_inplace */
2120 1.4 christos 0x0000ffff, /* src_mask */
2121 1.4 christos 0x0000ffff, /* dst_mask */
2122 1.4 christos FALSE), /* pcrel_offset */
2123 1.4 christos
2124 1.4 christos /* Low 16 bits of displacement in global offset table. */
2125 1.4 christos HOWTO (R_MICROMIPS_GOT_LO16, /* type */
2126 1.4 christos 0, /* rightshift */
2127 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2128 1.4 christos 16, /* bitsize */
2129 1.4 christos FALSE, /* pc_relative */
2130 1.4 christos 0, /* bitpos */
2131 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2132 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2133 1.4 christos "R_MICROMIPS_GOT_LO16",/* name */
2134 1.4 christos TRUE, /* partial_inplace */
2135 1.4 christos 0x0000ffff, /* src_mask */
2136 1.4 christos 0x0000ffff, /* dst_mask */
2137 1.4 christos FALSE), /* pcrel_offset */
2138 1.4 christos
2139 1.4 christos /* 64 bit subtraction. Used in the N32 ABI. */
2140 1.4 christos HOWTO (R_MICROMIPS_SUB, /* type */
2141 1.4 christos 0, /* rightshift */
2142 1.4 christos 4, /* size (0 = byte, 1 = short, 2 = long) */
2143 1.4 christos 64, /* bitsize */
2144 1.4 christos FALSE, /* pc_relative */
2145 1.4 christos 0, /* bitpos */
2146 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2147 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2148 1.4 christos "R_MICROMIPS_SUB", /* name */
2149 1.4 christos TRUE, /* partial_inplace */
2150 1.4 christos MINUS_ONE, /* src_mask */
2151 1.4 christos MINUS_ONE, /* dst_mask */
2152 1.4 christos FALSE), /* pcrel_offset */
2153 1.4 christos
2154 1.4 christos /* We don't support these for REL relocations, because it means building
2155 1.4 christos the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
2156 1.4 christos R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
2157 1.4 christos using fallable heuristics. */
2158 1.4 christos EMPTY_HOWTO (R_MICROMIPS_HIGHER),
2159 1.4 christos EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
2160 1.4 christos
2161 1.4 christos /* High 16 bits of displacement in global offset table. */
2162 1.4 christos HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2163 1.4 christos 0, /* rightshift */
2164 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2165 1.4 christos 16, /* bitsize */
2166 1.4 christos FALSE, /* pc_relative */
2167 1.4 christos 0, /* bitpos */
2168 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2169 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2170 1.4 christos "R_MICROMIPS_CALL_HI16",/* name */
2171 1.4 christos TRUE, /* partial_inplace */
2172 1.4 christos 0x0000ffff, /* src_mask */
2173 1.4 christos 0x0000ffff, /* dst_mask */
2174 1.4 christos FALSE), /* pcrel_offset */
2175 1.4 christos
2176 1.4 christos /* Low 16 bits of displacement in global offset table. */
2177 1.4 christos HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2178 1.4 christos 0, /* rightshift */
2179 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2180 1.4 christos 16, /* bitsize */
2181 1.4 christos FALSE, /* pc_relative */
2182 1.4 christos 0, /* bitpos */
2183 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2184 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2185 1.4 christos "R_MICROMIPS_CALL_LO16",/* name */
2186 1.4 christos TRUE, /* partial_inplace */
2187 1.4 christos 0x0000ffff, /* src_mask */
2188 1.4 christos 0x0000ffff, /* dst_mask */
2189 1.4 christos FALSE), /* pcrel_offset */
2190 1.4 christos };
2191 1.4 christos
2192 1.4 christos static reloc_howto_type micromips_elf64_howto_table_rela[] =
2193 1.4 christos {
2194 1.4 christos EMPTY_HOWTO (130),
2195 1.4 christos EMPTY_HOWTO (131),
2196 1.4 christos EMPTY_HOWTO (132),
2197 1.4 christos
2198 1.4 christos /* 26 bit jump address. */
2199 1.4 christos HOWTO (R_MICROMIPS_26_S1, /* type */
2200 1.4 christos 1, /* rightshift */
2201 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2202 1.4 christos 26, /* bitsize */
2203 1.4 christos FALSE, /* pc_relative */
2204 1.4 christos 0, /* bitpos */
2205 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2206 1.4 christos /* This needs complex overflow
2207 1.4 christos detection, because the upper four
2208 1.4 christos bits must match the PC. */
2209 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2210 1.4 christos "R_MICROMIPS_26_S1", /* name */
2211 1.4 christos FALSE, /* partial_inplace */
2212 1.4 christos 0, /* src_mask */
2213 1.4 christos 0x3ffffff, /* dst_mask */
2214 1.4 christos FALSE), /* pcrel_offset */
2215 1.4 christos
2216 1.4 christos /* High 16 bits of symbol value. */
2217 1.4 christos HOWTO (R_MICROMIPS_HI16, /* type */
2218 1.1 skrll 16, /* rightshift */
2219 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2220 1.1 skrll 16, /* bitsize */
2221 1.1 skrll FALSE, /* pc_relative */
2222 1.4 christos 0, /* bitpos */
2223 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2224 1.4 christos _bfd_mips_elf_hi16_reloc, /* special_function */
2225 1.3 christos "R_MICROMIPS_HI16", /* name */
2226 1.4 christos FALSE, /* partial_inplace */
2227 1.1 skrll 0, /* src_mask */
2228 1.1 skrll 0x0000ffff, /* dst_mask */
2229 1.1 skrll FALSE), /* pcrel_offset */
2230 1.4 christos
2231 1.4 christos /* Low 16 bits of symbol value. */
2232 1.1 skrll HOWTO (R_MICROMIPS_LO16, /* type */
2233 1.1 skrll 0, /* rightshift */
2234 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2235 1.1 skrll 16, /* bitsize */
2236 1.1 skrll FALSE, /* pc_relative */
2237 1.4 christos 0, /* bitpos */
2238 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2239 1.4 christos _bfd_mips_elf_lo16_reloc, /* special_function */
2240 1.3 christos "R_MICROMIPS_LO16", /* name */
2241 1.4 christos FALSE, /* partial_inplace */
2242 1.1 skrll 0, /* src_mask */
2243 1.1 skrll 0x0000ffff, /* dst_mask */
2244 1.1 skrll FALSE), /* pcrel_offset */
2245 1.4 christos
2246 1.4 christos /* GP relative reference. */
2247 1.1 skrll HOWTO (R_MICROMIPS_GPREL16, /* type */
2248 1.1 skrll 0, /* rightshift */
2249 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2250 1.1 skrll 16, /* bitsize */
2251 1.1 skrll FALSE, /* pc_relative */
2252 1.1 skrll 0, /* bitpos */
2253 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2254 1.4 christos _bfd_mips_elf32_gprel16_reloc, /* special_function */
2255 1.3 christos "R_MICROMIPS_GPREL16", /* name */
2256 1.4 christos FALSE, /* partial_inplace */
2257 1.1 skrll 0, /* src_mask */
2258 1.1 skrll 0x0000ffff, /* dst_mask */
2259 1.1 skrll FALSE), /* pcrel_offset */
2260 1.4 christos
2261 1.4 christos /* Reference to literal section. */
2262 1.1 skrll HOWTO (R_MICROMIPS_LITERAL, /* type */
2263 1.1 skrll 0, /* rightshift */
2264 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2265 1.1 skrll 16, /* bitsize */
2266 1.1 skrll FALSE, /* pc_relative */
2267 1.1 skrll 0, /* bitpos */
2268 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2269 1.4 christos _bfd_mips_elf32_gprel16_reloc, /* special_function */
2270 1.3 christos "R_MICROMIPS_LITERAL", /* name */
2271 1.4 christos FALSE, /* partial_inplace */
2272 1.1 skrll 0, /* src_mask */
2273 1.1 skrll 0x0000ffff, /* dst_mask */
2274 1.1 skrll FALSE), /* pcrel_offset */
2275 1.4 christos
2276 1.4 christos /* Reference to global offset table. */
2277 1.1 skrll HOWTO (R_MICROMIPS_GOT16, /* type */
2278 1.1 skrll 0, /* rightshift */
2279 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2280 1.1 skrll 16, /* bitsize */
2281 1.1 skrll FALSE, /* pc_relative */
2282 1.1 skrll 0, /* bitpos */
2283 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2284 1.4 christos _bfd_mips_elf_got16_reloc, /* special_function */
2285 1.3 christos "R_MICROMIPS_GOT16", /* name */
2286 1.4 christos FALSE, /* partial_inplace */
2287 1.1 skrll 0, /* src_mask */
2288 1.1 skrll 0x0000ffff, /* dst_mask */
2289 1.1 skrll FALSE), /* pcrel_offset */
2290 1.4 christos
2291 1.4 christos /* This is for microMIPS branches. */
2292 1.4 christos HOWTO (R_MICROMIPS_PC7_S1, /* type */
2293 1.4 christos 1, /* rightshift */
2294 1.4 christos 1, /* size (0 = byte, 1 = short, 2 = long) */
2295 1.4 christos 7, /* bitsize */
2296 1.4 christos TRUE, /* pc_relative */
2297 1.4 christos 0, /* bitpos */
2298 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2299 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2300 1.4 christos "R_MICROMIPS_PC7_S1", /* name */
2301 1.4 christos FALSE, /* partial_inplace */
2302 1.4 christos 0, /* src_mask */
2303 1.4 christos 0x0000007f, /* dst_mask */
2304 1.3 christos TRUE), /* pcrel_offset */
2305 1.4 christos
2306 1.4 christos HOWTO (R_MICROMIPS_PC10_S1, /* type */
2307 1.4 christos 1, /* rightshift */
2308 1.4 christos 1, /* size (0 = byte, 1 = short, 2 = long) */
2309 1.4 christos 10, /* bitsize */
2310 1.3 christos TRUE, /* pc_relative */
2311 1.4 christos 0, /* bitpos */
2312 1.3 christos complain_overflow_signed, /* complain_on_overflow */
2313 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2314 1.3 christos "R_MICROMIPS_PC10_S1", /* name */
2315 1.4 christos FALSE, /* partial_inplace */
2316 1.4 christos 0, /* src_mask */
2317 1.4 christos 0x000003ff, /* dst_mask */
2318 1.1 skrll TRUE), /* pcrel_offset */
2319 1.4 christos
2320 1.4 christos HOWTO (R_MICROMIPS_PC16_S1, /* type */
2321 1.1 skrll 1, /* rightshift */
2322 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2323 1.4 christos 16, /* bitsize */
2324 1.1 skrll TRUE, /* pc_relative */
2325 1.1 skrll 0, /* bitpos */
2326 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
2327 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2328 1.3 christos "R_MICROMIPS_PC16_S1", /* name */
2329 1.4 christos FALSE, /* partial_inplace */
2330 1.1 skrll 0, /* src_mask */
2331 1.4 christos 0x0000ffff, /* dst_mask */
2332 1.1 skrll TRUE), /* pcrel_offset */
2333 1.4 christos
2334 1.4 christos /* 16 bit call through global offset table. */
2335 1.1 skrll HOWTO (R_MICROMIPS_CALL16, /* type */
2336 1.1 skrll 0, /* rightshift */
2337 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2338 1.1 skrll 16, /* bitsize */
2339 1.1 skrll FALSE, /* pc_relative */
2340 1.1 skrll 0, /* bitpos */
2341 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
2342 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2343 1.3 christos "R_MICROMIPS_CALL16", /* name */
2344 1.4 christos FALSE, /* partial_inplace */
2345 1.1 skrll 0, /* src_mask */
2346 1.1 skrll 0x0000ffff, /* dst_mask */
2347 1.1 skrll FALSE), /* pcrel_offset */
2348 1.4 christos
2349 1.4 christos EMPTY_HOWTO (143),
2350 1.4 christos EMPTY_HOWTO (144),
2351 1.4 christos
2352 1.4 christos /* Displacement in the global offset table. */
2353 1.1 skrll HOWTO (R_MICROMIPS_GOT_DISP, /* type */
2354 1.1 skrll 0, /* rightshift */
2355 1.4 christos 2, /* size (0 = byte, 1 = short, 2 = long) */
2356 1.1 skrll 16, /* bitsize */
2357 1.1 skrll FALSE, /* pc_relative */
2358 1.4 christos 0, /* bitpos */
2359 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
2360 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2361 1.1 skrll "R_MICROMIPS_GOT_DISP",/* name */
2362 1.4 christos FALSE, /* partial_inplace */
2363 1.4 christos 0, /* src_mask */
2364 1.1 skrll 0x0000ffff, /* dst_mask */
2365 1.1 skrll FALSE), /* pcrel_offset */
2366 1.4 christos
2367 1.4 christos /* Displacement to page pointer in the global offset table. */
2368 1.1 skrll HOWTO (R_MICROMIPS_GOT_PAGE, /* type */
2369 1.1 skrll 0, /* rightshift */
2370 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2371 1.1 skrll 16, /* bitsize */
2372 1.1 skrll FALSE, /* pc_relative */
2373 1.1 skrll 0, /* bitpos */
2374 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2375 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2376 1.4 christos "R_MICROMIPS_GOT_PAGE",/* name */
2377 1.4 christos FALSE, /* partial_inplace */
2378 1.4 christos 0, /* src_mask */
2379 1.1 skrll 0x0000ffff, /* dst_mask */
2380 1.1 skrll FALSE), /* pcrel_offset */
2381 1.4 christos
2382 1.4 christos /* Offset from page pointer in the global offset table. */
2383 1.1 skrll HOWTO (R_MICROMIPS_GOT_OFST, /* type */
2384 1.1 skrll 0, /* rightshift */
2385 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2386 1.1 skrll 16, /* bitsize */
2387 1.1 skrll FALSE, /* pc_relative */
2388 1.4 christos 0, /* bitpos */
2389 1.4 christos complain_overflow_signed, /* complain_on_overflow */
2390 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2391 1.4 christos "R_MICROMIPS_GOT_OFST",/* name */
2392 1.4 christos FALSE, /* partial_inplace */
2393 1.4 christos 0, /* src_mask */
2394 1.1 skrll 0x0000ffff, /* dst_mask */
2395 1.1 skrll FALSE), /* pcrel_offset */
2396 1.4 christos
2397 1.4 christos /* High 16 bits of displacement in global offset table. */
2398 1.1 skrll HOWTO (R_MICROMIPS_GOT_HI16, /* type */
2399 1.1 skrll 0, /* rightshift */
2400 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2401 1.1 skrll 16, /* bitsize */
2402 1.1 skrll FALSE, /* pc_relative */
2403 1.1 skrll 0, /* bitpos */
2404 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
2405 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2406 1.4 christos "R_MICROMIPS_GOT_HI16",/* name */
2407 1.4 christos FALSE, /* partial_inplace */
2408 1.1 skrll 0, /* src_mask */
2409 1.1 skrll 0x0000ffff, /* dst_mask */
2410 1.1 skrll FALSE), /* pcrel_offset */
2411 1.4 christos
2412 1.4 christos /* Low 16 bits of displacement in global offset table. */
2413 1.1 skrll HOWTO (R_MICROMIPS_GOT_LO16, /* type */
2414 1.1 skrll 0, /* rightshift */
2415 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2416 1.1 skrll 16, /* bitsize */
2417 1.1 skrll FALSE, /* pc_relative */
2418 1.1 skrll 0, /* bitpos */
2419 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2420 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2421 1.4 christos "R_MICROMIPS_GOT_LO16",/* name */
2422 1.4 christos FALSE, /* partial_inplace */
2423 1.1 skrll 0, /* src_mask */
2424 1.1 skrll 0x0000ffff, /* dst_mask */
2425 1.1 skrll FALSE), /* pcrel_offset */
2426 1.4 christos
2427 1.4 christos /* 64 bit subtraction. Used in the N32 ABI. */
2428 1.4 christos HOWTO (R_MICROMIPS_SUB, /* type */
2429 1.4 christos 0, /* rightshift */
2430 1.4 christos 4, /* size (0 = byte, 1 = short, 2 = long) */
2431 1.1 skrll 64, /* bitsize */
2432 1.1 skrll FALSE, /* pc_relative */
2433 1.1 skrll 0, /* bitpos */
2434 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
2435 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2436 1.1 skrll "R_MICROMIPS_SUB", /* name */
2437 1.4 christos FALSE, /* partial_inplace */
2438 1.4 christos 0, /* src_mask */
2439 1.1 skrll MINUS_ONE, /* dst_mask */
2440 1.1 skrll FALSE), /* pcrel_offset */
2441 1.4 christos
2442 1.4 christos /* Get the higher value of a 64 bit addend. */
2443 1.1 skrll HOWTO (R_MICROMIPS_HIGHER, /* type */
2444 1.1 skrll 0, /* rightshift */
2445 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2446 1.1 skrll 16, /* bitsize */
2447 1.1 skrll FALSE, /* pc_relative */
2448 1.4 christos 0, /* bitpos */
2449 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2450 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2451 1.1 skrll "R_MICROMIPS_HIGHER", /* name */
2452 1.4 christos FALSE, /* partial_inplace */
2453 1.4 christos 0, /* src_mask */
2454 1.1 skrll 0x0000ffff, /* dst_mask */
2455 1.1 skrll FALSE), /* pcrel_offset */
2456 1.4 christos
2457 1.4 christos /* Get the highest value of a 64 bit addend. */
2458 1.1 skrll HOWTO (R_MICROMIPS_HIGHEST, /* type */
2459 1.1 skrll 0, /* rightshift */
2460 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2461 1.1 skrll 16, /* bitsize */
2462 1.1 skrll FALSE, /* pc_relative */
2463 1.1 skrll 0, /* bitpos */
2464 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2465 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2466 1.1 skrll "R_MICROMIPS_HIGHEST", /* name */
2467 1.4 christos FALSE, /* partial_inplace */
2468 1.4 christos 0, /* src_mask */
2469 1.1 skrll 0x0000ffff, /* dst_mask */
2470 1.1 skrll FALSE), /* pcrel_offset */
2471 1.4 christos
2472 1.4 christos /* High 16 bits of displacement in global offset table. */
2473 1.1 skrll HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2474 1.1 skrll 0, /* rightshift */
2475 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2476 1.1 skrll 16, /* bitsize */
2477 1.1 skrll FALSE, /* pc_relative */
2478 1.1 skrll 0, /* bitpos */
2479 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
2480 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2481 1.1 skrll "R_MICROMIPS_CALL_HI16",/* name */
2482 1.4 christos FALSE, /* partial_inplace */
2483 1.1 skrll 0, /* src_mask */
2484 1.1 skrll 0x0000ffff, /* dst_mask */
2485 1.1 skrll FALSE), /* pcrel_offset */
2486 1.4 christos
2487 1.4 christos /* Low 16 bits of displacement in global offset table. */
2488 1.1 skrll HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2489 1.1 skrll 0, /* rightshift */
2490 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2491 1.1 skrll 16, /* bitsize */
2492 1.1 skrll FALSE, /* pc_relative */
2493 1.1 skrll 0, /* bitpos */
2494 1.4 christos complain_overflow_dont, /* complain_on_overflow */
2495 1.4 christos _bfd_mips_elf_generic_reloc, /* special_function */
2496 1.1 skrll "R_MICROMIPS_CALL_LO16",/* name */
2497 1.4 christos FALSE, /* partial_inplace */
2498 1.1 skrll 0, /* src_mask */
2499 1.1 skrll 0x0000ffff, /* dst_mask */
2500 1.1 skrll FALSE), /* pcrel_offset */
2501 1.1 skrll };
2502 1.1 skrll
2503 1.1 skrll /* GNU extension to record C++ vtable hierarchy */
2504 1.1 skrll static reloc_howto_type elf_mips_gnu_vtinherit_howto =
2505 1.1 skrll HOWTO (R_MIPS_GNU_VTINHERIT, /* type */
2506 1.1 skrll 0, /* rightshift */
2507 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2508 1.1 skrll 0, /* bitsize */
2509 1.1 skrll FALSE, /* pc_relative */
2510 1.1 skrll 0, /* bitpos */
2511 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
2512 1.1 skrll NULL, /* special_function */
2513 1.1 skrll "R_MIPS_GNU_VTINHERIT", /* name */
2514 1.1 skrll FALSE, /* partial_inplace */
2515 1.1 skrll 0, /* src_mask */
2516 1.1 skrll 0, /* dst_mask */
2517 1.1 skrll FALSE); /* pcrel_offset */
2518 1.1 skrll
2519 1.1 skrll /* GNU extension to record C++ vtable member usage */
2520 1.1 skrll static reloc_howto_type elf_mips_gnu_vtentry_howto =
2521 1.1 skrll HOWTO (R_MIPS_GNU_VTENTRY, /* type */
2522 1.1 skrll 0, /* rightshift */
2523 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2524 1.1 skrll 0, /* bitsize */
2525 1.1 skrll FALSE, /* pc_relative */
2526 1.1 skrll 0, /* bitpos */
2527 1.1 skrll complain_overflow_dont, /* complain_on_overflow */
2528 1.1 skrll _bfd_elf_rel_vtable_reloc_fn, /* special_function */
2529 1.1 skrll "R_MIPS_GNU_VTENTRY", /* name */
2530 1.1 skrll FALSE, /* partial_inplace */
2531 1.1 skrll 0, /* src_mask */
2532 1.1 skrll 0, /* dst_mask */
2533 1.1 skrll FALSE); /* pcrel_offset */
2534 1.1 skrll
2535 1.1 skrll /* 16 bit offset for pc-relative branches. */
2537 1.1 skrll static reloc_howto_type elf_mips_gnu_rel16_s2 =
2538 1.1 skrll HOWTO (R_MIPS_GNU_REL16_S2, /* type */
2539 1.1 skrll 2, /* rightshift */
2540 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2541 1.1 skrll 16, /* bitsize */
2542 1.1 skrll TRUE, /* pc_relative */
2543 1.1 skrll 0, /* bitpos */
2544 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
2545 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
2546 1.1 skrll "R_MIPS_GNU_REL16_S2", /* name */
2547 1.1 skrll TRUE, /* partial_inplace */
2548 1.1 skrll 0x0000ffff, /* src_mask */
2549 1.1 skrll 0x0000ffff, /* dst_mask */
2550 1.1 skrll TRUE); /* pcrel_offset */
2551 1.1 skrll
2552 1.1 skrll /* 16 bit offset for pc-relative branches. */
2553 1.1 skrll static reloc_howto_type elf_mips_gnu_rela16_s2 =
2554 1.1 skrll HOWTO (R_MIPS_GNU_REL16_S2, /* type */
2555 1.1 skrll 2, /* rightshift */
2556 1.1 skrll 2, /* size (0 = byte, 1 = short, 2 = long) */
2557 1.1 skrll 16, /* bitsize */
2558 1.1 skrll TRUE, /* pc_relative */
2559 1.1 skrll 0, /* bitpos */
2560 1.1 skrll complain_overflow_signed, /* complain_on_overflow */
2561 1.1 skrll _bfd_mips_elf_generic_reloc, /* special_function */
2562 1.1 skrll "R_MIPS_GNU_REL16_S2", /* name */
2563 1.1 skrll FALSE, /* partial_inplace */
2564 1.1 skrll 0, /* src_mask */
2565 1.1 skrll 0x0000ffff, /* dst_mask */
2566 1.1 skrll TRUE); /* pcrel_offset */
2567 1.1 skrll
2568 1.1 skrll /* Originally a VxWorks extension, but now used for other systems too. */
2570 1.1 skrll static reloc_howto_type elf_mips_copy_howto =
2571 1.1 skrll HOWTO (R_MIPS_COPY, /* type */
2572 1.1 skrll 0, /* rightshift */
2573 1.1 skrll 0, /* this one is variable size */
2574 1.1 skrll 0, /* bitsize */
2575 1.1 skrll FALSE, /* pc_relative */
2576 1.1 skrll 0, /* bitpos */
2577 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
2578 1.1 skrll bfd_elf_generic_reloc, /* special_function */
2579 1.1 skrll "R_MIPS_COPY", /* name */
2580 1.1 skrll FALSE, /* partial_inplace */
2581 1.1 skrll 0x0, /* src_mask */
2582 1.1 skrll 0x0, /* dst_mask */
2583 1.1 skrll FALSE); /* pcrel_offset */
2584 1.1 skrll
2585 1.1 skrll /* Originally a VxWorks extension, but now used for other systems too. */
2586 1.1 skrll static reloc_howto_type elf_mips_jump_slot_howto =
2587 1.1 skrll HOWTO (R_MIPS_JUMP_SLOT, /* type */
2588 1.1 skrll 0, /* rightshift */
2589 1.1 skrll 4, /* size (0 = byte, 1 = short, 2 = long) */
2590 1.1 skrll 64, /* bitsize */
2591 1.1 skrll FALSE, /* pc_relative */
2592 1.1 skrll 0, /* bitpos */
2593 1.1 skrll complain_overflow_bitfield, /* complain_on_overflow */
2594 1.1 skrll bfd_elf_generic_reloc, /* special_function */
2595 1.1 skrll "R_MIPS_JUMP_SLOT", /* name */
2596 1.1 skrll FALSE, /* partial_inplace */
2597 1.1 skrll 0x0, /* src_mask */
2598 1.1 skrll 0x0, /* dst_mask */
2599 1.1 skrll FALSE); /* pcrel_offset */
2600 1.1 skrll
2601 1.1 skrll /* Swap in a MIPS 64-bit Rel reloc. */
2603 1.1 skrll
2604 1.1 skrll static void
2605 1.1 skrll mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
2606 1.1 skrll Elf64_Mips_Internal_Rela *dst)
2607 1.1 skrll {
2608 1.1 skrll dst->r_offset = H_GET_64 (abfd, src->r_offset);
2609 1.1 skrll dst->r_sym = H_GET_32 (abfd, src->r_sym);
2610 1.1 skrll dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
2611 1.1 skrll dst->r_type3 = H_GET_8 (abfd, src->r_type3);
2612 1.1 skrll dst->r_type2 = H_GET_8 (abfd, src->r_type2);
2613 1.1 skrll dst->r_type = H_GET_8 (abfd, src->r_type);
2614 1.1 skrll dst->r_addend = 0;
2615 1.1 skrll }
2616 1.1 skrll
2617 1.1 skrll /* Swap in a MIPS 64-bit Rela reloc. */
2618 1.1 skrll
2619 1.1 skrll static void
2620 1.1 skrll mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
2621 1.1 skrll Elf64_Mips_Internal_Rela *dst)
2622 1.1 skrll {
2623 1.1 skrll dst->r_offset = H_GET_64 (abfd, src->r_offset);
2624 1.1 skrll dst->r_sym = H_GET_32 (abfd, src->r_sym);
2625 1.1 skrll dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
2626 1.1 skrll dst->r_type3 = H_GET_8 (abfd, src->r_type3);
2627 1.1 skrll dst->r_type2 = H_GET_8 (abfd, src->r_type2);
2628 1.1 skrll dst->r_type = H_GET_8 (abfd, src->r_type);
2629 1.1 skrll dst->r_addend = H_GET_S64 (abfd, src->r_addend);
2630 1.1 skrll }
2631 1.1 skrll
2632 1.1 skrll /* Swap out a MIPS 64-bit Rel reloc. */
2633 1.1 skrll
2634 1.1 skrll static void
2635 1.1 skrll mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
2636 1.1 skrll Elf64_Mips_External_Rel *dst)
2637 1.1 skrll {
2638 1.1 skrll H_PUT_64 (abfd, src->r_offset, dst->r_offset);
2639 1.1 skrll H_PUT_32 (abfd, src->r_sym, dst->r_sym);
2640 1.1 skrll H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
2641 1.1 skrll H_PUT_8 (abfd, src->r_type3, dst->r_type3);
2642 1.1 skrll H_PUT_8 (abfd, src->r_type2, dst->r_type2);
2643 1.1 skrll H_PUT_8 (abfd, src->r_type, dst->r_type);
2644 1.1 skrll }
2645 1.1 skrll
2646 1.1 skrll /* Swap out a MIPS 64-bit Rela reloc. */
2647 1.1 skrll
2648 1.1 skrll static void
2649 1.1 skrll mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
2650 1.1 skrll Elf64_Mips_External_Rela *dst)
2651 1.1 skrll {
2652 1.1 skrll H_PUT_64 (abfd, src->r_offset, dst->r_offset);
2653 1.1 skrll H_PUT_32 (abfd, src->r_sym, dst->r_sym);
2654 1.1 skrll H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
2655 1.1 skrll H_PUT_8 (abfd, src->r_type3, dst->r_type3);
2656 1.1 skrll H_PUT_8 (abfd, src->r_type2, dst->r_type2);
2657 1.1 skrll H_PUT_8 (abfd, src->r_type, dst->r_type);
2658 1.1 skrll H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
2659 1.1 skrll }
2660 1.1 skrll
2661 1.1 skrll /* Swap in a MIPS 64-bit Rel reloc. */
2662 1.1 skrll
2663 1.1 skrll static void
2664 1.1 skrll mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
2665 1.1 skrll Elf_Internal_Rela *dst)
2666 1.1 skrll {
2667 1.1 skrll Elf64_Mips_Internal_Rela mirel;
2668 1.1 skrll
2669 1.1 skrll mips_elf64_swap_reloc_in (abfd,
2670 1.1 skrll (const Elf64_Mips_External_Rel *) src,
2671 1.1 skrll &mirel);
2672 1.1 skrll
2673 1.1 skrll dst[0].r_offset = mirel.r_offset;
2674 1.1 skrll dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
2675 1.1 skrll dst[0].r_addend = 0;
2676 1.1 skrll dst[1].r_offset = mirel.r_offset;
2677 1.1 skrll dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
2678 1.1 skrll dst[1].r_addend = 0;
2679 1.1 skrll dst[2].r_offset = mirel.r_offset;
2680 1.1 skrll dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
2681 1.1 skrll dst[2].r_addend = 0;
2682 1.1 skrll }
2683 1.1 skrll
2684 1.1 skrll /* Swap in a MIPS 64-bit Rela reloc. */
2685 1.1 skrll
2686 1.1 skrll static void
2687 1.1 skrll mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
2688 1.1 skrll Elf_Internal_Rela *dst)
2689 1.1 skrll {
2690 1.1 skrll Elf64_Mips_Internal_Rela mirela;
2691 1.1 skrll
2692 1.1 skrll mips_elf64_swap_reloca_in (abfd,
2693 1.1 skrll (const Elf64_Mips_External_Rela *) src,
2694 1.1 skrll &mirela);
2695 1.1 skrll
2696 1.1 skrll dst[0].r_offset = mirela.r_offset;
2697 1.1 skrll dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
2698 1.1 skrll dst[0].r_addend = mirela.r_addend;
2699 1.1 skrll dst[1].r_offset = mirela.r_offset;
2700 1.1 skrll dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
2701 1.1 skrll dst[1].r_addend = 0;
2702 1.1 skrll dst[2].r_offset = mirela.r_offset;
2703 1.1 skrll dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
2704 1.1 skrll dst[2].r_addend = 0;
2705 1.1 skrll }
2706 1.1 skrll
2707 1.1 skrll /* Swap out a MIPS 64-bit Rel reloc. */
2708 1.1 skrll
2709 1.1 skrll static void
2710 1.1 skrll mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
2711 1.1 skrll bfd_byte *dst)
2712 1.1 skrll {
2713 1.4 christos Elf64_Mips_Internal_Rela mirel;
2714 1.1 skrll
2715 1.1 skrll mirel.r_offset = src[0].r_offset;
2716 1.1 skrll BFD_ASSERT(src[0].r_offset == src[1].r_offset);
2717 1.1 skrll BFD_ASSERT(src[0].r_offset == src[2].r_offset);
2718 1.1 skrll
2719 1.1 skrll mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
2720 1.1 skrll mirel.r_sym = ELF64_R_SYM (src[0].r_info);
2721 1.1 skrll mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
2722 1.1 skrll mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
2723 1.1 skrll mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
2724 1.1 skrll
2725 1.1 skrll mips_elf64_swap_reloc_out (abfd, &mirel,
2726 1.1 skrll (Elf64_Mips_External_Rel *) dst);
2727 1.1 skrll }
2728 1.1 skrll
2729 1.1 skrll /* Swap out a MIPS 64-bit Rela reloc. */
2730 1.1 skrll
2731 1.1 skrll static void
2732 1.1 skrll mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
2733 1.1 skrll bfd_byte *dst)
2734 1.1 skrll {
2735 1.1 skrll Elf64_Mips_Internal_Rela mirela;
2736 1.1 skrll
2737 1.1 skrll mirela.r_offset = src[0].r_offset;
2738 1.1 skrll BFD_ASSERT(src[0].r_offset == src[1].r_offset);
2739 1.1 skrll BFD_ASSERT(src[0].r_offset == src[2].r_offset);
2740 1.1 skrll
2741 1.1 skrll mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
2742 1.1 skrll mirela.r_sym = ELF64_R_SYM (src[0].r_info);
2743 1.1 skrll mirela.r_addend = src[0].r_addend;
2744 1.1 skrll BFD_ASSERT(src[1].r_addend == 0);
2745 1.1 skrll BFD_ASSERT(src[2].r_addend == 0);
2746 1.1 skrll
2747 1.1 skrll mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
2748 1.1 skrll mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
2749 1.1 skrll mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
2750 1.1 skrll
2751 1.1 skrll mips_elf64_swap_reloca_out (abfd, &mirela,
2752 1.1 skrll (Elf64_Mips_External_Rela *) dst);
2753 1.1 skrll }
2754 1.1 skrll
2755 1.1 skrll /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
2757 1.1 skrll dangerous relocation. */
2758 1.1 skrll
2759 1.1 skrll static bfd_boolean
2760 1.1 skrll mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
2761 1.1 skrll {
2762 1.1 skrll unsigned int count;
2763 1.1 skrll asymbol **sym;
2764 1.1 skrll unsigned int i;
2765 1.1 skrll
2766 1.1 skrll /* If we've already figured out what GP will be, just return it. */
2767 1.1 skrll *pgp = _bfd_get_gp_value (output_bfd);
2768 1.1 skrll if (*pgp)
2769 1.1 skrll return TRUE;
2770 1.1 skrll
2771 1.1 skrll count = bfd_get_symcount (output_bfd);
2772 1.1 skrll sym = bfd_get_outsymbols (output_bfd);
2773 1.1 skrll
2774 1.1 skrll /* The linker script will have created a symbol named `_gp' with the
2775 1.1 skrll appropriate value. */
2776 1.1 skrll if (sym == NULL)
2777 1.1 skrll i = count;
2778 1.1 skrll else
2779 1.1 skrll {
2780 1.1 skrll for (i = 0; i < count; i++, sym++)
2781 1.1 skrll {
2782 1.1 skrll register const char *name;
2783 1.1 skrll
2784 1.1 skrll name = bfd_asymbol_name (*sym);
2785 1.1 skrll if (*name == '_' && strcmp (name, "_gp") == 0)
2786 1.1 skrll {
2787 1.1 skrll *pgp = bfd_asymbol_value (*sym);
2788 1.1 skrll _bfd_set_gp_value (output_bfd, *pgp);
2789 1.1 skrll break;
2790 1.1 skrll }
2791 1.1 skrll }
2792 1.1 skrll }
2793 1.1 skrll
2794 1.1 skrll if (i >= count)
2795 1.1 skrll {
2796 1.1 skrll /* Only get the error once. */
2797 1.1 skrll *pgp = 4;
2798 1.1 skrll _bfd_set_gp_value (output_bfd, *pgp);
2799 1.1 skrll return FALSE;
2800 1.1 skrll }
2801 1.1 skrll
2802 1.1 skrll return TRUE;
2803 1.1 skrll }
2804 1.1 skrll
2805 1.1 skrll /* We have to figure out the gp value, so that we can adjust the
2806 1.1 skrll symbol value correctly. We look up the symbol _gp in the output
2807 1.1 skrll BFD. If we can't find it, we're stuck. We cache it in the ELF
2808 1.1 skrll target data. We don't need to adjust the symbol value for an
2809 1.1 skrll external symbol if we are producing relocatable output. */
2810 1.1 skrll
2811 1.1 skrll static bfd_reloc_status_type
2812 1.1 skrll mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
2813 1.1 skrll char **error_message, bfd_vma *pgp)
2814 1.1 skrll {
2815 1.1 skrll if (bfd_is_und_section (symbol->section)
2816 1.1 skrll && ! relocatable)
2817 1.1 skrll {
2818 1.1 skrll *pgp = 0;
2819 1.1 skrll return bfd_reloc_undefined;
2820 1.1 skrll }
2821 1.1 skrll
2822 1.1 skrll *pgp = _bfd_get_gp_value (output_bfd);
2823 1.1 skrll if (*pgp == 0
2824 1.1 skrll && (! relocatable
2825 1.1 skrll || (symbol->flags & BSF_SECTION_SYM) != 0))
2826 1.1 skrll {
2827 1.1 skrll if (relocatable)
2828 1.1 skrll {
2829 1.1 skrll /* Make up a value. */
2830 1.1 skrll *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
2831 1.1 skrll _bfd_set_gp_value (output_bfd, *pgp);
2832 1.1 skrll }
2833 1.1 skrll else if (!mips_elf64_assign_gp (output_bfd, pgp))
2834 1.1 skrll {
2835 1.1 skrll *error_message =
2836 1.1 skrll (char *) _("GP relative relocation when _gp not defined");
2837 1.1 skrll return bfd_reloc_dangerous;
2838 1.1 skrll }
2839 1.1 skrll }
2840 1.1 skrll
2841 1.1 skrll return bfd_reloc_ok;
2842 1.1 skrll }
2843 1.1 skrll
2844 1.1 skrll /* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must
2845 1.1 skrll become the offset from the gp register. */
2846 1.1 skrll
2847 1.1 skrll static bfd_reloc_status_type
2848 1.1 skrll mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2849 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
2850 1.1 skrll char **error_message)
2851 1.1 skrll {
2852 1.1 skrll bfd_boolean relocatable;
2853 1.1 skrll bfd_reloc_status_type ret;
2854 1.1 skrll bfd_vma gp;
2855 1.1 skrll
2856 1.1 skrll /* If we're relocating, and this is an external symbol, we don't want
2857 1.1 skrll to change anything. */
2858 1.1 skrll if (output_bfd != NULL
2859 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
2860 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
2861 1.1 skrll {
2862 1.1 skrll reloc_entry->address += input_section->output_offset;
2863 1.1 skrll return bfd_reloc_ok;
2864 1.1 skrll }
2865 1.1 skrll
2866 1.1 skrll if (output_bfd != NULL)
2867 1.1 skrll relocatable = TRUE;
2868 1.1 skrll else
2869 1.1 skrll {
2870 1.1 skrll relocatable = FALSE;
2871 1.1 skrll output_bfd = symbol->section->output_section->owner;
2872 1.1 skrll }
2873 1.1 skrll
2874 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2875 1.1 skrll &gp);
2876 1.1 skrll if (ret != bfd_reloc_ok)
2877 1.1 skrll return ret;
2878 1.1 skrll
2879 1.1 skrll return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2880 1.1 skrll input_section, relocatable,
2881 1.1 skrll data, gp);
2882 1.1 skrll }
2883 1.1 skrll
2884 1.1 skrll /* Do a R_MIPS_LITERAL relocation. */
2885 1.1 skrll
2886 1.1 skrll static bfd_reloc_status_type
2887 1.1 skrll mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2888 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
2889 1.1 skrll char **error_message)
2890 1.1 skrll {
2891 1.1 skrll bfd_boolean relocatable;
2892 1.1 skrll bfd_reloc_status_type ret;
2893 1.1 skrll bfd_vma gp;
2894 1.1 skrll
2895 1.1 skrll /* R_MIPS_LITERAL relocations are defined for local symbols only. */
2896 1.1 skrll if (output_bfd != NULL
2897 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
2898 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
2899 1.1 skrll {
2900 1.1 skrll *error_message = (char *)
2901 1.1 skrll _("literal relocation occurs for an external symbol");
2902 1.1 skrll return bfd_reloc_outofrange;
2903 1.1 skrll }
2904 1.1 skrll
2905 1.1 skrll /* FIXME: The entries in the .lit8 and .lit4 sections should be merged. */
2906 1.1 skrll if (output_bfd != NULL)
2907 1.1 skrll relocatable = TRUE;
2908 1.1 skrll else
2909 1.1 skrll {
2910 1.1 skrll relocatable = FALSE;
2911 1.1 skrll output_bfd = symbol->section->output_section->owner;
2912 1.1 skrll }
2913 1.1 skrll
2914 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2915 1.1 skrll &gp);
2916 1.1 skrll if (ret != bfd_reloc_ok)
2917 1.1 skrll return ret;
2918 1.1 skrll
2919 1.1 skrll return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2920 1.1 skrll input_section, relocatable,
2921 1.1 skrll data, gp);
2922 1.1 skrll }
2923 1.1 skrll
2924 1.1 skrll /* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must
2925 1.1 skrll become the offset from the gp register. */
2926 1.1 skrll
2927 1.1 skrll static bfd_reloc_status_type
2928 1.1 skrll mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2929 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
2930 1.1 skrll char **error_message)
2931 1.1 skrll {
2932 1.1 skrll bfd_boolean relocatable;
2933 1.1 skrll bfd_reloc_status_type ret;
2934 1.1 skrll bfd_vma gp;
2935 1.1 skrll bfd_vma relocation;
2936 1.1 skrll bfd_vma val;
2937 1.1 skrll
2938 1.1 skrll /* R_MIPS_GPREL32 relocations are defined for local symbols only. */
2939 1.1 skrll if (output_bfd != NULL
2940 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
2941 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
2942 1.1 skrll {
2943 1.1 skrll *error_message = (char *)
2944 1.1 skrll _("32bits gp relative relocation occurs for an external symbol");
2945 1.1 skrll return bfd_reloc_outofrange;
2946 1.1 skrll }
2947 1.1 skrll
2948 1.1 skrll if (output_bfd != NULL)
2949 1.1 skrll relocatable = TRUE;
2950 1.1 skrll else
2951 1.1 skrll {
2952 1.1 skrll relocatable = FALSE;
2953 1.1 skrll output_bfd = symbol->section->output_section->owner;
2954 1.1 skrll }
2955 1.1 skrll
2956 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
2957 1.1 skrll error_message, &gp);
2958 1.1 skrll if (ret != bfd_reloc_ok)
2959 1.1 skrll return ret;
2960 1.1 skrll
2961 1.1 skrll if (bfd_is_com_section (symbol->section))
2962 1.1 skrll relocation = 0;
2963 1.1 skrll else
2964 1.1 skrll relocation = symbol->value;
2965 1.1 skrll
2966 1.1 skrll relocation += symbol->section->output_section->vma;
2967 1.1 skrll relocation += symbol->section->output_offset;
2968 1.1 skrll
2969 1.1 skrll if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2970 1.1 skrll return bfd_reloc_outofrange;
2971 1.1 skrll
2972 1.1 skrll /* Set val to the offset into the section or symbol. */
2973 1.1 skrll val = reloc_entry->addend;
2974 1.1 skrll
2975 1.1 skrll if (reloc_entry->howto->partial_inplace)
2976 1.1 skrll val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
2977 1.1 skrll
2978 1.1 skrll /* Adjust val for the final section location and GP value. If we
2979 1.1 skrll are producing relocatable output, we don't want to do this for
2980 1.1 skrll an external symbol. */
2981 1.1 skrll if (! relocatable
2982 1.1 skrll || (symbol->flags & BSF_SECTION_SYM) != 0)
2983 1.1 skrll val += relocation - gp;
2984 1.1 skrll
2985 1.1 skrll if (reloc_entry->howto->partial_inplace)
2986 1.1 skrll bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
2987 1.1 skrll else
2988 1.1 skrll reloc_entry->addend = val;
2989 1.1 skrll
2990 1.1 skrll if (relocatable)
2991 1.1 skrll reloc_entry->address += input_section->output_offset;
2992 1.1 skrll
2993 1.1 skrll return bfd_reloc_ok;
2994 1.1 skrll }
2995 1.1 skrll
2996 1.1 skrll /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
2997 1.1 skrll the rest is at bits 6-10. The bitpos already got right by the howto. */
2998 1.1 skrll
2999 1.1 skrll static bfd_reloc_status_type
3000 1.1 skrll mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3001 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
3002 1.1 skrll char **error_message)
3003 1.1 skrll {
3004 1.1 skrll if (reloc_entry->howto->partial_inplace)
3005 1.1 skrll {
3006 1.1 skrll reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
3007 1.1 skrll | (reloc_entry->addend & 0x00000800) >> 9);
3008 1.1 skrll }
3009 1.1 skrll
3010 1.1 skrll return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
3011 1.1 skrll input_section, output_bfd,
3012 1.1 skrll error_message);
3013 1.1 skrll }
3014 1.1 skrll
3015 1.1 skrll /* Handle a mips16 GP relative reloc. */
3016 1.1 skrll
3017 1.1 skrll static bfd_reloc_status_type
3018 1.1 skrll mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3019 1.1 skrll void *data, asection *input_section, bfd *output_bfd,
3020 1.1 skrll char **error_message)
3021 1.1 skrll {
3022 1.1 skrll bfd_boolean relocatable;
3023 1.1 skrll bfd_reloc_status_type ret;
3024 1.1 skrll bfd_byte *location;
3025 1.1 skrll bfd_vma gp;
3026 1.1 skrll
3027 1.1 skrll /* If we're relocating, and this is an external symbol, we don't want
3028 1.1 skrll to change anything. */
3029 1.1 skrll if (output_bfd != NULL
3030 1.1 skrll && (symbol->flags & BSF_SECTION_SYM) == 0
3031 1.1 skrll && (symbol->flags & BSF_LOCAL) != 0)
3032 1.1 skrll {
3033 1.1 skrll reloc_entry->address += input_section->output_offset;
3034 1.1 skrll return bfd_reloc_ok;
3035 1.1 skrll }
3036 1.1 skrll
3037 1.1 skrll if (output_bfd != NULL)
3038 1.1 skrll relocatable = TRUE;
3039 1.1 skrll else
3040 1.1 skrll {
3041 1.1 skrll relocatable = FALSE;
3042 1.1 skrll output_bfd = symbol->section->output_section->owner;
3043 1.1 skrll }
3044 1.1 skrll
3045 1.1 skrll ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3046 1.4 christos &gp);
3047 1.4 christos if (ret != bfd_reloc_ok)
3048 1.1 skrll return ret;
3049 1.1 skrll
3050 1.1 skrll location = (bfd_byte *) data + reloc_entry->address;
3051 1.4 christos _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
3052 1.4 christos location);
3053 1.1 skrll ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3054 1.1 skrll input_section, relocatable,
3055 1.1 skrll data, gp);
3056 1.1 skrll _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
3057 1.1 skrll location);
3058 1.1 skrll
3059 1.1 skrll return ret;
3060 1.1 skrll }
3061 1.1 skrll
3062 1.1 skrll /* A mapping from BFD reloc types to MIPS ELF reloc types. */
3064 1.1 skrll
3065 1.1 skrll struct elf_reloc_map {
3066 1.1 skrll bfd_reloc_code_real_type bfd_val;
3067 1.1 skrll enum elf_mips_reloc_type elf_val;
3068 1.1 skrll };
3069 1.1 skrll
3070 1.1 skrll static const struct elf_reloc_map mips_reloc_map[] =
3071 1.1 skrll {
3072 1.1 skrll { BFD_RELOC_NONE, R_MIPS_NONE },
3073 1.1 skrll { BFD_RELOC_16, R_MIPS_16 },
3074 1.1 skrll { BFD_RELOC_32, R_MIPS_32 },
3075 1.1 skrll /* There is no BFD reloc for R_MIPS_REL32. */
3076 1.1 skrll { BFD_RELOC_64, R_MIPS_64 },
3077 1.1 skrll { BFD_RELOC_CTOR, R_MIPS_64 },
3078 1.1 skrll { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
3079 1.1 skrll { BFD_RELOC_HI16_S, R_MIPS_HI16 },
3080 1.1 skrll { BFD_RELOC_LO16, R_MIPS_LO16 },
3081 1.1 skrll { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
3082 1.1 skrll { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
3083 1.1 skrll { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
3084 1.1 skrll { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
3085 1.1 skrll { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
3086 1.1 skrll { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
3087 1.1 skrll { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
3088 1.1 skrll { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
3089 1.1 skrll { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
3090 1.1 skrll { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
3091 1.1 skrll { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
3092 1.1 skrll { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
3093 1.1 skrll { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
3094 1.1 skrll { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
3095 1.1 skrll { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
3096 1.1 skrll { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
3097 1.1 skrll { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
3098 1.1 skrll { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
3099 1.1 skrll { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
3100 1.1 skrll { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
3101 1.1 skrll { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
3102 1.1 skrll { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
3103 1.1 skrll { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
3104 1.1 skrll /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated. */
3105 1.1 skrll { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
3106 1.1 skrll { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
3107 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
3108 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
3109 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
3110 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
3111 1.1 skrll { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
3112 1.1 skrll { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
3113 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
3114 1.1 skrll { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
3115 1.1 skrll { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
3116 1.1 skrll { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
3117 1.1 skrll { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
3118 1.1 skrll { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
3119 1.1 skrll { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
3120 1.1 skrll };
3121 1.1 skrll
3122 1.1 skrll static const struct elf_reloc_map mips16_reloc_map[] =
3123 1.1 skrll {
3124 1.4 christos { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
3125 1.4 christos { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
3126 1.4 christos { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
3127 1.4 christos { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
3128 1.4 christos { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
3129 1.4 christos { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
3130 1.4 christos { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
3131 1.4 christos { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
3132 1.4 christos { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
3133 1.1 skrll R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
3134 1.1 skrll { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
3135 1.4 christos R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
3136 1.4 christos { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
3137 1.4 christos { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
3138 1.4 christos { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
3139 1.4 christos };
3140 1.4 christos
3141 1.4 christos static const struct elf_reloc_map micromips_reloc_map[] =
3142 1.4 christos {
3143 1.4 christos { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
3144 1.4 christos { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
3145 1.4 christos { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
3146 1.4 christos { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
3147 1.4 christos { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
3148 1.4 christos { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
3149 1.4 christos { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
3150 1.4 christos { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
3151 1.4 christos { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
3152 1.4 christos { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
3153 1.4 christos { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
3154 1.4 christos { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
3155 1.4 christos { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
3156 1.4 christos { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
3157 1.4 christos { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
3158 1.1 skrll { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
3159 1.1 skrll { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
3160 1.1 skrll { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
3161 1.1 skrll { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
3162 1.1 skrll { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
3163 1.1 skrll };
3164 1.1 skrll /* Given a BFD reloc type, return a howto structure. */
3165 1.1 skrll
3166 1.1 skrll static reloc_howto_type *
3167 1.1 skrll bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3168 1.1 skrll bfd_reloc_code_real_type code)
3169 1.4 christos {
3170 1.1 skrll unsigned int i;
3171 1.1 skrll /* FIXME: We default to RELA here instead of choosing the right
3172 1.1 skrll relocation variant. */
3173 1.1 skrll reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
3174 1.1 skrll reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
3175 1.1 skrll reloc_howto_type *howto_micromips_table = micromips_elf64_howto_table_rela;
3176 1.1 skrll
3177 1.1 skrll for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
3178 1.1 skrll i++)
3179 1.1 skrll {
3180 1.1 skrll if (mips_reloc_map[i].bfd_val == code)
3181 1.1 skrll return &howto_table[(int) mips_reloc_map[i].elf_val];
3182 1.1 skrll }
3183 1.1 skrll
3184 1.1 skrll for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
3185 1.4 christos i++)
3186 1.4 christos {
3187 1.4 christos if (mips16_reloc_map[i].bfd_val == code)
3188 1.4 christos return &howto16_table[(int) mips16_reloc_map[i].elf_val];
3189 1.4 christos }
3190 1.4 christos
3191 1.4 christos for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
3192 1.1 skrll i++)
3193 1.1 skrll {
3194 1.1 skrll if (micromips_reloc_map[i].bfd_val == code)
3195 1.1 skrll return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
3196 1.1 skrll }
3197 1.1 skrll
3198 1.1 skrll switch (code)
3199 1.1 skrll {
3200 1.1 skrll case BFD_RELOC_VTABLE_INHERIT:
3201 1.1 skrll return &elf_mips_gnu_vtinherit_howto;
3202 1.1 skrll case BFD_RELOC_VTABLE_ENTRY:
3203 1.1 skrll return &elf_mips_gnu_vtentry_howto;
3204 1.1 skrll case BFD_RELOC_MIPS_COPY:
3205 1.1 skrll return &elf_mips_copy_howto;
3206 1.1 skrll case BFD_RELOC_MIPS_JUMP_SLOT:
3207 1.1 skrll return &elf_mips_jump_slot_howto;
3208 1.1 skrll default:
3209 1.1 skrll bfd_set_error (bfd_error_bad_value);
3210 1.1 skrll return NULL;
3211 1.1 skrll }
3212 1.1 skrll }
3213 1.1 skrll
3214 1.1 skrll static reloc_howto_type *
3215 1.1 skrll bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3216 1.1 skrll const char *r_name)
3217 1.1 skrll {
3218 1.1 skrll unsigned int i;
3219 1.1 skrll
3220 1.1 skrll for (i = 0;
3221 1.1 skrll i < (sizeof (mips_elf64_howto_table_rela)
3222 1.1 skrll / sizeof (mips_elf64_howto_table_rela[0])); i++)
3223 1.1 skrll if (mips_elf64_howto_table_rela[i].name != NULL
3224 1.1 skrll && strcasecmp (mips_elf64_howto_table_rela[i].name, r_name) == 0)
3225 1.1 skrll return &mips_elf64_howto_table_rela[i];
3226 1.1 skrll
3227 1.1 skrll for (i = 0;
3228 1.1 skrll i < (sizeof (mips16_elf64_howto_table_rela)
3229 1.4 christos / sizeof (mips16_elf64_howto_table_rela[0]));
3230 1.4 christos i++)
3231 1.4 christos if (mips16_elf64_howto_table_rela[i].name != NULL
3232 1.4 christos && strcasecmp (mips16_elf64_howto_table_rela[i].name, r_name) == 0)
3233 1.4 christos return &mips16_elf64_howto_table_rela[i];
3234 1.4 christos
3235 1.4 christos for (i = 0;
3236 1.4 christos i < (sizeof (micromips_elf64_howto_table_rela)
3237 1.1 skrll / sizeof (micromips_elf64_howto_table_rela[0]));
3238 1.1 skrll i++)
3239 1.1 skrll if (micromips_elf64_howto_table_rela[i].name != NULL
3240 1.1 skrll && strcasecmp (micromips_elf64_howto_table_rela[i].name, r_name) == 0)
3241 1.1 skrll return µmips_elf64_howto_table_rela[i];
3242 1.1 skrll
3243 1.1 skrll if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
3244 1.1 skrll return &elf_mips_gnu_vtinherit_howto;
3245 1.1 skrll if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
3246 1.1 skrll return &elf_mips_gnu_vtentry_howto;
3247 1.1 skrll if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
3248 1.1 skrll return &elf_mips_gnu_rel16_s2;
3249 1.1 skrll if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
3250 1.1 skrll return &elf_mips_gnu_rela16_s2;
3251 1.1 skrll if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
3252 1.1 skrll return &elf_mips_copy_howto;
3253 1.1 skrll if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
3254 1.1 skrll return &elf_mips_jump_slot_howto;
3255 1.1 skrll
3256 1.1 skrll return NULL;
3257 1.1 skrll }
3258 1.1 skrll
3259 1.1 skrll /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
3260 1.1 skrll
3261 1.1 skrll static reloc_howto_type *
3262 1.1 skrll mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
3263 1.1 skrll {
3264 1.1 skrll switch (r_type)
3265 1.1 skrll {
3266 1.1 skrll case R_MIPS_GNU_VTINHERIT:
3267 1.1 skrll return &elf_mips_gnu_vtinherit_howto;
3268 1.1 skrll case R_MIPS_GNU_VTENTRY:
3269 1.1 skrll return &elf_mips_gnu_vtentry_howto;
3270 1.1 skrll case R_MIPS_GNU_REL16_S2:
3271 1.1 skrll if (rela_p)
3272 1.1 skrll return &elf_mips_gnu_rela16_s2;
3273 1.1 skrll else
3274 1.4 christos return &elf_mips_gnu_rel16_s2;
3275 1.4 christos case R_MIPS_COPY:
3276 1.4 christos return &elf_mips_copy_howto;
3277 1.4 christos case R_MIPS_JUMP_SLOT:
3278 1.4 christos return &elf_mips_jump_slot_howto;
3279 1.4 christos default:
3280 1.4 christos if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
3281 1.1 skrll {
3282 1.1 skrll if (rela_p)
3283 1.1 skrll return µmips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
3284 1.1 skrll else
3285 1.1 skrll return µmips_elf64_howto_table_rel[r_type - R_MICROMIPS_min];
3286 1.1 skrll }
3287 1.1 skrll if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
3288 1.1 skrll {
3289 1.1 skrll if (rela_p)
3290 1.1 skrll return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
3291 1.1 skrll else
3292 1.1 skrll return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
3293 1.1 skrll }
3294 1.1 skrll BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
3295 1.1 skrll if (rela_p)
3296 1.1 skrll return &mips_elf64_howto_table_rela[r_type];
3297 1.1 skrll else
3298 1.1 skrll return &mips_elf64_howto_table_rel[r_type];
3299 1.1 skrll break;
3300 1.1 skrll }
3301 1.1 skrll }
3302 1.1 skrll
3303 1.1 skrll /* Prevent relocation handling by bfd for MIPS ELF64. */
3304 1.1 skrll
3305 1.1 skrll static void
3306 1.1 skrll mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
3307 1.1 skrll arelent *cache_ptr ATTRIBUTE_UNUSED,
3308 1.1 skrll Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
3309 1.1 skrll {
3310 1.1 skrll BFD_ASSERT (0);
3311 1.1 skrll }
3312 1.1 skrll
3313 1.1 skrll static void
3314 1.1 skrll mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
3315 1.1 skrll arelent *cache_ptr ATTRIBUTE_UNUSED,
3316 1.1 skrll Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
3317 1.1 skrll {
3318 1.1 skrll BFD_ASSERT (0);
3319 1.1 skrll }
3320 1.1 skrll
3321 1.1 skrll /* Since each entry in an SHT_REL or SHT_RELA section can represent up
3322 1.1 skrll to three relocs, we must tell the user to allocate more space. */
3323 1.1 skrll
3324 1.1 skrll static long
3325 1.1 skrll mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
3326 1.1 skrll {
3327 1.1 skrll return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
3328 1.1 skrll }
3329 1.1 skrll
3330 1.1 skrll static long
3331 1.1 skrll mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
3332 1.1 skrll {
3333 1.1 skrll return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
3334 1.1 skrll }
3335 1.1 skrll
3336 1.1 skrll /* We must also copy more relocations than the corresponding functions
3337 1.1 skrll in elf.c would, so the two following functions are slightly
3338 1.1 skrll modified from elf.c, that multiply the external relocation count by
3339 1.1 skrll 3 to obtain the internal relocation count. */
3340 1.1 skrll
3341 1.1 skrll static long
3342 1.1 skrll mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section,
3343 1.1 skrll arelent **relptr, asymbol **symbols)
3344 1.1 skrll {
3345 1.1 skrll arelent *tblptr;
3346 1.1 skrll unsigned int i;
3347 1.1 skrll const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3348 1.1 skrll
3349 1.1 skrll if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
3350 1.1 skrll return -1;
3351 1.1 skrll
3352 1.1 skrll tblptr = section->relocation;
3353 1.1 skrll for (i = 0; i < section->reloc_count * 3; i++)
3354 1.1 skrll *relptr++ = tblptr++;
3355 1.1 skrll
3356 1.1 skrll *relptr = NULL;
3357 1.1 skrll
3358 1.1 skrll return section->reloc_count * 3;
3359 1.1 skrll }
3360 1.1 skrll
3361 1.1 skrll static long
3362 1.1 skrll mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
3363 1.1 skrll asymbol **syms)
3364 1.1 skrll {
3365 1.1 skrll bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3366 1.1 skrll asection *s;
3367 1.1 skrll long ret;
3368 1.1 skrll
3369 1.1 skrll if (elf_dynsymtab (abfd) == 0)
3370 1.1 skrll {
3371 1.1 skrll bfd_set_error (bfd_error_invalid_operation);
3372 1.1 skrll return -1;
3373 1.1 skrll }
3374 1.1 skrll
3375 1.1 skrll slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3376 1.1 skrll ret = 0;
3377 1.1 skrll for (s = abfd->sections; s != NULL; s = s->next)
3378 1.1 skrll {
3379 1.1 skrll if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
3380 1.1 skrll && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
3381 1.1 skrll || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
3382 1.1 skrll {
3383 1.1 skrll arelent *p;
3384 1.1 skrll long count, i;
3385 1.1 skrll
3386 1.1 skrll if (! (*slurp_relocs) (abfd, s, syms, TRUE))
3387 1.1 skrll return -1;
3388 1.1 skrll count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3;
3389 1.1 skrll p = s->relocation;
3390 1.1 skrll for (i = 0; i < count; i++)
3391 1.1 skrll *storage++ = p++;
3392 1.1 skrll ret += count;
3393 1.1 skrll }
3394 1.1 skrll }
3395 1.1 skrll
3396 1.1 skrll *storage = NULL;
3397 1.1 skrll
3398 1.1 skrll return ret;
3399 1.1 skrll }
3400 1.1 skrll
3401 1.1 skrll /* Read the relocations from one reloc section. This is mostly copied
3402 1.1 skrll from elfcode.h, except for the changes to expand one external
3403 1.1 skrll relocation to 3 internal ones. We must unfortunately set
3404 1.1 skrll reloc_count to the number of external relocations, because a lot of
3405 1.1 skrll generic code seems to depend on this. */
3406 1.1 skrll
3407 1.1 skrll static bfd_boolean
3408 1.1 skrll mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
3409 1.1 skrll Elf_Internal_Shdr *rel_hdr,
3410 1.1 skrll bfd_size_type reloc_count,
3411 1.1 skrll arelent *relents, asymbol **symbols,
3412 1.1 skrll bfd_boolean dynamic)
3413 1.1 skrll {
3414 1.1 skrll void *allocated;
3415 1.1 skrll bfd_byte *native_relocs;
3416 1.1 skrll arelent *relent;
3417 1.1 skrll bfd_vma i;
3418 1.1 skrll int entsize;
3419 1.1 skrll bfd_boolean rela_p;
3420 1.1 skrll
3421 1.1 skrll allocated = bfd_malloc (rel_hdr->sh_size);
3422 1.1 skrll if (allocated == NULL)
3423 1.1 skrll return FALSE;
3424 1.1 skrll
3425 1.1 skrll if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
3426 1.1 skrll || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
3427 1.1 skrll != rel_hdr->sh_size))
3428 1.1 skrll goto error_return;
3429 1.1 skrll
3430 1.1 skrll native_relocs = allocated;
3431 1.1 skrll
3432 1.1 skrll entsize = rel_hdr->sh_entsize;
3433 1.1 skrll BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
3434 1.1 skrll || entsize == sizeof (Elf64_Mips_External_Rela));
3435 1.1 skrll
3436 1.1 skrll if (entsize == sizeof (Elf64_Mips_External_Rel))
3437 1.1 skrll rela_p = FALSE;
3438 1.1 skrll else
3439 1.1 skrll rela_p = TRUE;
3440 1.1 skrll
3441 1.1 skrll for (i = 0, relent = relents;
3442 1.1 skrll i < reloc_count;
3443 1.1 skrll i++, native_relocs += entsize)
3444 1.1 skrll {
3445 1.1 skrll Elf64_Mips_Internal_Rela rela;
3446 1.1 skrll bfd_boolean used_sym, used_ssym;
3447 1.1 skrll int ir;
3448 1.1 skrll
3449 1.1 skrll if (entsize == sizeof (Elf64_Mips_External_Rela))
3450 1.1 skrll mips_elf64_swap_reloca_in (abfd,
3451 1.1 skrll (Elf64_Mips_External_Rela *) native_relocs,
3452 1.1 skrll &rela);
3453 1.1 skrll else
3454 1.1 skrll mips_elf64_swap_reloc_in (abfd,
3455 1.1 skrll (Elf64_Mips_External_Rel *) native_relocs,
3456 1.1 skrll &rela);
3457 1.1 skrll
3458 1.1 skrll /* Each entry represents exactly three actual relocations. */
3459 1.1 skrll
3460 1.1 skrll used_sym = FALSE;
3461 1.1 skrll used_ssym = FALSE;
3462 1.1 skrll for (ir = 0; ir < 3; ir++)
3463 1.1 skrll {
3464 1.1 skrll enum elf_mips_reloc_type type;
3465 1.1 skrll
3466 1.1 skrll switch (ir)
3467 1.1 skrll {
3468 1.1 skrll default:
3469 1.1 skrll abort ();
3470 1.1 skrll case 0:
3471 1.1 skrll type = (enum elf_mips_reloc_type) rela.r_type;
3472 1.1 skrll break;
3473 1.1 skrll case 1:
3474 1.1 skrll type = (enum elf_mips_reloc_type) rela.r_type2;
3475 1.1 skrll break;
3476 1.1 skrll case 2:
3477 1.1 skrll type = (enum elf_mips_reloc_type) rela.r_type3;
3478 1.1 skrll break;
3479 1.1 skrll }
3480 1.1 skrll
3481 1.1 skrll /* Some types require symbols, whereas some do not. */
3482 1.1 skrll switch (type)
3483 1.1 skrll {
3484 1.1 skrll case R_MIPS_NONE:
3485 1.1 skrll case R_MIPS_LITERAL:
3486 1.1 skrll case R_MIPS_INSERT_A:
3487 1.1 skrll case R_MIPS_INSERT_B:
3488 1.1 skrll case R_MIPS_DELETE:
3489 1.3 christos relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3490 1.1 skrll break;
3491 1.1 skrll
3492 1.1 skrll default:
3493 1.1 skrll if (! used_sym)
3494 1.1 skrll {
3495 1.1 skrll if (rela.r_sym == STN_UNDEF)
3496 1.1 skrll relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3497 1.1 skrll else
3498 1.1 skrll {
3499 1.1 skrll asymbol **ps, *s;
3500 1.1 skrll
3501 1.1 skrll ps = symbols + rela.r_sym - 1;
3502 1.1 skrll s = *ps;
3503 1.1 skrll if ((s->flags & BSF_SECTION_SYM) == 0)
3504 1.1 skrll relent->sym_ptr_ptr = ps;
3505 1.1 skrll else
3506 1.1 skrll relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
3507 1.1 skrll }
3508 1.1 skrll
3509 1.1 skrll used_sym = TRUE;
3510 1.1 skrll }
3511 1.1 skrll else if (! used_ssym)
3512 1.1 skrll {
3513 1.1 skrll switch (rela.r_ssym)
3514 1.1 skrll {
3515 1.1 skrll case RSS_UNDEF:
3516 1.1 skrll relent->sym_ptr_ptr =
3517 1.1 skrll bfd_abs_section_ptr->symbol_ptr_ptr;
3518 1.1 skrll break;
3519 1.1 skrll
3520 1.1 skrll case RSS_GP:
3521 1.1 skrll case RSS_GP0:
3522 1.1 skrll case RSS_LOC:
3523 1.1 skrll /* FIXME: I think these need to be handled using
3524 1.1 skrll special howto structures. */
3525 1.1 skrll BFD_ASSERT (0);
3526 1.1 skrll break;
3527 1.1 skrll
3528 1.1 skrll default:
3529 1.1 skrll BFD_ASSERT (0);
3530 1.1 skrll break;
3531 1.1 skrll }
3532 1.1 skrll
3533 1.1 skrll used_ssym = TRUE;
3534 1.1 skrll }
3535 1.1 skrll else
3536 1.1 skrll relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3537 1.1 skrll
3538 1.1 skrll break;
3539 1.1 skrll }
3540 1.1 skrll
3541 1.1 skrll /* The address of an ELF reloc is section relative for an
3542 1.1 skrll object file, and absolute for an executable file or
3543 1.1 skrll shared library. The address of a BFD reloc is always
3544 1.1 skrll section relative. */
3545 1.1 skrll if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
3546 1.1 skrll relent->address = rela.r_offset;
3547 1.1 skrll else
3548 1.1 skrll relent->address = rela.r_offset - asect->vma;
3549 1.1 skrll
3550 1.1 skrll relent->addend = rela.r_addend;
3551 1.1 skrll
3552 1.1 skrll relent->howto = mips_elf64_rtype_to_howto (type, rela_p);
3553 1.1 skrll
3554 1.1 skrll ++relent;
3555 1.1 skrll }
3556 1.1 skrll }
3557 1.1 skrll
3558 1.1 skrll asect->reloc_count += (relent - relents) / 3;
3559 1.1 skrll
3560 1.1 skrll if (allocated != NULL)
3561 1.1 skrll free (allocated);
3562 1.1 skrll
3563 1.1 skrll return TRUE;
3564 1.1 skrll
3565 1.1 skrll error_return:
3566 1.1 skrll if (allocated != NULL)
3567 1.1 skrll free (allocated);
3568 1.1 skrll return FALSE;
3569 1.1 skrll }
3570 1.1 skrll
3571 1.1 skrll /* Read the relocations. On Irix 6, there can be two reloc sections
3572 1.1 skrll associated with a single data section. This is copied from
3573 1.1 skrll elfcode.h as well, with changes as small as accounting for 3
3574 1.1 skrll internal relocs per external reloc and resetting reloc_count to
3575 1.1 skrll zero before processing the relocs of a section. */
3576 1.1 skrll
3577 1.1 skrll static bfd_boolean
3578 1.1 skrll mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
3579 1.1 skrll asymbol **symbols, bfd_boolean dynamic)
3580 1.1 skrll {
3581 1.1 skrll struct bfd_elf_section_data * const d = elf_section_data (asect);
3582 1.1 skrll Elf_Internal_Shdr *rel_hdr;
3583 1.1 skrll Elf_Internal_Shdr *rel_hdr2;
3584 1.1 skrll bfd_size_type reloc_count;
3585 1.1 skrll bfd_size_type reloc_count2;
3586 1.1 skrll arelent *relents;
3587 1.1 skrll bfd_size_type amt;
3588 1.1 skrll
3589 1.1 skrll if (asect->relocation != NULL)
3590 1.1 skrll return TRUE;
3591 1.1 skrll
3592 1.3 christos if (! dynamic)
3593 1.3 christos {
3594 1.3 christos if ((asect->flags & SEC_RELOC) == 0
3595 1.1 skrll || asect->reloc_count == 0)
3596 1.1 skrll return TRUE;
3597 1.1 skrll
3598 1.3 christos rel_hdr = d->rel.hdr;
3599 1.1 skrll reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
3600 1.1 skrll rel_hdr2 = d->rela.hdr;
3601 1.1 skrll reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
3602 1.1 skrll
3603 1.1 skrll BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
3604 1.1 skrll BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
3605 1.1 skrll || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
3606 1.1 skrll
3607 1.1 skrll }
3608 1.1 skrll else
3609 1.1 skrll {
3610 1.1 skrll /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
3611 1.1 skrll case because relocations against this section may use the
3612 1.1 skrll dynamic symbol table, and in that case bfd_section_from_shdr
3613 1.1 skrll in elf.c does not update the RELOC_COUNT. */
3614 1.1 skrll if (asect->size == 0)
3615 1.1 skrll return TRUE;
3616 1.1 skrll
3617 1.1 skrll rel_hdr = &d->this_hdr;
3618 1.1 skrll reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
3619 1.1 skrll rel_hdr2 = NULL;
3620 1.1 skrll reloc_count2 = 0;
3621 1.1 skrll }
3622 1.1 skrll
3623 1.1 skrll /* Allocate space for 3 arelent structures for each Rel structure. */
3624 1.1 skrll amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
3625 1.1 skrll relents = bfd_alloc (abfd, amt);
3626 1.3 christos if (relents == NULL)
3627 1.3 christos return FALSE;
3628 1.3 christos
3629 1.3 christos /* The slurp_one_reloc_table routine increments reloc_count. */
3630 1.3 christos asect->reloc_count = 0;
3631 1.3 christos
3632 1.3 christos if (rel_hdr != NULL
3633 1.3 christos && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
3634 1.3 christos rel_hdr, reloc_count,
3635 1.3 christos relents,
3636 1.3 christos symbols, dynamic))
3637 1.1 skrll return FALSE;
3638 1.1 skrll if (rel_hdr2 != NULL
3639 1.1 skrll && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
3640 1.1 skrll rel_hdr2, reloc_count2,
3641 1.1 skrll relents + reloc_count * 3,
3642 1.1 skrll symbols, dynamic))
3643 1.1 skrll return FALSE;
3644 1.1 skrll
3645 1.1 skrll asect->relocation = relents;
3646 1.1 skrll return TRUE;
3647 1.1 skrll }
3648 1.1 skrll
3649 1.1 skrll /* Write out the relocations. */
3650 1.1 skrll
3651 1.1 skrll static void
3652 1.1 skrll mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
3653 1.1 skrll {
3654 1.1 skrll bfd_boolean *failedp = data;
3655 1.1 skrll int count;
3656 1.1 skrll Elf_Internal_Shdr *rel_hdr;
3657 1.1 skrll unsigned int idx;
3658 1.1 skrll
3659 1.1 skrll /* If we have already failed, don't do anything. */
3660 1.1 skrll if (*failedp)
3661 1.1 skrll return;
3662 1.1 skrll
3663 1.1 skrll if ((sec->flags & SEC_RELOC) == 0)
3664 1.1 skrll return;
3665 1.1 skrll
3666 1.1 skrll /* The linker backend writes the relocs out itself, and sets the
3667 1.1 skrll reloc_count field to zero to inhibit writing them here. Also,
3668 1.1 skrll sometimes the SEC_RELOC flag gets set even when there aren't any
3669 1.1 skrll relocs. */
3670 1.1 skrll if (sec->reloc_count == 0)
3671 1.1 skrll return;
3672 1.1 skrll
3673 1.1 skrll /* We can combine up to three relocs that refer to the same address
3674 1.1 skrll if the latter relocs have no associated symbol. */
3675 1.1 skrll count = 0;
3676 1.1 skrll for (idx = 0; idx < sec->reloc_count; idx++)
3677 1.1 skrll {
3678 1.1 skrll bfd_vma addr;
3679 1.1 skrll unsigned int i;
3680 1.1 skrll
3681 1.1 skrll ++count;
3682 1.1 skrll
3683 1.1 skrll addr = sec->orelocation[idx]->address;
3684 1.1 skrll for (i = 0; i < 2; i++)
3685 1.1 skrll {
3686 1.1 skrll arelent *r;
3687 1.1 skrll
3688 1.1 skrll if (idx + 1 >= sec->reloc_count)
3689 1.1 skrll break;
3690 1.1 skrll r = sec->orelocation[idx + 1];
3691 1.1 skrll if (r->address != addr
3692 1.1 skrll || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
3693 1.1 skrll || (*r->sym_ptr_ptr)->value != 0)
3694 1.1 skrll break;
3695 1.1 skrll
3696 1.3 christos /* We can merge the reloc at IDX + 1 with the reloc at IDX. */
3697 1.1 skrll
3698 1.1 skrll ++idx;
3699 1.1 skrll }
3700 1.1 skrll }
3701 1.1 skrll
3702 1.1 skrll rel_hdr = _bfd_elf_single_rel_hdr (sec);
3703 1.1 skrll
3704 1.1 skrll /* Do the actual relocation. */
3705 1.1 skrll
3706 1.1 skrll if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
3707 1.1 skrll mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
3708 1.1 skrll else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
3709 1.1 skrll mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
3710 1.1 skrll else
3711 1.1 skrll BFD_ASSERT (0);
3712 1.1 skrll }
3713 1.1 skrll
3714 1.1 skrll static void
3715 1.1 skrll mips_elf64_write_rel (bfd *abfd, asection *sec,
3716 1.1 skrll Elf_Internal_Shdr *rel_hdr,
3717 1.1 skrll int *count, void *data)
3718 1.1 skrll {
3719 1.1 skrll bfd_boolean *failedp = data;
3720 1.1 skrll Elf64_Mips_External_Rel *ext_rel;
3721 1.1 skrll unsigned int idx;
3722 1.1 skrll asymbol *last_sym = 0;
3723 1.1 skrll int last_sym_idx = 0;
3724 1.1 skrll
3725 1.1 skrll rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
3726 1.1 skrll rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
3727 1.1 skrll if (rel_hdr->contents == NULL)
3728 1.1 skrll {
3729 1.1 skrll *failedp = TRUE;
3730 1.1 skrll return;
3731 1.1 skrll }
3732 1.1 skrll
3733 1.1 skrll ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
3734 1.1 skrll for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
3735 1.1 skrll {
3736 1.1 skrll arelent *ptr;
3737 1.1 skrll Elf64_Mips_Internal_Rela int_rel;
3738 1.1 skrll asymbol *sym;
3739 1.1 skrll int n;
3740 1.1 skrll unsigned int i;
3741 1.1 skrll
3742 1.1 skrll ptr = sec->orelocation[idx];
3743 1.1 skrll
3744 1.1 skrll /* The address of an ELF reloc is section relative for an object
3745 1.1 skrll file, and absolute for an executable file or shared library.
3746 1.1 skrll The address of a BFD reloc is always section relative. */
3747 1.1 skrll if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
3748 1.1 skrll int_rel.r_offset = ptr->address;
3749 1.1 skrll else
3750 1.1 skrll int_rel.r_offset = ptr->address + sec->vma;
3751 1.1 skrll
3752 1.1 skrll sym = *ptr->sym_ptr_ptr;
3753 1.1 skrll if (sym == last_sym)
3754 1.1 skrll n = last_sym_idx;
3755 1.1 skrll else if (bfd_is_abs_section (sym->section) && sym->value == 0)
3756 1.1 skrll n = STN_UNDEF;
3757 1.1 skrll else
3758 1.1 skrll {
3759 1.1 skrll last_sym = sym;
3760 1.1 skrll n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
3761 1.1 skrll if (n < 0)
3762 1.1 skrll {
3763 1.1 skrll *failedp = TRUE;
3764 1.1 skrll return;
3765 1.1 skrll }
3766 1.1 skrll last_sym_idx = n;
3767 1.1 skrll }
3768 1.1 skrll
3769 1.1 skrll int_rel.r_sym = n;
3770 1.1 skrll int_rel.r_ssym = RSS_UNDEF;
3771 1.1 skrll
3772 1.1 skrll if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
3773 1.1 skrll && ! _bfd_elf_validate_reloc (abfd, ptr))
3774 1.1 skrll {
3775 1.1 skrll *failedp = TRUE;
3776 1.1 skrll return;
3777 1.1 skrll }
3778 1.1 skrll
3779 1.1 skrll int_rel.r_type = ptr->howto->type;
3780 1.1 skrll int_rel.r_type2 = (int) R_MIPS_NONE;
3781 1.1 skrll int_rel.r_type3 = (int) R_MIPS_NONE;
3782 1.1 skrll
3783 1.1 skrll for (i = 0; i < 2; i++)
3784 1.1 skrll {
3785 1.1 skrll arelent *r;
3786 1.1 skrll
3787 1.1 skrll if (idx + 1 >= sec->reloc_count)
3788 1.1 skrll break;
3789 1.1 skrll r = sec->orelocation[idx + 1];
3790 1.1 skrll if (r->address != ptr->address
3791 1.1 skrll || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
3792 1.1 skrll || (*r->sym_ptr_ptr)->value != 0)
3793 1.1 skrll break;
3794 1.1 skrll
3795 1.1 skrll /* We can merge the reloc at IDX + 1 with the reloc at IDX. */
3796 1.1 skrll
3797 1.1 skrll if (i == 0)
3798 1.1 skrll int_rel.r_type2 = r->howto->type;
3799 1.1 skrll else
3800 1.1 skrll int_rel.r_type3 = r->howto->type;
3801 1.1 skrll
3802 1.1 skrll ++idx;
3803 1.1 skrll }
3804 1.1 skrll
3805 1.1 skrll mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
3806 1.1 skrll }
3807 1.1 skrll
3808 1.1 skrll BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
3809 1.1 skrll == *count);
3810 1.1 skrll }
3811 1.1 skrll
3812 1.1 skrll static void
3813 1.1 skrll mips_elf64_write_rela (bfd *abfd, asection *sec,
3814 1.1 skrll Elf_Internal_Shdr *rela_hdr,
3815 1.1 skrll int *count, void *data)
3816 1.1 skrll {
3817 1.1 skrll bfd_boolean *failedp = data;
3818 1.1 skrll Elf64_Mips_External_Rela *ext_rela;
3819 1.1 skrll unsigned int idx;
3820 1.1 skrll asymbol *last_sym = 0;
3821 1.1 skrll int last_sym_idx = 0;
3822 1.1 skrll
3823 1.1 skrll rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
3824 1.1 skrll rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
3825 1.1 skrll if (rela_hdr->contents == NULL)
3826 1.1 skrll {
3827 1.1 skrll *failedp = TRUE;
3828 1.1 skrll return;
3829 1.1 skrll }
3830 1.1 skrll
3831 1.1 skrll ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
3832 1.1 skrll for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
3833 1.1 skrll {
3834 1.1 skrll arelent *ptr;
3835 1.1 skrll Elf64_Mips_Internal_Rela int_rela;
3836 1.1 skrll asymbol *sym;
3837 1.1 skrll int n;
3838 1.1 skrll unsigned int i;
3839 1.1 skrll
3840 1.1 skrll ptr = sec->orelocation[idx];
3841 1.1 skrll
3842 1.1 skrll /* The address of an ELF reloc is section relative for an object
3843 1.1 skrll file, and absolute for an executable file or shared library.
3844 1.1 skrll The address of a BFD reloc is always section relative. */
3845 1.1 skrll if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
3846 1.1 skrll int_rela.r_offset = ptr->address;
3847 1.1 skrll else
3848 1.1 skrll int_rela.r_offset = ptr->address + sec->vma;
3849 1.1 skrll
3850 1.1 skrll sym = *ptr->sym_ptr_ptr;
3851 1.1 skrll if (sym == last_sym)
3852 1.1 skrll n = last_sym_idx;
3853 1.1 skrll else if (bfd_is_abs_section (sym->section) && sym->value == 0)
3854 1.1 skrll n = STN_UNDEF;
3855 1.1 skrll else
3856 1.1 skrll {
3857 1.1 skrll last_sym = sym;
3858 1.1 skrll n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
3859 1.1 skrll if (n < 0)
3860 1.1 skrll {
3861 1.1 skrll *failedp = TRUE;
3862 1.1 skrll return;
3863 1.1 skrll }
3864 1.1 skrll last_sym_idx = n;
3865 1.1 skrll }
3866 1.1 skrll
3867 1.1 skrll int_rela.r_sym = n;
3868 1.1 skrll int_rela.r_addend = ptr->addend;
3869 1.1 skrll int_rela.r_ssym = RSS_UNDEF;
3870 1.1 skrll
3871 1.1 skrll if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
3872 1.1 skrll && ! _bfd_elf_validate_reloc (abfd, ptr))
3873 1.1 skrll {
3874 1.1 skrll *failedp = TRUE;
3875 1.1 skrll return;
3876 1.1 skrll }
3877 1.1 skrll
3878 1.1 skrll int_rela.r_type = ptr->howto->type;
3879 1.1 skrll int_rela.r_type2 = (int) R_MIPS_NONE;
3880 1.1 skrll int_rela.r_type3 = (int) R_MIPS_NONE;
3881 1.1 skrll
3882 1.1 skrll for (i = 0; i < 2; i++)
3883 1.1 skrll {
3884 1.1 skrll arelent *r;
3885 1.1 skrll
3886 1.1 skrll if (idx + 1 >= sec->reloc_count)
3887 1.1 skrll break;
3888 1.1 skrll r = sec->orelocation[idx + 1];
3889 1.1 skrll if (r->address != ptr->address
3890 1.1 skrll || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
3891 1.1 skrll || (*r->sym_ptr_ptr)->value != 0)
3892 1.1 skrll break;
3893 1.1 skrll
3894 1.1 skrll /* We can merge the reloc at IDX + 1 with the reloc at IDX. */
3895 1.1 skrll
3896 1.1 skrll if (i == 0)
3897 1.1 skrll int_rela.r_type2 = r->howto->type;
3898 1.1 skrll else
3899 1.1 skrll int_rela.r_type3 = r->howto->type;
3900 1.1 skrll
3901 1.1 skrll ++idx;
3902 1.1 skrll }
3903 1.1 skrll
3904 1.1 skrll mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
3905 1.1 skrll }
3906 1.1 skrll
3907 1.1 skrll BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
3908 1.1 skrll == *count);
3909 1.1 skrll }
3910 1.1 skrll
3911 1.1 skrll /* Set the right machine number for a MIPS ELF file. */
3913 1.1 skrll
3914 1.1 skrll static bfd_boolean
3915 1.1 skrll mips_elf64_object_p (bfd *abfd)
3916 1.1 skrll {
3917 1.1 skrll unsigned long mach;
3918 1.1 skrll
3919 1.1 skrll /* Irix 6 is broken. Object file symbol tables are not always
3920 1.1 skrll sorted correctly such that local symbols precede global symbols,
3921 1.1 skrll and the sh_info field in the symbol table is not always right. */
3922 1.2 skrll if (elf64_mips_irix_compat (abfd) != ict_none)
3923 1.2 skrll elf_bad_symtab (abfd) = TRUE;
3924 1.2 skrll
3925 1.2 skrll mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
3926 1.2 skrll bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
3927 1.2 skrll return TRUE;
3928 1.2 skrll }
3929 1.1 skrll
3930 1.2 skrll /* MIPS ELF local labels start with "$L". */
3932 1.2 skrll static bfd_boolean
3933 1.2 skrll mips_elf64_is_local_label_name (bfd *abfd, const char *name)
3934 1.1 skrll {
3935 1.1 skrll if (name[0] == '$' && name[1] == 'L')
3936 1.1 skrll return TRUE;
3937 1.1 skrll
3938 1.1 skrll /* We accept the generic ELF local label syntax as well. */
3939 1.1 skrll return _bfd_elf_is_local_label_name (abfd, name);
3940 1.1 skrll }
3941 1.1 skrll
3942 1.1 skrll /* Depending on the target vector we generate some version of Irix
3944 1.1 skrll executables or "normal" MIPS ELF ABI executables. */
3945 1.1 skrll static irix_compat_t
3946 1.1 skrll elf64_mips_irix_compat (bfd *abfd)
3947 1.1 skrll {
3948 1.1 skrll if ((abfd->xvec == &bfd_elf64_bigmips_vec)
3949 1.1 skrll || (abfd->xvec == &bfd_elf64_littlemips_vec))
3950 1.1 skrll return ict_irix6;
3951 1.1 skrll else
3952 1.1 skrll return ict_none;
3953 1.1 skrll }
3954 1.1 skrll
3955 1.1 skrll /* Support for core dump NOTE sections. */
3957 1.1 skrll static bfd_boolean
3958 1.1 skrll elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3959 1.1 skrll {
3960 1.1 skrll int offset;
3961 1.1 skrll unsigned int size;
3962 1.1 skrll
3963 1.3 christos switch (note->descsz)
3964 1.1 skrll {
3965 1.1 skrll default:
3966 1.1 skrll return FALSE;
3967 1.1 skrll
3968 1.1 skrll case 480: /* Linux/MIPS - N64 kernel */
3969 1.1 skrll /* pr_cursig */
3970 1.1 skrll elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
3971 1.1 skrll
3972 1.1 skrll /* pr_pid */
3973 1.1 skrll elf_tdata (abfd)->core_lwpid = bfd_get_32 (abfd, note->descdata + 32);
3974 1.1 skrll
3975 1.1 skrll /* pr_reg */
3976 1.1 skrll offset = 112;
3977 1.1 skrll size = 360;
3978 1.1 skrll
3979 1.1 skrll break;
3980 1.1 skrll }
3981 1.1 skrll
3982 1.1 skrll /* Make a ".reg/999" section. */
3983 1.1 skrll return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3984 1.1 skrll size, note->descpos + offset);
3985 1.1 skrll }
3986 1.1 skrll
3987 1.1 skrll static bfd_boolean
3988 1.1 skrll elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3989 1.1 skrll {
3990 1.1 skrll switch (note->descsz)
3991 1.1 skrll {
3992 1.1 skrll default:
3993 1.1 skrll return FALSE;
3994 1.1 skrll
3995 1.1 skrll case 136: /* Linux/MIPS - N64 kernel elf_prpsinfo */
3996 1.1 skrll elf_tdata (abfd)->core_program
3997 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
3998 1.1 skrll elf_tdata (abfd)->core_command
3999 1.1 skrll = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
4000 1.1 skrll }
4001 1.1 skrll
4002 1.1 skrll /* Note that for some reason, a spurious space is tacked
4003 1.1 skrll onto the end of the args in some (at least one anyway)
4004 1.1 skrll implementations, so strip it off if it exists. */
4005 1.1 skrll
4006 1.1 skrll {
4007 1.1 skrll char *command = elf_tdata (abfd)->core_command;
4008 1.1 skrll int n = strlen (command);
4009 1.1 skrll
4010 1.1 skrll if (0 < n && command[n - 1] == ' ')
4011 1.1 skrll command[n - 1] = '\0';
4012 1.1 skrll }
4013 1.1 skrll
4014 1.1 skrll return TRUE;
4015 1.1 skrll }
4016 1.1 skrll
4017 1.1 skrll /* ECOFF swapping routines. These are used when dealing with the
4019 1.1 skrll .mdebug section, which is in the ECOFF debugging format. */
4020 1.1 skrll static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
4021 1.1 skrll {
4022 1.1 skrll /* Symbol table magic number. */
4023 1.1 skrll magicSym2,
4024 1.1 skrll /* Alignment of debugging information. E.g., 4. */
4025 1.1 skrll 8,
4026 1.1 skrll /* Sizes of external symbolic information. */
4027 1.1 skrll sizeof (struct hdr_ext),
4028 1.1 skrll sizeof (struct dnr_ext),
4029 1.1 skrll sizeof (struct pdr_ext),
4030 1.1 skrll sizeof (struct sym_ext),
4031 1.1 skrll sizeof (struct opt_ext),
4032 1.1 skrll sizeof (struct fdr_ext),
4033 1.1 skrll sizeof (struct rfd_ext),
4034 1.1 skrll sizeof (struct ext_ext),
4035 1.1 skrll /* Functions to swap in external symbolic data. */
4036 1.1 skrll ecoff_swap_hdr_in,
4037 1.1 skrll ecoff_swap_dnr_in,
4038 1.1 skrll ecoff_swap_pdr_in,
4039 1.1 skrll ecoff_swap_sym_in,
4040 1.1 skrll ecoff_swap_opt_in,
4041 1.1 skrll ecoff_swap_fdr_in,
4042 1.1 skrll ecoff_swap_rfd_in,
4043 1.1 skrll ecoff_swap_ext_in,
4044 1.1 skrll _bfd_ecoff_swap_tir_in,
4045 1.1 skrll _bfd_ecoff_swap_rndx_in,
4046 1.1 skrll /* Functions to swap out external symbolic data. */
4047 1.1 skrll ecoff_swap_hdr_out,
4048 1.1 skrll ecoff_swap_dnr_out,
4049 1.1 skrll ecoff_swap_pdr_out,
4050 1.1 skrll ecoff_swap_sym_out,
4051 1.1 skrll ecoff_swap_opt_out,
4052 1.1 skrll ecoff_swap_fdr_out,
4053 1.1 skrll ecoff_swap_rfd_out,
4054 1.1 skrll ecoff_swap_ext_out,
4055 1.1 skrll _bfd_ecoff_swap_tir_out,
4056 1.1 skrll _bfd_ecoff_swap_rndx_out,
4057 1.1 skrll /* Function to read in symbolic data. */
4058 1.1 skrll _bfd_mips_elf_read_ecoff_info
4059 1.1 skrll };
4060 1.1 skrll
4061 1.1 skrll /* Relocations in the 64 bit MIPS ELF ABI are more complex than in
4063 1.1 skrll standard ELF. This structure is used to redirect the relocation
4064 1.1 skrll handling routines. */
4065 1.1 skrll
4066 1.1 skrll const struct elf_size_info mips_elf64_size_info =
4067 1.1 skrll {
4068 1.1 skrll sizeof (Elf64_External_Ehdr),
4069 1.1 skrll sizeof (Elf64_External_Phdr),
4070 1.1 skrll sizeof (Elf64_External_Shdr),
4071 1.1 skrll sizeof (Elf64_Mips_External_Rel),
4072 1.1 skrll sizeof (Elf64_Mips_External_Rela),
4073 1.1 skrll sizeof (Elf64_External_Sym),
4074 1.1 skrll sizeof (Elf64_External_Dyn),
4075 1.1 skrll sizeof (Elf_External_Note),
4076 1.1 skrll 4, /* hash-table entry size */
4077 1.1 skrll 3, /* internal relocations per external relocations */
4078 1.1 skrll 64, /* arch_size */
4079 1.1 skrll 3, /* log_file_align */
4080 1.1 skrll ELFCLASS64,
4081 1.1 skrll EV_CURRENT,
4082 1.1 skrll bfd_elf64_write_out_phdrs,
4083 1.1 skrll bfd_elf64_write_shdrs_and_ehdr,
4084 1.1 skrll bfd_elf64_checksum_contents,
4085 1.1 skrll mips_elf64_write_relocs,
4086 1.1 skrll bfd_elf64_swap_symbol_in,
4087 1.3 christos bfd_elf64_swap_symbol_out,
4088 1.1 skrll mips_elf64_slurp_reloc_table,
4089 1.1 skrll bfd_elf64_slurp_symbol_table,
4090 1.1 skrll bfd_elf64_swap_dyn_in,
4091 1.1 skrll bfd_elf64_swap_dyn_out,
4092 1.1 skrll mips_elf64_be_swap_reloc_in,
4093 1.1 skrll mips_elf64_be_swap_reloc_out,
4094 1.1 skrll mips_elf64_be_swap_reloca_in,
4095 1.1 skrll mips_elf64_be_swap_reloca_out
4096 1.1 skrll };
4097 1.1 skrll
4098 1.1 skrll #define ELF_ARCH bfd_arch_mips
4099 1.1 skrll #define ELF_TARGET_ID MIPS_ELF_DATA
4100 1.1 skrll #define ELF_MACHINE_CODE EM_MIPS
4101 1.1 skrll
4102 1.1 skrll #define elf_backend_collect TRUE
4103 1.1 skrll #define elf_backend_type_change_ok TRUE
4104 1.1 skrll #define elf_backend_can_gc_sections TRUE
4105 1.1 skrll #define elf_info_to_howto mips_elf64_info_to_howto_rela
4106 1.1 skrll #define elf_info_to_howto_rel mips_elf64_info_to_howto_rel
4107 1.1 skrll #define elf_backend_object_p mips_elf64_object_p
4108 1.1 skrll #define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
4109 1.1 skrll #define elf_backend_section_processing _bfd_mips_elf_section_processing
4110 1.1 skrll #define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr
4111 1.1 skrll #define elf_backend_fake_sections _bfd_mips_elf_fake_sections
4112 1.1 skrll #define elf_backend_section_from_bfd_section \
4113 1.1 skrll _bfd_mips_elf_section_from_bfd_section
4114 1.1 skrll #define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook
4115 1.1 skrll #define elf_backend_link_output_symbol_hook \
4116 1.1 skrll _bfd_mips_elf_link_output_symbol_hook
4117 1.1 skrll #define elf_backend_create_dynamic_sections \
4118 1.1 skrll _bfd_mips_elf_create_dynamic_sections
4119 1.1 skrll #define elf_backend_check_relocs _bfd_mips_elf_check_relocs
4120 1.1 skrll #define elf_backend_merge_symbol_attribute \
4121 1.1 skrll _bfd_mips_elf_merge_symbol_attribute
4122 1.1 skrll #define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
4123 1.1 skrll #define elf_backend_adjust_dynamic_symbol \
4124 1.1 skrll _bfd_mips_elf_adjust_dynamic_symbol
4125 1.1 skrll #define elf_backend_always_size_sections \
4126 1.1 skrll _bfd_mips_elf_always_size_sections
4127 1.1 skrll #define elf_backend_size_dynamic_sections \
4128 1.1 skrll _bfd_mips_elf_size_dynamic_sections
4129 1.1 skrll #define elf_backend_init_index_section _bfd_elf_init_1_index_section
4130 1.1 skrll #define elf_backend_relocate_section _bfd_mips_elf_relocate_section
4131 1.1 skrll #define elf_backend_finish_dynamic_symbol \
4132 1.1 skrll _bfd_mips_elf_finish_dynamic_symbol
4133 1.1 skrll #define elf_backend_finish_dynamic_sections \
4134 1.1 skrll _bfd_mips_elf_finish_dynamic_sections
4135 1.1 skrll #define elf_backend_final_write_processing \
4136 1.1 skrll _bfd_mips_elf_final_write_processing
4137 1.1 skrll #define elf_backend_additional_program_headers \
4138 1.1 skrll _bfd_mips_elf_additional_program_headers
4139 1.1 skrll #define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map
4140 1.1 skrll #define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook
4141 1.1 skrll #define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook
4142 1.4 christos #define elf_backend_copy_indirect_symbol \
4143 1.1 skrll _bfd_mips_elf_copy_indirect_symbol
4144 1.1 skrll #define elf_backend_ignore_discarded_relocs \
4145 1.1 skrll _bfd_mips_elf_ignore_discarded_relocs
4146 1.1 skrll #define elf_backend_mips_irix_compat elf64_mips_irix_compat
4147 1.1 skrll #define elf_backend_mips_rtype_to_howto mips_elf64_rtype_to_howto
4148 1.1 skrll #define elf_backend_ecoff_debug_swap &mips_elf64_ecoff_debug_swap
4149 1.1 skrll #define elf_backend_size_info mips_elf64_size_info
4150 1.1 skrll
4151 1.1 skrll #define elf_backend_grok_prstatus elf64_mips_grok_prstatus
4152 1.1 skrll #define elf_backend_grok_psinfo elf64_mips_grok_psinfo
4153 1.1 skrll
4154 1.1 skrll #define elf_backend_got_header_size (8 * MIPS_RESERVED_GOTNO)
4155 1.1 skrll
4156 1.1 skrll /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
4157 1.4 christos work better/work only in RELA, so we default to this. */
4158 1.4 christos #define elf_backend_may_use_rel_p 1
4159 1.4 christos #define elf_backend_may_use_rela_p 1
4160 1.4 christos #define elf_backend_default_use_rela_p 1
4161 1.4 christos #define elf_backend_rela_plts_and_copies_p 0
4162 1.1 skrll #define elf_backend_plt_readonly 1
4163 1.1 skrll #define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val
4164 1.1 skrll
4165 1.1 skrll #define elf_backend_sign_extend_vma TRUE
4166 1.1 skrll
4167 1.1 skrll #define elf_backend_write_section _bfd_mips_elf_write_section
4168 1.1 skrll
4169 1.1 skrll /* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit
4170 1.1 skrll MIPS-specific function only applies to IRIX5, which had no 64-bit
4171 1.1 skrll ABI. */
4172 1.1 skrll #define bfd_elf64_bfd_is_target_special_symbol \
4173 1.1 skrll _bfd_mips_elf_is_target_special_symbol
4174 1.1 skrll #define bfd_elf64_find_nearest_line _bfd_mips_elf_find_nearest_line
4175 1.1 skrll #define bfd_elf64_find_inliner_info _bfd_mips_elf_find_inliner_info
4176 1.1 skrll #define bfd_elf64_new_section_hook _bfd_mips_elf_new_section_hook
4177 1.1 skrll #define bfd_elf64_set_section_contents _bfd_mips_elf_set_section_contents
4178 1.1 skrll #define bfd_elf64_bfd_get_relocated_section_contents \
4179 1.1 skrll _bfd_elf_mips_get_relocated_section_contents
4180 1.1 skrll #define bfd_elf64_bfd_link_hash_table_create \
4181 1.1 skrll _bfd_mips_elf_link_hash_table_create
4182 1.1 skrll #define bfd_elf64_bfd_final_link _bfd_mips_elf_final_link
4183 1.1 skrll #define bfd_elf64_bfd_merge_private_bfd_data \
4184 1.1 skrll _bfd_mips_elf_merge_private_bfd_data
4185 1.1 skrll #define bfd_elf64_bfd_set_private_flags _bfd_mips_elf_set_private_flags
4186 1.1 skrll #define bfd_elf64_bfd_print_private_bfd_data \
4187 1.1 skrll _bfd_mips_elf_print_private_bfd_data
4188 1.1 skrll
4189 1.1 skrll #define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound
4190 1.1 skrll #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc
4191 1.1 skrll #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
4192 1.1 skrll #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc
4193 1.1 skrll #define bfd_elf64_bfd_relax_section _bfd_mips_relax_section
4194 1.1 skrll
4195 1.1 skrll /* MIPS ELF64 archive functions. */
4196 1.3 christos #define bfd_elf64_archive_functions
4197 1.1 skrll extern bfd_boolean bfd_elf64_archive_slurp_armap
4198 1.1 skrll (bfd *);
4199 1.1 skrll extern bfd_boolean bfd_elf64_archive_write_armap
4200 1.1 skrll (bfd *, unsigned int, struct orl *, unsigned int, int);
4201 1.1 skrll #define bfd_elf64_archive_slurp_extended_name_table \
4202 1.1 skrll _bfd_archive_coff_slurp_extended_name_table
4203 1.1 skrll #define bfd_elf64_archive_construct_extended_name_table \
4204 1.1 skrll _bfd_archive_coff_construct_extended_name_table
4205 1.1 skrll #define bfd_elf64_archive_truncate_arname \
4206 1.1 skrll _bfd_archive_coff_truncate_arname
4207 1.1 skrll #define bfd_elf64_archive_read_ar_hdr _bfd_archive_coff_read_ar_hdr
4208 1.1 skrll #define bfd_elf64_archive_write_ar_hdr _bfd_archive_coff_write_ar_hdr
4209 1.1 skrll #define bfd_elf64_archive_openr_next_archived_file \
4210 1.1 skrll _bfd_archive_coff_openr_next_archived_file
4211 1.1 skrll #define bfd_elf64_archive_get_elt_at_index \
4212 1.1 skrll _bfd_archive_coff_get_elt_at_index
4213 1.1 skrll #define bfd_elf64_archive_generic_stat_arch_elt \
4214 1.1 skrll _bfd_archive_coff_generic_stat_arch_elt
4215 1.1 skrll #define bfd_elf64_archive_update_armap_timestamp \
4216 1.1 skrll _bfd_archive_coff_update_armap_timestamp
4217 1.1 skrll
4218 1.1 skrll /* The SGI style (n)64 NewABI. */
4219 1.1 skrll #define TARGET_LITTLE_SYM bfd_elf64_littlemips_vec
4220 1.1 skrll #define TARGET_LITTLE_NAME "elf64-littlemips"
4221 1.1 skrll #define TARGET_BIG_SYM bfd_elf64_bigmips_vec
4222 1.1 skrll #define TARGET_BIG_NAME "elf64-bigmips"
4223 1.1 skrll
4224 1.1 skrll #define ELF_MAXPAGESIZE 0x10000
4225 1.1 skrll #define ELF_COMMONPAGESIZE 0x1000
4226 1.1 skrll
4227 1.1 skrll #include "elf64-target.h"
4228 1.1 skrll
4229 1.1 skrll /* The SYSV-style 'traditional' (n)64 NewABI. */
4230 1.1 skrll #undef TARGET_LITTLE_SYM
4231 1.1 skrll #undef TARGET_LITTLE_NAME
4232 1.1 skrll #undef TARGET_BIG_SYM
4233 1.1 skrll #undef TARGET_BIG_NAME
4234 1.1 skrll
4235 1.1 skrll #undef ELF_MAXPAGESIZE
4236 1.1 skrll #undef ELF_COMMONPAGESIZE
4237 1.4 christos
4238 1.4 christos #define TARGET_LITTLE_SYM bfd_elf64_tradlittlemips_vec
4239 1.4 christos #define TARGET_LITTLE_NAME "elf64-tradlittlemips"
4240 1.4 christos #define TARGET_BIG_SYM bfd_elf64_tradbigmips_vec
4241 1.4 christos #define TARGET_BIG_NAME "elf64-tradbigmips"
4242 1.4 christos
4243 1.4 christos #define ELF_MAXPAGESIZE 0x10000
4244 1.4 christos #define ELF_COMMONPAGESIZE 0x1000
4245 1.4 christos #define elf64_bed elf64_tradbed
4246 1.4 christos
4247 1.4 christos /* Include the target file again for this target. */
4248 1.4 christos #include "elf64-target.h"
4249 1.4 christos
4250 1.4 christos
4251 1.4 christos /* FreeBSD support. */
4252 1.4 christos
4253 1.4 christos #undef TARGET_LITTLE_SYM
4254 1.4 christos #undef TARGET_LITTLE_NAME
4255 1.4 christos #undef TARGET_BIG_SYM
4256 1.4 christos #undef TARGET_BIG_NAME
4257 1.4 christos
4258 1.4 christos #define TARGET_LITTLE_SYM bfd_elf64_tradlittlemips_freebsd_vec
4259 1.4 christos #define TARGET_LITTLE_NAME "elf64-tradlittlemips-freebsd"
4260 1.4 christos #define TARGET_BIG_SYM bfd_elf64_tradbigmips_freebsd_vec
4261 1.4 christos #define TARGET_BIG_NAME "elf64-tradbigmips-freebsd"
4262 1.4 christos
4263 1.4 christos #undef ELF_OSABI
4264 1.4 christos #define ELF_OSABI ELFOSABI_FREEBSD
4265 1.4 christos
4266 1.4 christos /* The kernel recognizes executables as valid only if they carry a
4267 1.4 christos "FreeBSD" label in the ELF header. So we put this label on all
4268 1.4 christos executables and (for simplicity) also all other object files. */
4269 1.4 christos
4270 static void
4271 elf_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
4272 {
4273 _bfd_elf_set_osabi (abfd, info);
4274 }
4275
4276 #undef elf_backend_post_process_headers
4277 #define elf_backend_post_process_headers elf_fbsd_post_process_headers
4278 #undef elf64_bed
4279 #define elf64_bed elf64_fbsd_tradbed
4280
4281 #include "elf64-target.h"
4282