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