1 /* MIPS-specific support for 32-bit ELF
2 Copyright (C) 1993-2017 Free Software Foundation, Inc.
4 Most of the information added by Ian Lance Taylor, Cygnus Support,
6 N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
7 <mark@codesourcery.com>
8 Traditional MIPS targets support added by Koundinya.K, Dansk Data
9 Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
11 This file is part of BFD, the Binary File Descriptor library.
13 This program is free software; you can redistribute it and/or modify
14 it under the terms of the GNU General Public License as published by
15 the Free Software Foundation; either version 3 of the License, or
16 (at your option) any later version.
18 This program is distributed in the hope that it will be useful,
19 but WITHOUT ANY WARRANTY; without even the implied warranty of
20 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 GNU General Public License for more details.
23 You should have received a copy of the GNU General Public License
24 along with this program; if not, write to the Free Software
25 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
26 MA 02110-1301, USA. */
29 /* This file handles MIPS ELF targets. SGI Irix 5 uses a slightly
30 different MIPS ELF from other targets. This matters when linking.
31 This file supports both, switching at runtime. */
39 #include "elfxx-mips.h"
42 /* Get the ECOFF swapping routines. */
44 #include "coff/symconst.h"
45 #include "coff/internal.h"
46 #include "coff/ecoff.h"
47 #include "coff/mips.h"
48 #define ECOFF_SIGNED_32
49 #include "ecoffswap.h"
51 static bfd_boolean mips_elf_assign_gp
53 static bfd_reloc_status_type mips_elf_final_gp
54 (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
55 static bfd_reloc_status_type mips_elf_gprel16_reloc
56 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
57 static bfd_reloc_status_type mips_elf_literal_reloc
58 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
59 static bfd_reloc_status_type mips_elf_gprel32_reloc
60 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
61 static bfd_reloc_status_type gprel32_with_gp
62 (bfd *, asymbol *, arelent *, asection *, bfd_boolean, void *, bfd_vma);
63 static bfd_reloc_status_type mips_elf_shift6_reloc
64 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
65 static bfd_reloc_status_type mips16_gprel_reloc
66 (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
67 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
68 (bfd *, bfd_reloc_code_real_type);
69 static reloc_howto_type *mips_elf_n32_rtype_to_howto
70 (unsigned int, bfd_boolean);
71 static void mips_info_to_howto_rel
72 (bfd *, arelent *, Elf_Internal_Rela *);
73 static void mips_info_to_howto_rela
74 (bfd *, arelent *, Elf_Internal_Rela *);
75 static bfd_boolean mips_elf_sym_is_global
77 static bfd_boolean mips_elf_n32_object_p
79 static bfd_boolean elf32_mips_grok_prstatus
80 (bfd *, Elf_Internal_Note *);
81 static bfd_boolean elf32_mips_grok_psinfo
82 (bfd *, Elf_Internal_Note *);
83 static bfd_boolean elf_n32_mips_grok_freebsd_prstatus
84 (bfd *, Elf_Internal_Note *);
85 static irix_compat_t elf_n32_mips_irix_compat
87 static bfd_boolean mips_elf_n32_mkobject
90 extern const bfd_target mips_elf32_n_be_vec;
91 extern const bfd_target mips_elf32_n_le_vec;
93 /* Nonzero if ABFD is using the N32 ABI. */
94 #define ABI_N32_P(abfd) \
95 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
97 /* Whether we are trying to be compatible with IRIX at all. */
98 #define SGI_COMPAT(abfd) \
99 (elf_n32_mips_irix_compat (abfd) != ict_none)
101 /* The number of local .got entries we reserve. */
102 #define MIPS_RESERVED_GOTNO (2)
104 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
105 from smaller values. Start with zero, widen, *then* decrement. */
106 #define MINUS_ONE (((bfd_vma)0) - 1)
108 /* The relocation table used for SHT_REL sections. */
110 static reloc_howto_type elf_mips_howto_table_rel[] =
113 HOWTO (R_MIPS_NONE, /* type */
115 3, /* size (0 = byte, 1 = short, 2 = long) */
117 FALSE, /* pc_relative */
119 complain_overflow_dont, /* complain_on_overflow */
120 _bfd_mips_elf_generic_reloc, /* special_function */
121 "R_MIPS_NONE", /* name */
122 FALSE, /* partial_inplace */
125 FALSE), /* pcrel_offset */
127 /* 16 bit relocation. */
128 HOWTO (R_MIPS_16, /* type */
130 2, /* size (0 = byte, 1 = short, 2 = long) */
132 FALSE, /* pc_relative */
134 complain_overflow_signed, /* complain_on_overflow */
135 _bfd_mips_elf_generic_reloc, /* special_function */
136 "R_MIPS_16", /* name */
137 TRUE, /* partial_inplace */
138 0x0000ffff, /* src_mask */
139 0x0000ffff, /* dst_mask */
140 FALSE), /* pcrel_offset */
142 /* 32 bit relocation. */
143 HOWTO (R_MIPS_32, /* type */
145 2, /* size (0 = byte, 1 = short, 2 = long) */
147 FALSE, /* pc_relative */
149 complain_overflow_dont, /* complain_on_overflow */
150 _bfd_mips_elf_generic_reloc, /* special_function */
151 "R_MIPS_32", /* name */
152 TRUE, /* partial_inplace */
153 0xffffffff, /* src_mask */
154 0xffffffff, /* dst_mask */
155 FALSE), /* pcrel_offset */
157 /* 32 bit symbol relative relocation. */
158 HOWTO (R_MIPS_REL32, /* type */
160 2, /* size (0 = byte, 1 = short, 2 = long) */
162 FALSE, /* pc_relative */
164 complain_overflow_dont, /* complain_on_overflow */
165 _bfd_mips_elf_generic_reloc, /* special_function */
166 "R_MIPS_REL32", /* name */
167 TRUE, /* partial_inplace */
168 0xffffffff, /* src_mask */
169 0xffffffff, /* dst_mask */
170 FALSE), /* pcrel_offset */
172 /* 26 bit jump address. */
173 HOWTO (R_MIPS_26, /* type */
175 2, /* size (0 = byte, 1 = short, 2 = long) */
177 FALSE, /* pc_relative */
179 complain_overflow_dont, /* complain_on_overflow */
180 /* This needs complex overflow
181 detection, because the upper four
182 bits must match the PC + 4. */
183 _bfd_mips_elf_generic_reloc, /* special_function */
184 "R_MIPS_26", /* name */
185 TRUE, /* partial_inplace */
186 0x03ffffff, /* src_mask */
187 0x03ffffff, /* dst_mask */
188 FALSE), /* pcrel_offset */
190 /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
191 However, the native IRIX6 tools use them, so we try our best. */
193 /* High 16 bits of symbol value. */
194 HOWTO (R_MIPS_HI16, /* type */
196 2, /* size (0 = byte, 1 = short, 2 = long) */
198 FALSE, /* pc_relative */
200 complain_overflow_dont, /* complain_on_overflow */
201 _bfd_mips_elf_hi16_reloc, /* special_function */
202 "R_MIPS_HI16", /* name */
203 TRUE, /* partial_inplace */
204 0x0000ffff, /* src_mask */
205 0x0000ffff, /* dst_mask */
206 FALSE), /* pcrel_offset */
208 /* Low 16 bits of symbol value. */
209 HOWTO (R_MIPS_LO16, /* type */
211 2, /* size (0 = byte, 1 = short, 2 = long) */
213 FALSE, /* pc_relative */
215 complain_overflow_dont, /* complain_on_overflow */
216 _bfd_mips_elf_lo16_reloc, /* special_function */
217 "R_MIPS_LO16", /* name */
218 TRUE, /* partial_inplace */
219 0x0000ffff, /* src_mask */
220 0x0000ffff, /* dst_mask */
221 FALSE), /* pcrel_offset */
223 /* GP relative reference. */
224 HOWTO (R_MIPS_GPREL16, /* type */
226 2, /* size (0 = byte, 1 = short, 2 = long) */
228 FALSE, /* pc_relative */
230 complain_overflow_signed, /* complain_on_overflow */
231 mips_elf_gprel16_reloc, /* special_function */
232 "R_MIPS_GPREL16", /* name */
233 TRUE, /* partial_inplace */
234 0x0000ffff, /* src_mask */
235 0x0000ffff, /* dst_mask */
236 FALSE), /* pcrel_offset */
238 /* Reference to literal section. */
239 HOWTO (R_MIPS_LITERAL, /* type */
241 2, /* size (0 = byte, 1 = short, 2 = long) */
243 FALSE, /* pc_relative */
245 complain_overflow_signed, /* complain_on_overflow */
246 mips_elf_literal_reloc, /* special_function */
247 "R_MIPS_LITERAL", /* name */
248 TRUE, /* partial_inplace */
249 0x0000ffff, /* src_mask */
250 0x0000ffff, /* dst_mask */
251 FALSE), /* pcrel_offset */
253 /* Reference to global offset table. */
254 HOWTO (R_MIPS_GOT16, /* type */
256 2, /* size (0 = byte, 1 = short, 2 = long) */
258 FALSE, /* pc_relative */
260 complain_overflow_signed, /* complain_on_overflow */
261 _bfd_mips_elf_got16_reloc, /* special_function */
262 "R_MIPS_GOT16", /* name */
263 TRUE, /* partial_inplace */
264 0x0000ffff, /* src_mask */
265 0x0000ffff, /* dst_mask */
266 FALSE), /* pcrel_offset */
268 /* 16 bit PC relative reference. Note that the ABI document has a typo
269 and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
270 We do the right thing here. */
271 HOWTO (R_MIPS_PC16, /* type */
273 2, /* size (0 = byte, 1 = short, 2 = long) */
275 TRUE, /* pc_relative */
277 complain_overflow_signed, /* complain_on_overflow */
278 _bfd_mips_elf_generic_reloc, /* special_function */
279 "R_MIPS_PC16", /* name */
280 TRUE, /* partial_inplace */
281 0x0000ffff, /* src_mask */
282 0x0000ffff, /* dst_mask */
283 TRUE), /* pcrel_offset */
285 /* 16 bit call through global offset table. */
286 HOWTO (R_MIPS_CALL16, /* type */
288 2, /* size (0 = byte, 1 = short, 2 = long) */
290 FALSE, /* pc_relative */
292 complain_overflow_signed, /* complain_on_overflow */
293 _bfd_mips_elf_generic_reloc, /* special_function */
294 "R_MIPS_CALL16", /* name */
295 TRUE, /* partial_inplace */
296 0x0000ffff, /* src_mask */
297 0x0000ffff, /* dst_mask */
298 FALSE), /* pcrel_offset */
300 /* 32 bit GP relative reference. */
301 HOWTO (R_MIPS_GPREL32, /* type */
303 2, /* size (0 = byte, 1 = short, 2 = long) */
305 FALSE, /* pc_relative */
307 complain_overflow_dont, /* complain_on_overflow */
308 mips_elf_gprel32_reloc, /* special_function */
309 "R_MIPS_GPREL32", /* name */
310 TRUE, /* partial_inplace */
311 0xffffffff, /* src_mask */
312 0xffffffff, /* dst_mask */
313 FALSE), /* pcrel_offset */
315 /* The remaining relocs are defined on Irix 5, although they are
316 not defined by the ABI. */
321 /* A 5 bit shift field. */
322 HOWTO (R_MIPS_SHIFT5, /* type */
324 2, /* size (0 = byte, 1 = short, 2 = long) */
326 FALSE, /* pc_relative */
328 complain_overflow_bitfield, /* complain_on_overflow */
329 _bfd_mips_elf_generic_reloc, /* special_function */
330 "R_MIPS_SHIFT5", /* name */
331 TRUE, /* partial_inplace */
332 0x000007c0, /* src_mask */
333 0x000007c0, /* dst_mask */
334 FALSE), /* pcrel_offset */
336 /* A 6 bit shift field. */
337 HOWTO (R_MIPS_SHIFT6, /* type */
339 2, /* size (0 = byte, 1 = short, 2 = long) */
341 FALSE, /* pc_relative */
343 complain_overflow_bitfield, /* complain_on_overflow */
344 mips_elf_shift6_reloc, /* special_function */
345 "R_MIPS_SHIFT6", /* name */
346 TRUE, /* partial_inplace */
347 0x000007c4, /* src_mask */
348 0x000007c4, /* dst_mask */
349 FALSE), /* pcrel_offset */
351 /* A 64 bit relocation. */
352 HOWTO (R_MIPS_64, /* type */
354 4, /* size (0 = byte, 1 = short, 2 = long) */
356 FALSE, /* pc_relative */
358 complain_overflow_dont, /* complain_on_overflow */
359 _bfd_mips_elf_generic_reloc, /* special_function */
360 "R_MIPS_64", /* name */
361 TRUE, /* partial_inplace */
362 MINUS_ONE, /* src_mask */
363 MINUS_ONE, /* dst_mask */
364 FALSE), /* pcrel_offset */
366 /* Displacement in the global offset table. */
367 HOWTO (R_MIPS_GOT_DISP, /* type */
369 2, /* size (0 = byte, 1 = short, 2 = long) */
371 FALSE, /* pc_relative */
373 complain_overflow_signed, /* complain_on_overflow */
374 _bfd_mips_elf_generic_reloc, /* special_function */
375 "R_MIPS_GOT_DISP", /* name */
376 TRUE, /* partial_inplace */
377 0x0000ffff, /* src_mask */
378 0x0000ffff, /* dst_mask */
379 FALSE), /* pcrel_offset */
381 /* Displacement to page pointer in the global offset table. */
382 HOWTO (R_MIPS_GOT_PAGE, /* type */
384 2, /* size (0 = byte, 1 = short, 2 = long) */
386 FALSE, /* pc_relative */
388 complain_overflow_signed, /* complain_on_overflow */
389 _bfd_mips_elf_generic_reloc, /* special_function */
390 "R_MIPS_GOT_PAGE", /* name */
391 TRUE, /* partial_inplace */
392 0x0000ffff, /* src_mask */
393 0x0000ffff, /* dst_mask */
394 FALSE), /* pcrel_offset */
396 /* Offset from page pointer in the global offset table. */
397 HOWTO (R_MIPS_GOT_OFST, /* type */
399 2, /* size (0 = byte, 1 = short, 2 = long) */
401 FALSE, /* pc_relative */
403 complain_overflow_signed, /* complain_on_overflow */
404 _bfd_mips_elf_generic_reloc, /* special_function */
405 "R_MIPS_GOT_OFST", /* name */
406 TRUE, /* partial_inplace */
407 0x0000ffff, /* src_mask */
408 0x0000ffff, /* dst_mask */
409 FALSE), /* pcrel_offset */
411 /* High 16 bits of displacement in global offset table. */
412 HOWTO (R_MIPS_GOT_HI16, /* type */
414 2, /* size (0 = byte, 1 = short, 2 = long) */
416 FALSE, /* pc_relative */
418 complain_overflow_dont, /* complain_on_overflow */
419 _bfd_mips_elf_generic_reloc, /* special_function */
420 "R_MIPS_GOT_HI16", /* name */
421 TRUE, /* partial_inplace */
422 0x0000ffff, /* src_mask */
423 0x0000ffff, /* dst_mask */
424 FALSE), /* pcrel_offset */
426 /* Low 16 bits of displacement in global offset table. */
427 HOWTO (R_MIPS_GOT_LO16, /* type */
429 2, /* size (0 = byte, 1 = short, 2 = long) */
431 FALSE, /* pc_relative */
433 complain_overflow_dont, /* complain_on_overflow */
434 _bfd_mips_elf_generic_reloc, /* special_function */
435 "R_MIPS_GOT_LO16", /* name */
436 TRUE, /* partial_inplace */
437 0x0000ffff, /* src_mask */
438 0x0000ffff, /* dst_mask */
439 FALSE), /* pcrel_offset */
441 /* 64 bit subtraction. */
442 HOWTO (R_MIPS_SUB, /* type */
444 4, /* size (0 = byte, 1 = short, 2 = long) */
446 FALSE, /* pc_relative */
448 complain_overflow_dont, /* complain_on_overflow */
449 _bfd_mips_elf_generic_reloc, /* special_function */
450 "R_MIPS_SUB", /* name */
451 TRUE, /* partial_inplace */
452 MINUS_ONE, /* src_mask */
453 MINUS_ONE, /* dst_mask */
454 FALSE), /* pcrel_offset */
456 /* Insert the addend as an instruction. */
457 /* FIXME: Not handled correctly. */
458 HOWTO (R_MIPS_INSERT_A, /* type */
460 2, /* size (0 = byte, 1 = short, 2 = long) */
462 FALSE, /* pc_relative */
464 complain_overflow_dont, /* complain_on_overflow */
465 _bfd_mips_elf_generic_reloc, /* special_function */
466 "R_MIPS_INSERT_A", /* name */
467 TRUE, /* partial_inplace */
468 0xffffffff, /* src_mask */
469 0xffffffff, /* dst_mask */
470 FALSE), /* pcrel_offset */
472 /* Insert the addend as an instruction, and change all relocations
473 to refer to the old instruction at the address. */
474 /* FIXME: Not handled correctly. */
475 HOWTO (R_MIPS_INSERT_B, /* type */
477 2, /* size (0 = byte, 1 = short, 2 = long) */
479 FALSE, /* pc_relative */
481 complain_overflow_dont, /* complain_on_overflow */
482 _bfd_mips_elf_generic_reloc, /* special_function */
483 "R_MIPS_INSERT_B", /* name */
484 TRUE, /* partial_inplace */
485 0xffffffff, /* src_mask */
486 0xffffffff, /* dst_mask */
487 FALSE), /* pcrel_offset */
489 /* Delete a 32 bit instruction. */
490 /* FIXME: Not handled correctly. */
491 HOWTO (R_MIPS_DELETE, /* type */
493 2, /* size (0 = byte, 1 = short, 2 = long) */
495 FALSE, /* pc_relative */
497 complain_overflow_dont, /* complain_on_overflow */
498 _bfd_mips_elf_generic_reloc, /* special_function */
499 "R_MIPS_DELETE", /* name */
500 TRUE, /* partial_inplace */
501 0xffffffff, /* src_mask */
502 0xffffffff, /* dst_mask */
503 FALSE), /* pcrel_offset */
505 /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
507 a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
508 R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
510 b) No other NewABI toolchain actually emits such relocations. */
511 EMPTY_HOWTO (R_MIPS_HIGHER),
512 EMPTY_HOWTO (R_MIPS_HIGHEST),
514 /* High 16 bits of displacement in global offset table. */
515 HOWTO (R_MIPS_CALL_HI16, /* type */
517 2, /* size (0 = byte, 1 = short, 2 = long) */
519 FALSE, /* pc_relative */
521 complain_overflow_dont, /* complain_on_overflow */
522 _bfd_mips_elf_generic_reloc, /* special_function */
523 "R_MIPS_CALL_HI16", /* name */
524 TRUE, /* partial_inplace */
525 0x0000ffff, /* src_mask */
526 0x0000ffff, /* dst_mask */
527 FALSE), /* pcrel_offset */
529 /* Low 16 bits of displacement in global offset table. */
530 HOWTO (R_MIPS_CALL_LO16, /* type */
532 2, /* size (0 = byte, 1 = short, 2 = long) */
534 FALSE, /* pc_relative */
536 complain_overflow_dont, /* complain_on_overflow */
537 _bfd_mips_elf_generic_reloc, /* special_function */
538 "R_MIPS_CALL_LO16", /* name */
539 TRUE, /* partial_inplace */
540 0x0000ffff, /* src_mask */
541 0x0000ffff, /* dst_mask */
542 FALSE), /* pcrel_offset */
544 /* Section displacement. */
545 HOWTO (R_MIPS_SCN_DISP, /* type */
547 2, /* size (0 = byte, 1 = short, 2 = long) */
549 FALSE, /* pc_relative */
551 complain_overflow_dont, /* complain_on_overflow */
552 _bfd_mips_elf_generic_reloc, /* special_function */
553 "R_MIPS_SCN_DISP", /* name */
554 TRUE, /* partial_inplace */
555 0xffffffff, /* src_mask */
556 0xffffffff, /* dst_mask */
557 FALSE), /* pcrel_offset */
559 HOWTO (R_MIPS_REL16, /* type */
561 1, /* size (0 = byte, 1 = short, 2 = long) */
563 FALSE, /* pc_relative */
565 complain_overflow_signed, /* complain_on_overflow */
566 _bfd_mips_elf_generic_reloc, /* special_function */
567 "R_MIPS_REL16", /* name */
568 TRUE, /* partial_inplace */
569 0xffff, /* src_mask */
570 0xffff, /* dst_mask */
571 FALSE), /* pcrel_offset */
573 /* These two are obsolete. */
574 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
575 EMPTY_HOWTO (R_MIPS_PJUMP),
577 /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
578 It must be used for multigot GOT's (and only there). */
579 HOWTO (R_MIPS_RELGOT, /* type */
581 2, /* size (0 = byte, 1 = short, 2 = long) */
583 FALSE, /* pc_relative */
585 complain_overflow_dont, /* complain_on_overflow */
586 _bfd_mips_elf_generic_reloc, /* special_function */
587 "R_MIPS_RELGOT", /* name */
588 TRUE, /* partial_inplace */
589 0xffffffff, /* src_mask */
590 0xffffffff, /* dst_mask */
591 FALSE), /* pcrel_offset */
593 /* Protected jump conversion. This is an optimization hint. No
594 relocation is required for correctness. */
595 HOWTO (R_MIPS_JALR, /* type */
597 2, /* size (0 = byte, 1 = short, 2 = long) */
599 FALSE, /* pc_relative */
601 complain_overflow_dont, /* complain_on_overflow */
602 _bfd_mips_elf_generic_reloc, /* special_function */
603 "R_MIPS_JALR", /* name */
604 FALSE, /* partial_inplace */
605 0x00000000, /* src_mask */
606 0x00000000, /* dst_mask */
607 FALSE), /* pcrel_offset */
609 /* TLS GD/LD dynamic relocations. */
610 HOWTO (R_MIPS_TLS_DTPMOD32, /* type */
612 2, /* size (0 = byte, 1 = short, 2 = long) */
614 FALSE, /* pc_relative */
616 complain_overflow_dont, /* complain_on_overflow */
617 _bfd_mips_elf_generic_reloc, /* special_function */
618 "R_MIPS_TLS_DTPMOD32", /* name */
619 TRUE, /* partial_inplace */
620 0xffffffff, /* src_mask */
621 0xffffffff, /* dst_mask */
622 FALSE), /* pcrel_offset */
624 HOWTO (R_MIPS_TLS_DTPREL32, /* type */
626 2, /* size (0 = byte, 1 = short, 2 = long) */
628 FALSE, /* pc_relative */
630 complain_overflow_dont, /* complain_on_overflow */
631 _bfd_mips_elf_generic_reloc, /* special_function */
632 "R_MIPS_TLS_DTPREL32", /* name */
633 TRUE, /* partial_inplace */
634 0xffffffff, /* src_mask */
635 0xffffffff, /* dst_mask */
636 FALSE), /* pcrel_offset */
638 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
639 EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
641 /* TLS general dynamic variable reference. */
642 HOWTO (R_MIPS_TLS_GD, /* type */
644 2, /* size (0 = byte, 1 = short, 2 = long) */
646 FALSE, /* pc_relative */
648 complain_overflow_signed, /* complain_on_overflow */
649 _bfd_mips_elf_generic_reloc, /* special_function */
650 "R_MIPS_TLS_GD", /* name */
651 TRUE, /* partial_inplace */
652 0x0000ffff, /* src_mask */
653 0x0000ffff, /* dst_mask */
654 FALSE), /* pcrel_offset */
656 /* TLS local dynamic variable reference. */
657 HOWTO (R_MIPS_TLS_LDM, /* type */
659 2, /* size (0 = byte, 1 = short, 2 = long) */
661 FALSE, /* pc_relative */
663 complain_overflow_signed, /* complain_on_overflow */
664 _bfd_mips_elf_generic_reloc, /* special_function */
665 "R_MIPS_TLS_LDM", /* name */
666 TRUE, /* partial_inplace */
667 0x0000ffff, /* src_mask */
668 0x0000ffff, /* dst_mask */
669 FALSE), /* pcrel_offset */
671 /* TLS local dynamic offset. */
672 HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
674 2, /* size (0 = byte, 1 = short, 2 = long) */
676 FALSE, /* pc_relative */
678 complain_overflow_signed, /* complain_on_overflow */
679 _bfd_mips_elf_generic_reloc, /* special_function */
680 "R_MIPS_TLS_DTPREL_HI16", /* name */
681 TRUE, /* partial_inplace */
682 0x0000ffff, /* src_mask */
683 0x0000ffff, /* dst_mask */
684 FALSE), /* pcrel_offset */
686 /* TLS local dynamic offset. */
687 HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
689 2, /* size (0 = byte, 1 = short, 2 = long) */
691 FALSE, /* pc_relative */
693 complain_overflow_signed, /* complain_on_overflow */
694 _bfd_mips_elf_generic_reloc, /* special_function */
695 "R_MIPS_TLS_DTPREL_LO16", /* name */
696 TRUE, /* partial_inplace */
697 0x0000ffff, /* src_mask */
698 0x0000ffff, /* dst_mask */
699 FALSE), /* pcrel_offset */
701 /* TLS thread pointer offset. */
702 HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
704 2, /* size (0 = byte, 1 = short, 2 = long) */
706 FALSE, /* pc_relative */
708 complain_overflow_signed, /* complain_on_overflow */
709 _bfd_mips_elf_generic_reloc, /* special_function */
710 "R_MIPS_TLS_GOTTPREL", /* name */
711 TRUE, /* partial_inplace */
712 0x0000ffff, /* src_mask */
713 0x0000ffff, /* dst_mask */
714 FALSE), /* pcrel_offset */
716 /* TLS IE dynamic relocations. */
717 HOWTO (R_MIPS_TLS_TPREL32, /* type */
719 2, /* size (0 = byte, 1 = short, 2 = long) */
721 FALSE, /* pc_relative */
723 complain_overflow_dont, /* complain_on_overflow */
724 _bfd_mips_elf_generic_reloc, /* special_function */
725 "R_MIPS_TLS_TPREL32", /* name */
726 TRUE, /* partial_inplace */
727 0xffffffff, /* src_mask */
728 0xffffffff, /* dst_mask */
729 FALSE), /* pcrel_offset */
731 EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
733 /* TLS thread pointer offset. */
734 HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
736 2, /* size (0 = byte, 1 = short, 2 = long) */
738 FALSE, /* pc_relative */
740 complain_overflow_signed, /* complain_on_overflow */
741 _bfd_mips_elf_generic_reloc, /* special_function */
742 "R_MIPS_TLS_TPREL_HI16", /* name */
743 TRUE, /* partial_inplace */
744 0x0000ffff, /* src_mask */
745 0x0000ffff, /* dst_mask */
746 FALSE), /* pcrel_offset */
748 /* TLS thread pointer offset. */
749 HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
751 2, /* size (0 = byte, 1 = short, 2 = long) */
753 FALSE, /* pc_relative */
755 complain_overflow_signed, /* complain_on_overflow */
756 _bfd_mips_elf_generic_reloc, /* special_function */
757 "R_MIPS_TLS_TPREL_LO16", /* name */
758 TRUE, /* partial_inplace */
759 0x0000ffff, /* src_mask */
760 0x0000ffff, /* dst_mask */
761 FALSE), /* pcrel_offset */
763 /* 32 bit relocation with no addend. */
764 HOWTO (R_MIPS_GLOB_DAT, /* type */
766 2, /* size (0 = byte, 1 = short, 2 = long) */
768 FALSE, /* pc_relative */
770 complain_overflow_dont, /* complain_on_overflow */
771 _bfd_mips_elf_generic_reloc, /* special_function */
772 "R_MIPS_GLOB_DAT", /* name */
773 FALSE, /* partial_inplace */
775 0xffffffff, /* dst_mask */
776 FALSE), /* pcrel_offset */
787 HOWTO (R_MIPS_PC21_S2, /* type */
789 2, /* size (0 = byte, 1 = short, 2 = long) */
791 TRUE, /* pc_relative */
793 complain_overflow_signed, /* complain_on_overflow */
794 _bfd_mips_elf_generic_reloc, /* special_function */
795 "R_MIPS_PC21_S2", /* name */
796 TRUE, /* partial_inplace */
797 0x001fffff, /* src_mask */
798 0x001fffff, /* dst_mask */
799 TRUE), /* pcrel_offset */
801 HOWTO (R_MIPS_PC26_S2, /* type */
803 2, /* size (0 = byte, 1 = short, 2 = long) */
805 TRUE, /* pc_relative */
807 complain_overflow_signed, /* complain_on_overflow */
808 _bfd_mips_elf_generic_reloc, /* special_function */
809 "R_MIPS_PC26_S2", /* name */
810 TRUE, /* partial_inplace */
811 0x03ffffff, /* src_mask */
812 0x03ffffff, /* dst_mask */
813 TRUE), /* pcrel_offset */
815 HOWTO (R_MIPS_PC18_S3, /* type */
817 2, /* size (0 = byte, 1 = short, 2 = long) */
819 TRUE, /* pc_relative */
821 complain_overflow_signed, /* complain_on_overflow */
822 _bfd_mips_elf_generic_reloc, /* special_function */
823 "R_MIPS_PC18_S3", /* name */
824 TRUE, /* partial_inplace */
825 0x0003ffff, /* src_mask */
826 0x0003ffff, /* dst_mask */
827 TRUE), /* pcrel_offset */
829 HOWTO (R_MIPS_PC19_S2, /* type */
831 2, /* size (0 = byte, 1 = short, 2 = long) */
833 TRUE, /* pc_relative */
835 complain_overflow_signed, /* complain_on_overflow */
836 _bfd_mips_elf_generic_reloc, /* special_function */
837 "R_MIPS_PC19_S2", /* name */
838 TRUE, /* partial_inplace */
839 0x0007ffff, /* src_mask */
840 0x0007ffff, /* dst_mask */
841 TRUE), /* pcrel_offset */
843 HOWTO (R_MIPS_PCHI16, /* type */
845 2, /* size (0 = byte, 1 = short, 2 = long) */
847 TRUE, /* pc_relative */
849 complain_overflow_signed, /* complain_on_overflow */
850 _bfd_mips_elf_generic_reloc, /* special_function */
851 "R_MIPS_PCHI16", /* name */
852 TRUE, /* partial_inplace */
853 0x0000ffff, /* src_mask */
854 0x0000ffff, /* dst_mask */
855 TRUE), /* pcrel_offset */
857 HOWTO (R_MIPS_PCLO16, /* type */
859 2, /* size (0 = byte, 1 = short, 2 = long) */
861 TRUE, /* pc_relative */
863 complain_overflow_dont, /* complain_on_overflow */
864 _bfd_mips_elf_generic_reloc, /* special_function */
865 "R_MIPS_PCLO16", /* name */
866 TRUE, /* partial_inplace */
867 0x0000ffff, /* src_mask */
868 0x0000ffff, /* dst_mask */
869 TRUE), /* pcrel_offset */
873 /* The relocation table used for SHT_RELA sections. */
875 static reloc_howto_type elf_mips_howto_table_rela[] =
878 HOWTO (R_MIPS_NONE, /* type */
880 0, /* size (0 = byte, 1 = short, 2 = long) */
882 FALSE, /* pc_relative */
884 complain_overflow_dont, /* complain_on_overflow */
885 _bfd_mips_elf_generic_reloc, /* special_function */
886 "R_MIPS_NONE", /* name */
887 FALSE, /* partial_inplace */
890 FALSE), /* pcrel_offset */
892 /* 16 bit relocation. */
893 HOWTO (R_MIPS_16, /* type */
895 2, /* size (0 = byte, 1 = short, 2 = long) */
897 FALSE, /* pc_relative */
899 complain_overflow_signed, /* complain_on_overflow */
900 _bfd_mips_elf_generic_reloc, /* special_function */
901 "R_MIPS_16", /* name */
902 FALSE, /* partial_inplace */
904 0x0000, /* dst_mask */
905 FALSE), /* pcrel_offset */
907 /* 32 bit relocation. */
908 HOWTO (R_MIPS_32, /* type */
910 2, /* size (0 = byte, 1 = short, 2 = long) */
912 FALSE, /* pc_relative */
914 complain_overflow_dont, /* complain_on_overflow */
915 _bfd_mips_elf_generic_reloc, /* special_function */
916 "R_MIPS_32", /* name */
917 FALSE, /* partial_inplace */
919 0xffffffff, /* dst_mask */
920 FALSE), /* pcrel_offset */
922 /* 32 bit symbol relative relocation. */
923 HOWTO (R_MIPS_REL32, /* type */
925 2, /* size (0 = byte, 1 = short, 2 = long) */
927 FALSE, /* pc_relative */
929 complain_overflow_dont, /* complain_on_overflow */
930 _bfd_mips_elf_generic_reloc, /* special_function */
931 "R_MIPS_REL32", /* name */
932 FALSE, /* partial_inplace */
934 0xffffffff, /* dst_mask */
935 FALSE), /* pcrel_offset */
937 /* 26 bit jump address. */
938 HOWTO (R_MIPS_26, /* type */
940 2, /* size (0 = byte, 1 = short, 2 = long) */
942 FALSE, /* pc_relative */
944 complain_overflow_dont, /* complain_on_overflow */
945 /* This needs complex overflow
946 detection, because the upper 36
947 bits must match the PC + 4. */
948 _bfd_mips_elf_generic_reloc, /* special_function */
949 "R_MIPS_26", /* name */
950 FALSE, /* partial_inplace */
952 0x03ffffff, /* dst_mask */
953 FALSE), /* pcrel_offset */
955 /* High 16 bits of symbol value. */
956 HOWTO (R_MIPS_HI16, /* type */
958 2, /* size (0 = byte, 1 = short, 2 = long) */
960 FALSE, /* pc_relative */
962 complain_overflow_dont, /* complain_on_overflow */
963 _bfd_mips_elf_generic_reloc, /* special_function */
964 "R_MIPS_HI16", /* name */
965 FALSE, /* partial_inplace */
967 0x0000ffff, /* dst_mask */
968 FALSE), /* pcrel_offset */
970 /* Low 16 bits of symbol value. */
971 HOWTO (R_MIPS_LO16, /* type */
973 2, /* size (0 = byte, 1 = short, 2 = long) */
975 FALSE, /* pc_relative */
977 complain_overflow_dont, /* complain_on_overflow */
978 _bfd_mips_elf_generic_reloc, /* special_function */
979 "R_MIPS_LO16", /* name */
980 FALSE, /* partial_inplace */
982 0x0000ffff, /* dst_mask */
983 FALSE), /* pcrel_offset */
985 /* GP relative reference. */
986 HOWTO (R_MIPS_GPREL16, /* type */
988 2, /* size (0 = byte, 1 = short, 2 = long) */
990 FALSE, /* pc_relative */
992 complain_overflow_signed, /* complain_on_overflow */
993 mips_elf_gprel16_reloc, /* special_function */
994 "R_MIPS_GPREL16", /* name */
995 FALSE, /* partial_inplace */
997 0x0000ffff, /* dst_mask */
998 FALSE), /* pcrel_offset */
1000 /* Reference to literal section. */
1001 HOWTO (R_MIPS_LITERAL, /* type */
1003 2, /* size (0 = byte, 1 = short, 2 = long) */
1005 FALSE, /* pc_relative */
1007 complain_overflow_signed, /* complain_on_overflow */
1008 mips_elf_literal_reloc, /* special_function */
1009 "R_MIPS_LITERAL", /* name */
1010 FALSE, /* partial_inplace */
1012 0x0000ffff, /* dst_mask */
1013 FALSE), /* pcrel_offset */
1015 /* Reference to global offset table. */
1016 HOWTO (R_MIPS_GOT16, /* type */
1018 2, /* size (0 = byte, 1 = short, 2 = long) */
1020 FALSE, /* pc_relative */
1022 complain_overflow_signed, /* complain_on_overflow */
1023 _bfd_mips_elf_generic_reloc, /* special_function */
1024 "R_MIPS_GOT16", /* name */
1025 FALSE, /* partial_inplace */
1027 0x0000ffff, /* dst_mask */
1028 FALSE), /* pcrel_offset */
1030 /* 16 bit PC relative reference. Note that the ABI document has a typo
1031 and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
1032 We do the right thing here. */
1033 HOWTO (R_MIPS_PC16, /* type */
1035 2, /* size (0 = byte, 1 = short, 2 = long) */
1037 TRUE, /* pc_relative */
1039 complain_overflow_signed, /* complain_on_overflow */
1040 _bfd_mips_elf_generic_reloc, /* special_function */
1041 "R_MIPS_PC16", /* name */
1042 FALSE, /* partial_inplace */
1044 0x0000ffff, /* dst_mask */
1045 TRUE), /* pcrel_offset */
1047 /* 16 bit call through global offset table. */
1048 HOWTO (R_MIPS_CALL16, /* type */
1050 2, /* size (0 = byte, 1 = short, 2 = long) */
1052 FALSE, /* pc_relative */
1054 complain_overflow_signed, /* complain_on_overflow */
1055 _bfd_mips_elf_generic_reloc, /* special_function */
1056 "R_MIPS_CALL16", /* name */
1057 FALSE, /* partial_inplace */
1059 0x0000ffff, /* dst_mask */
1060 FALSE), /* pcrel_offset */
1062 /* 32 bit GP relative reference. */
1063 HOWTO (R_MIPS_GPREL32, /* type */
1065 2, /* size (0 = byte, 1 = short, 2 = long) */
1067 FALSE, /* pc_relative */
1069 complain_overflow_dont, /* complain_on_overflow */
1070 mips_elf_gprel32_reloc, /* special_function */
1071 "R_MIPS_GPREL32", /* name */
1072 FALSE, /* partial_inplace */
1074 0xffffffff, /* dst_mask */
1075 FALSE), /* pcrel_offset */
1081 /* A 5 bit shift field. */
1082 HOWTO (R_MIPS_SHIFT5, /* type */
1084 2, /* size (0 = byte, 1 = short, 2 = long) */
1086 FALSE, /* pc_relative */
1088 complain_overflow_bitfield, /* complain_on_overflow */
1089 _bfd_mips_elf_generic_reloc, /* special_function */
1090 "R_MIPS_SHIFT5", /* name */
1091 FALSE, /* partial_inplace */
1093 0x000007c0, /* dst_mask */
1094 FALSE), /* pcrel_offset */
1096 /* A 6 bit shift field. */
1097 HOWTO (R_MIPS_SHIFT6, /* type */
1099 2, /* size (0 = byte, 1 = short, 2 = long) */
1101 FALSE, /* pc_relative */
1103 complain_overflow_bitfield, /* complain_on_overflow */
1104 mips_elf_shift6_reloc, /* special_function */
1105 "R_MIPS_SHIFT6", /* name */
1106 FALSE, /* partial_inplace */
1108 0x000007c4, /* dst_mask */
1109 FALSE), /* pcrel_offset */
1111 /* 64 bit relocation. */
1112 HOWTO (R_MIPS_64, /* type */
1114 4, /* size (0 = byte, 1 = short, 2 = long) */
1116 FALSE, /* pc_relative */
1118 complain_overflow_dont, /* complain_on_overflow */
1119 _bfd_mips_elf_generic_reloc, /* special_function */
1120 "R_MIPS_64", /* name */
1121 FALSE, /* partial_inplace */
1123 MINUS_ONE, /* dst_mask */
1124 FALSE), /* pcrel_offset */
1126 /* Displacement in the global offset table. */
1127 HOWTO (R_MIPS_GOT_DISP, /* type */
1129 2, /* size (0 = byte, 1 = short, 2 = long) */
1131 FALSE, /* pc_relative */
1133 complain_overflow_signed, /* complain_on_overflow */
1134 _bfd_mips_elf_generic_reloc, /* special_function */
1135 "R_MIPS_GOT_DISP", /* name */
1136 FALSE, /* partial_inplace */
1138 0x0000ffff, /* dst_mask */
1139 FALSE), /* pcrel_offset */
1141 /* Displacement to page pointer in the global offset table. */
1142 HOWTO (R_MIPS_GOT_PAGE, /* type */
1144 2, /* size (0 = byte, 1 = short, 2 = long) */
1146 FALSE, /* pc_relative */
1148 complain_overflow_signed, /* complain_on_overflow */
1149 _bfd_mips_elf_generic_reloc, /* special_function */
1150 "R_MIPS_GOT_PAGE", /* name */
1151 FALSE, /* partial_inplace */
1153 0x0000ffff, /* dst_mask */
1154 FALSE), /* pcrel_offset */
1156 /* Offset from page pointer in the global offset table. */
1157 HOWTO (R_MIPS_GOT_OFST, /* type */
1159 2, /* size (0 = byte, 1 = short, 2 = long) */
1161 FALSE, /* pc_relative */
1163 complain_overflow_signed, /* complain_on_overflow */
1164 _bfd_mips_elf_generic_reloc, /* special_function */
1165 "R_MIPS_GOT_OFST", /* name */
1166 FALSE, /* partial_inplace */
1168 0x0000ffff, /* dst_mask */
1169 FALSE), /* pcrel_offset */
1171 /* High 16 bits of displacement in global offset table. */
1172 HOWTO (R_MIPS_GOT_HI16, /* type */
1174 2, /* size (0 = byte, 1 = short, 2 = long) */
1176 FALSE, /* pc_relative */
1178 complain_overflow_dont, /* complain_on_overflow */
1179 _bfd_mips_elf_generic_reloc, /* special_function */
1180 "R_MIPS_GOT_HI16", /* name */
1181 FALSE, /* partial_inplace */
1183 0x0000ffff, /* dst_mask */
1184 FALSE), /* pcrel_offset */
1186 /* Low 16 bits of displacement in global offset table. */
1187 HOWTO (R_MIPS_GOT_LO16, /* type */
1189 2, /* size (0 = byte, 1 = short, 2 = long) */
1191 FALSE, /* pc_relative */
1193 complain_overflow_dont, /* complain_on_overflow */
1194 _bfd_mips_elf_generic_reloc, /* special_function */
1195 "R_MIPS_GOT_LO16", /* name */
1196 FALSE, /* partial_inplace */
1198 0x0000ffff, /* dst_mask */
1199 FALSE), /* pcrel_offset */
1201 /* 64 bit subtraction. */
1202 HOWTO (R_MIPS_SUB, /* type */
1204 4, /* size (0 = byte, 1 = short, 2 = long) */
1206 FALSE, /* pc_relative */
1208 complain_overflow_dont, /* complain_on_overflow */
1209 _bfd_mips_elf_generic_reloc, /* special_function */
1210 "R_MIPS_SUB", /* name */
1211 FALSE, /* partial_inplace */
1213 MINUS_ONE, /* dst_mask */
1214 FALSE), /* pcrel_offset */
1216 /* Insert the addend as an instruction. */
1217 /* FIXME: Not handled correctly. */
1218 HOWTO (R_MIPS_INSERT_A, /* type */
1220 2, /* size (0 = byte, 1 = short, 2 = long) */
1222 FALSE, /* pc_relative */
1224 complain_overflow_dont, /* complain_on_overflow */
1225 _bfd_mips_elf_generic_reloc, /* special_function */
1226 "R_MIPS_INSERT_A", /* name */
1227 FALSE, /* partial_inplace */
1229 0xffffffff, /* dst_mask */
1230 FALSE), /* pcrel_offset */
1232 /* Insert the addend as an instruction, and change all relocations
1233 to refer to the old instruction at the address. */
1234 /* FIXME: Not handled correctly. */
1235 HOWTO (R_MIPS_INSERT_B, /* type */
1237 2, /* size (0 = byte, 1 = short, 2 = long) */
1239 FALSE, /* pc_relative */
1241 complain_overflow_dont, /* complain_on_overflow */
1242 _bfd_mips_elf_generic_reloc, /* special_function */
1243 "R_MIPS_INSERT_B", /* name */
1244 FALSE, /* partial_inplace */
1246 0xffffffff, /* dst_mask */
1247 FALSE), /* pcrel_offset */
1249 /* Delete a 32 bit instruction. */
1250 /* FIXME: Not handled correctly. */
1251 HOWTO (R_MIPS_DELETE, /* type */
1253 2, /* size (0 = byte, 1 = short, 2 = long) */
1255 FALSE, /* pc_relative */
1257 complain_overflow_dont, /* complain_on_overflow */
1258 _bfd_mips_elf_generic_reloc, /* special_function */
1259 "R_MIPS_DELETE", /* name */
1260 FALSE, /* partial_inplace */
1262 0xffffffff, /* dst_mask */
1263 FALSE), /* pcrel_offset */
1265 /* Get the higher value of a 64 bit addend. */
1266 HOWTO (R_MIPS_HIGHER, /* type */
1268 2, /* size (0 = byte, 1 = short, 2 = long) */
1270 FALSE, /* pc_relative */
1272 complain_overflow_dont, /* complain_on_overflow */
1273 _bfd_mips_elf_generic_reloc, /* special_function */
1274 "R_MIPS_HIGHER", /* name */
1275 FALSE, /* partial_inplace */
1277 0x0000ffff, /* dst_mask */
1278 FALSE), /* pcrel_offset */
1280 /* Get the highest value of a 64 bit addend. */
1281 HOWTO (R_MIPS_HIGHEST, /* type */
1283 2, /* size (0 = byte, 1 = short, 2 = long) */
1285 FALSE, /* pc_relative */
1287 complain_overflow_dont, /* complain_on_overflow */
1288 _bfd_mips_elf_generic_reloc, /* special_function */
1289 "R_MIPS_HIGHEST", /* name */
1290 FALSE, /* partial_inplace */
1292 0x0000ffff, /* dst_mask */
1293 FALSE), /* pcrel_offset */
1295 /* High 16 bits of displacement in global offset table. */
1296 HOWTO (R_MIPS_CALL_HI16, /* type */
1298 2, /* size (0 = byte, 1 = short, 2 = long) */
1300 FALSE, /* pc_relative */
1302 complain_overflow_dont, /* complain_on_overflow */
1303 _bfd_mips_elf_generic_reloc, /* special_function */
1304 "R_MIPS_CALL_HI16", /* name */
1305 FALSE, /* partial_inplace */
1307 0x0000ffff, /* dst_mask */
1308 FALSE), /* pcrel_offset */
1310 /* Low 16 bits of displacement in global offset table. */
1311 HOWTO (R_MIPS_CALL_LO16, /* type */
1313 2, /* size (0 = byte, 1 = short, 2 = long) */
1315 FALSE, /* pc_relative */
1317 complain_overflow_dont, /* complain_on_overflow */
1318 _bfd_mips_elf_generic_reloc, /* special_function */
1319 "R_MIPS_CALL_LO16", /* name */
1320 FALSE, /* partial_inplace */
1322 0x0000ffff, /* dst_mask */
1323 FALSE), /* pcrel_offset */
1325 /* Section displacement, used by an associated event location section. */
1326 HOWTO (R_MIPS_SCN_DISP, /* type */
1328 2, /* size (0 = byte, 1 = short, 2 = long) */
1330 FALSE, /* pc_relative */
1332 complain_overflow_dont, /* complain_on_overflow */
1333 _bfd_mips_elf_generic_reloc, /* special_function */
1334 "R_MIPS_SCN_DISP", /* name */
1335 FALSE, /* partial_inplace */
1337 0xffffffff, /* dst_mask */
1338 FALSE), /* pcrel_offset */
1340 /* 16 bit relocation. */
1341 HOWTO (R_MIPS_REL16, /* type */
1343 1, /* size (0 = byte, 1 = short, 2 = long) */
1345 FALSE, /* pc_relative */
1347 complain_overflow_signed, /* complain_on_overflow */
1348 _bfd_mips_elf_generic_reloc, /* special_function */
1349 "R_MIPS_REL16", /* name */
1350 FALSE, /* partial_inplace */
1352 0xffff, /* dst_mask */
1353 FALSE), /* pcrel_offset */
1355 /* These two are obsolete. */
1356 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1357 EMPTY_HOWTO (R_MIPS_PJUMP),
1359 /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
1360 It must be used for multigot GOT's (and only there). */
1361 HOWTO (R_MIPS_RELGOT, /* type */
1363 2, /* size (0 = byte, 1 = short, 2 = long) */
1365 FALSE, /* pc_relative */
1367 complain_overflow_dont, /* complain_on_overflow */
1368 _bfd_mips_elf_generic_reloc, /* special_function */
1369 "R_MIPS_RELGOT", /* name */
1370 FALSE, /* partial_inplace */
1372 0xffffffff, /* dst_mask */
1373 FALSE), /* pcrel_offset */
1375 /* Protected jump conversion. This is an optimization hint. No
1376 relocation is required for correctness. */
1377 HOWTO (R_MIPS_JALR, /* type */
1379 2, /* size (0 = byte, 1 = short, 2 = long) */
1381 FALSE, /* pc_relative */
1383 complain_overflow_dont, /* complain_on_overflow */
1384 _bfd_mips_elf_generic_reloc, /* special_function */
1385 "R_MIPS_JALR", /* name */
1386 FALSE, /* partial_inplace */
1389 FALSE), /* pcrel_offset */
1391 /* TLS GD/LD dynamic relocations. */
1392 HOWTO (R_MIPS_TLS_DTPMOD32, /* type */
1394 2, /* size (0 = byte, 1 = short, 2 = long) */
1396 FALSE, /* pc_relative */
1398 complain_overflow_dont, /* complain_on_overflow */
1399 _bfd_mips_elf_generic_reloc, /* special_function */
1400 "R_MIPS_TLS_DTPMOD32", /* name */
1401 FALSE, /* partial_inplace */
1403 0xffffffff, /* dst_mask */
1404 FALSE), /* pcrel_offset */
1406 HOWTO (R_MIPS_TLS_DTPREL32, /* type */
1408 2, /* size (0 = byte, 1 = short, 2 = long) */
1410 FALSE, /* pc_relative */
1412 complain_overflow_dont, /* complain_on_overflow */
1413 _bfd_mips_elf_generic_reloc, /* special_function */
1414 "R_MIPS_TLS_DTPREL32", /* name */
1415 FALSE, /* partial_inplace */
1417 0xffffffff, /* dst_mask */
1418 FALSE), /* pcrel_offset */
1420 EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
1421 EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
1423 /* TLS general dynamic variable reference. */
1424 HOWTO (R_MIPS_TLS_GD, /* type */
1426 2, /* size (0 = byte, 1 = short, 2 = long) */
1428 FALSE, /* pc_relative */
1430 complain_overflow_signed, /* complain_on_overflow */
1431 _bfd_mips_elf_generic_reloc, /* special_function */
1432 "R_MIPS_TLS_GD", /* name */
1433 FALSE, /* partial_inplace */
1435 0x0000ffff, /* dst_mask */
1436 FALSE), /* pcrel_offset */
1438 /* TLS local dynamic variable reference. */
1439 HOWTO (R_MIPS_TLS_LDM, /* type */
1441 2, /* size (0 = byte, 1 = short, 2 = long) */
1443 FALSE, /* pc_relative */
1445 complain_overflow_signed, /* complain_on_overflow */
1446 _bfd_mips_elf_generic_reloc, /* special_function */
1447 "R_MIPS_TLS_LDM", /* name */
1448 FALSE, /* partial_inplace */
1450 0x0000ffff, /* dst_mask */
1451 FALSE), /* pcrel_offset */
1453 /* TLS local dynamic offset. */
1454 HOWTO (R_MIPS_TLS_DTPREL_HI16, /* type */
1456 2, /* size (0 = byte, 1 = short, 2 = long) */
1458 FALSE, /* pc_relative */
1460 complain_overflow_signed, /* complain_on_overflow */
1461 _bfd_mips_elf_generic_reloc, /* special_function */
1462 "R_MIPS_TLS_DTPREL_HI16", /* name */
1463 FALSE, /* partial_inplace */
1465 0x0000ffff, /* dst_mask */
1466 FALSE), /* pcrel_offset */
1468 /* TLS local dynamic offset. */
1469 HOWTO (R_MIPS_TLS_DTPREL_LO16, /* type */
1471 2, /* size (0 = byte, 1 = short, 2 = long) */
1473 FALSE, /* pc_relative */
1475 complain_overflow_signed, /* complain_on_overflow */
1476 _bfd_mips_elf_generic_reloc, /* special_function */
1477 "R_MIPS_TLS_DTPREL_LO16", /* name */
1478 FALSE, /* partial_inplace */
1480 0x0000ffff, /* dst_mask */
1481 FALSE), /* pcrel_offset */
1483 /* TLS thread pointer offset. */
1484 HOWTO (R_MIPS_TLS_GOTTPREL, /* type */
1486 2, /* size (0 = byte, 1 = short, 2 = long) */
1488 FALSE, /* pc_relative */
1490 complain_overflow_signed, /* complain_on_overflow */
1491 _bfd_mips_elf_generic_reloc, /* special_function */
1492 "R_MIPS_TLS_GOTTPREL", /* name */
1493 FALSE, /* partial_inplace */
1495 0x0000ffff, /* dst_mask */
1496 FALSE), /* pcrel_offset */
1498 /* TLS IE dynamic relocations. */
1499 HOWTO (R_MIPS_TLS_TPREL32, /* type */
1501 2, /* size (0 = byte, 1 = short, 2 = long) */
1503 FALSE, /* pc_relative */
1505 complain_overflow_dont, /* complain_on_overflow */
1506 _bfd_mips_elf_generic_reloc, /* special_function */
1507 "R_MIPS_TLS_TPREL32", /* name */
1508 FALSE, /* partial_inplace */
1510 0xffffffff, /* dst_mask */
1511 FALSE), /* pcrel_offset */
1513 EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
1515 /* TLS thread pointer offset. */
1516 HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
1518 2, /* size (0 = byte, 1 = short, 2 = long) */
1520 FALSE, /* pc_relative */
1522 complain_overflow_signed, /* complain_on_overflow */
1523 _bfd_mips_elf_generic_reloc, /* special_function */
1524 "R_MIPS_TLS_TPREL_HI16", /* name */
1525 FALSE, /* partial_inplace */
1527 0x0000ffff, /* dst_mask */
1528 FALSE), /* pcrel_offset */
1530 /* TLS thread pointer offset. */
1531 HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
1533 2, /* size (0 = byte, 1 = short, 2 = long) */
1535 FALSE, /* pc_relative */
1537 complain_overflow_signed, /* complain_on_overflow */
1538 _bfd_mips_elf_generic_reloc, /* special_function */
1539 "R_MIPS_TLS_TPREL_LO16", /* name */
1540 FALSE, /* partial_inplace */
1542 0x0000ffff, /* dst_mask */
1543 FALSE), /* pcrel_offset */
1545 /* 32 bit relocation with no addend. */
1546 HOWTO (R_MIPS_GLOB_DAT, /* type */
1548 2, /* size (0 = byte, 1 = short, 2 = long) */
1550 FALSE, /* pc_relative */
1552 complain_overflow_dont, /* complain_on_overflow */
1553 _bfd_mips_elf_generic_reloc, /* special_function */
1554 "R_MIPS_GLOB_DAT", /* name */
1555 FALSE, /* partial_inplace */
1557 0xffffffff, /* dst_mask */
1558 FALSE), /* pcrel_offset */
1569 HOWTO (R_MIPS_PC21_S2, /* type */
1571 2, /* size (0 = byte, 1 = short, 2 = long) */
1573 TRUE, /* pc_relative */
1575 complain_overflow_signed, /* complain_on_overflow */
1576 _bfd_mips_elf_generic_reloc, /* special_function */
1577 "R_MIPS_PC21_S2", /* name */
1578 FALSE, /* partial_inplace */
1580 0x001fffff, /* dst_mask */
1581 TRUE), /* pcrel_offset */
1583 HOWTO (R_MIPS_PC26_S2, /* type */
1585 2, /* size (0 = byte, 1 = short, 2 = long) */
1587 TRUE, /* pc_relative */
1589 complain_overflow_signed, /* complain_on_overflow */
1590 _bfd_mips_elf_generic_reloc, /* special_function */
1591 "R_MIPS_PC26_S2", /* name */
1592 FALSE, /* partial_inplace */
1594 0x03ffffff, /* dst_mask */
1595 TRUE), /* pcrel_offset */
1597 HOWTO (R_MIPS_PC18_S3, /* type */
1599 2, /* size (0 = byte, 1 = short, 2 = long) */
1601 TRUE, /* pc_relative */
1603 complain_overflow_signed, /* complain_on_overflow */
1604 _bfd_mips_elf_generic_reloc, /* special_function */
1605 "R_MIPS_PC18_S3", /* name */
1606 FALSE, /* partial_inplace */
1608 0x0003ffff, /* dst_mask */
1609 TRUE), /* pcrel_offset */
1611 HOWTO (R_MIPS_PC19_S2, /* type */
1613 2, /* size (0 = byte, 1 = short, 2 = long) */
1615 TRUE, /* pc_relative */
1617 complain_overflow_signed, /* complain_on_overflow */
1618 _bfd_mips_elf_generic_reloc, /* special_function */
1619 "R_MIPS_PC19_S2", /* name */
1620 FALSE, /* partial_inplace */
1622 0x0007ffff, /* dst_mask */
1623 TRUE), /* pcrel_offset */
1625 HOWTO (R_MIPS_PCHI16, /* type */
1626 16, /* rightshift */
1627 2, /* size (0 = byte, 1 = short, 2 = long) */
1629 TRUE, /* pc_relative */
1631 complain_overflow_signed, /* complain_on_overflow */
1632 _bfd_mips_elf_generic_reloc, /* special_function */
1633 "R_MIPS_PCHI16", /* name */
1634 FALSE, /* partial_inplace */
1636 0x0000ffff, /* dst_mask */
1637 TRUE), /* pcrel_offset */
1639 HOWTO (R_MIPS_PCLO16, /* type */
1641 2, /* size (0 = byte, 1 = short, 2 = long) */
1643 TRUE, /* pc_relative */
1645 complain_overflow_dont, /* complain_on_overflow */
1646 _bfd_mips_elf_generic_reloc, /* special_function */
1647 "R_MIPS_PCLO16", /* name */
1648 FALSE, /* partial_inplace */
1650 0x0000ffff, /* dst_mask */
1651 TRUE), /* pcrel_offset */
1655 static reloc_howto_type elf_mips16_howto_table_rel[] =
1657 /* The reloc used for the mips16 jump instruction. */
1658 HOWTO (R_MIPS16_26, /* type */
1660 2, /* size (0 = byte, 1 = short, 2 = long) */
1662 FALSE, /* pc_relative */
1664 complain_overflow_dont, /* complain_on_overflow */
1665 /* This needs complex overflow
1666 detection, because the upper four
1667 bits must match the PC. */
1668 _bfd_mips_elf_generic_reloc, /* special_function */
1669 "R_MIPS16_26", /* name */
1670 TRUE, /* partial_inplace */
1671 0x3ffffff, /* src_mask */
1672 0x3ffffff, /* dst_mask */
1673 FALSE), /* pcrel_offset */
1675 /* The reloc used for the mips16 gprel instruction. */
1676 HOWTO (R_MIPS16_GPREL, /* type */
1678 2, /* size (0 = byte, 1 = short, 2 = long) */
1680 FALSE, /* pc_relative */
1682 complain_overflow_signed, /* complain_on_overflow */
1683 mips16_gprel_reloc, /* special_function */
1684 "R_MIPS16_GPREL", /* name */
1685 TRUE, /* partial_inplace */
1686 0x0000ffff, /* src_mask */
1687 0x0000ffff, /* dst_mask */
1688 FALSE), /* pcrel_offset */
1690 /* A MIPS16 reference to the global offset table. */
1691 HOWTO (R_MIPS16_GOT16, /* type */
1693 2, /* size (0 = byte, 1 = short, 2 = long) */
1695 FALSE, /* pc_relative */
1697 complain_overflow_dont, /* complain_on_overflow */
1698 _bfd_mips_elf_got16_reloc, /* special_function */
1699 "R_MIPS16_GOT16", /* name */
1700 TRUE, /* partial_inplace */
1701 0x0000ffff, /* src_mask */
1702 0x0000ffff, /* dst_mask */
1703 FALSE), /* pcrel_offset */
1705 /* A MIPS16 call through the global offset table. */
1706 HOWTO (R_MIPS16_CALL16, /* type */
1708 2, /* size (0 = byte, 1 = short, 2 = long) */
1710 FALSE, /* pc_relative */
1712 complain_overflow_dont, /* complain_on_overflow */
1713 _bfd_mips_elf_generic_reloc, /* special_function */
1714 "R_MIPS16_CALL16", /* name */
1715 TRUE, /* partial_inplace */
1716 0x0000ffff, /* src_mask */
1717 0x0000ffff, /* dst_mask */
1718 FALSE), /* pcrel_offset */
1720 /* MIPS16 high 16 bits of symbol value. */
1721 HOWTO (R_MIPS16_HI16, /* type */
1722 16, /* rightshift */
1723 2, /* size (0 = byte, 1 = short, 2 = long) */
1725 FALSE, /* pc_relative */
1727 complain_overflow_dont, /* complain_on_overflow */
1728 _bfd_mips_elf_hi16_reloc, /* special_function */
1729 "R_MIPS16_HI16", /* name */
1730 TRUE, /* partial_inplace */
1731 0x0000ffff, /* src_mask */
1732 0x0000ffff, /* dst_mask */
1733 FALSE), /* pcrel_offset */
1735 /* MIPS16 low 16 bits of symbol value. */
1736 HOWTO (R_MIPS16_LO16, /* type */
1738 2, /* size (0 = byte, 1 = short, 2 = long) */
1740 FALSE, /* pc_relative */
1742 complain_overflow_dont, /* complain_on_overflow */
1743 _bfd_mips_elf_lo16_reloc, /* special_function */
1744 "R_MIPS16_LO16", /* name */
1745 TRUE, /* partial_inplace */
1746 0x0000ffff, /* src_mask */
1747 0x0000ffff, /* dst_mask */
1748 FALSE), /* pcrel_offset */
1750 /* MIPS16 TLS general dynamic variable reference. */
1751 HOWTO (R_MIPS16_TLS_GD, /* type */
1753 2, /* size (0 = byte, 1 = short, 2 = long) */
1755 FALSE, /* pc_relative */
1757 complain_overflow_signed, /* complain_on_overflow */
1758 _bfd_mips_elf_generic_reloc, /* special_function */
1759 "R_MIPS16_TLS_GD", /* name */
1760 TRUE, /* partial_inplace */
1761 0x0000ffff, /* src_mask */
1762 0x0000ffff, /* dst_mask */
1763 FALSE), /* pcrel_offset */
1765 /* MIPS16 TLS local dynamic variable reference. */
1766 HOWTO (R_MIPS16_TLS_LDM, /* type */
1768 2, /* size (0 = byte, 1 = short, 2 = long) */
1770 FALSE, /* pc_relative */
1772 complain_overflow_signed, /* complain_on_overflow */
1773 _bfd_mips_elf_generic_reloc, /* special_function */
1774 "R_MIPS16_TLS_LDM", /* name */
1775 TRUE, /* partial_inplace */
1776 0x0000ffff, /* src_mask */
1777 0x0000ffff, /* dst_mask */
1778 FALSE), /* pcrel_offset */
1780 /* MIPS16 TLS local dynamic offset. */
1781 HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
1783 2, /* size (0 = byte, 1 = short, 2 = long) */
1785 FALSE, /* pc_relative */
1787 complain_overflow_signed, /* complain_on_overflow */
1788 _bfd_mips_elf_generic_reloc, /* special_function */
1789 "R_MIPS16_TLS_DTPREL_HI16", /* name */
1790 TRUE, /* partial_inplace */
1791 0x0000ffff, /* src_mask */
1792 0x0000ffff, /* dst_mask */
1793 FALSE), /* pcrel_offset */
1795 /* MIPS16 TLS local dynamic offset. */
1796 HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
1798 2, /* size (0 = byte, 1 = short, 2 = long) */
1800 FALSE, /* pc_relative */
1802 complain_overflow_signed, /* complain_on_overflow */
1803 _bfd_mips_elf_generic_reloc, /* special_function */
1804 "R_MIPS16_TLS_DTPREL_LO16", /* name */
1805 TRUE, /* partial_inplace */
1806 0x0000ffff, /* src_mask */
1807 0x0000ffff, /* dst_mask */
1808 FALSE), /* pcrel_offset */
1810 /* MIPS16 TLS thread pointer offset. */
1811 HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
1813 2, /* size (0 = byte, 1 = short, 2 = long) */
1815 FALSE, /* pc_relative */
1817 complain_overflow_signed, /* complain_on_overflow */
1818 _bfd_mips_elf_generic_reloc, /* special_function */
1819 "R_MIPS16_TLS_GOTTPREL", /* name */
1820 TRUE, /* partial_inplace */
1821 0x0000ffff, /* src_mask */
1822 0x0000ffff, /* dst_mask */
1823 FALSE), /* pcrel_offset */
1825 /* MIPS16 TLS thread pointer offset. */
1826 HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
1828 2, /* size (0 = byte, 1 = short, 2 = long) */
1830 FALSE, /* pc_relative */
1832 complain_overflow_signed, /* complain_on_overflow */
1833 _bfd_mips_elf_generic_reloc, /* special_function */
1834 "R_MIPS16_TLS_TPREL_HI16", /* name */
1835 TRUE, /* partial_inplace */
1836 0x0000ffff, /* src_mask */
1837 0x0000ffff, /* dst_mask */
1838 FALSE), /* pcrel_offset */
1840 /* MIPS16 TLS thread pointer offset. */
1841 HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
1843 2, /* size (0 = byte, 1 = short, 2 = long) */
1845 FALSE, /* pc_relative */
1847 complain_overflow_signed, /* complain_on_overflow */
1848 _bfd_mips_elf_generic_reloc, /* special_function */
1849 "R_MIPS16_TLS_TPREL_LO16", /* name */
1850 TRUE, /* partial_inplace */
1851 0x0000ffff, /* src_mask */
1852 0x0000ffff, /* dst_mask */
1853 FALSE), /* pcrel_offset */
1855 /* MIPS16 16-bit PC-relative branch offset. */
1856 HOWTO (R_MIPS16_PC16_S1, /* type */
1858 2, /* size (0 = byte, 1 = short, 2 = long) */
1860 TRUE, /* pc_relative */
1862 complain_overflow_signed, /* complain_on_overflow */
1863 _bfd_mips_elf_generic_reloc, /* special_function */
1864 "R_MIPS16_PC16_S1", /* name */
1865 TRUE, /* partial_inplace */
1866 0x0000ffff, /* src_mask */
1867 0x0000ffff, /* dst_mask */
1868 TRUE), /* pcrel_offset */
1871 static reloc_howto_type elf_mips16_howto_table_rela[] =
1873 /* The reloc used for the mips16 jump instruction. */
1874 HOWTO (R_MIPS16_26, /* type */
1876 2, /* size (0 = byte, 1 = short, 2 = long) */
1878 FALSE, /* pc_relative */
1880 complain_overflow_dont, /* complain_on_overflow */
1881 /* This needs complex overflow
1882 detection, because the upper four
1883 bits must match the PC. */
1884 _bfd_mips_elf_generic_reloc, /* special_function */
1885 "R_MIPS16_26", /* name */
1886 FALSE, /* partial_inplace */
1888 0x3ffffff, /* dst_mask */
1889 FALSE), /* pcrel_offset */
1891 /* The reloc used for the mips16 gprel instruction. */
1892 HOWTO (R_MIPS16_GPREL, /* type */
1894 2, /* size (0 = byte, 1 = short, 2 = long) */
1896 FALSE, /* pc_relative */
1898 complain_overflow_signed, /* complain_on_overflow */
1899 mips16_gprel_reloc, /* special_function */
1900 "R_MIPS16_GPREL", /* name */
1901 FALSE, /* partial_inplace */
1903 0x0000ffff, /* dst_mask */
1904 FALSE), /* pcrel_offset */
1906 /* A MIPS16 reference to the global offset table. */
1907 HOWTO (R_MIPS16_GOT16, /* type */
1909 2, /* size (0 = byte, 1 = short, 2 = long) */
1911 FALSE, /* pc_relative */
1913 complain_overflow_dont, /* complain_on_overflow */
1914 _bfd_mips_elf_got16_reloc, /* special_function */
1915 "R_MIPS16_GOT16", /* name */
1916 FALSE, /* partial_inplace */
1918 0x0000ffff, /* dst_mask */
1919 FALSE), /* pcrel_offset */
1921 /* A MIPS16 call through the global offset table. */
1922 HOWTO (R_MIPS16_CALL16, /* type */
1924 2, /* size (0 = byte, 1 = short, 2 = long) */
1926 FALSE, /* pc_relative */
1928 complain_overflow_dont, /* complain_on_overflow */
1929 _bfd_mips_elf_generic_reloc, /* special_function */
1930 "R_MIPS16_CALL16", /* name */
1931 FALSE, /* partial_inplace */
1933 0x0000ffff, /* dst_mask */
1934 FALSE), /* pcrel_offset */
1936 /* MIPS16 high 16 bits of symbol value. */
1937 HOWTO (R_MIPS16_HI16, /* type */
1938 16, /* rightshift */
1939 2, /* size (0 = byte, 1 = short, 2 = long) */
1941 FALSE, /* pc_relative */
1943 complain_overflow_dont, /* complain_on_overflow */
1944 _bfd_mips_elf_hi16_reloc, /* special_function */
1945 "R_MIPS16_HI16", /* name */
1946 FALSE, /* partial_inplace */
1948 0x0000ffff, /* dst_mask */
1949 FALSE), /* pcrel_offset */
1951 /* MIPS16 low 16 bits of symbol value. */
1952 HOWTO (R_MIPS16_LO16, /* type */
1954 2, /* size (0 = byte, 1 = short, 2 = long) */
1956 FALSE, /* pc_relative */
1958 complain_overflow_dont, /* complain_on_overflow */
1959 _bfd_mips_elf_lo16_reloc, /* special_function */
1960 "R_MIPS16_LO16", /* name */
1961 FALSE, /* partial_inplace */
1963 0x0000ffff, /* dst_mask */
1964 FALSE), /* pcrel_offset */
1966 /* MIPS16 TLS general dynamic variable reference. */
1967 HOWTO (R_MIPS16_TLS_GD, /* type */
1969 2, /* size (0 = byte, 1 = short, 2 = long) */
1971 FALSE, /* pc_relative */
1973 complain_overflow_signed, /* complain_on_overflow */
1974 _bfd_mips_elf_generic_reloc, /* special_function */
1975 "R_MIPS16_TLS_GD", /* name */
1976 FALSE, /* partial_inplace */
1978 0x0000ffff, /* dst_mask */
1979 FALSE), /* pcrel_offset */
1981 /* MIPS16 TLS local dynamic variable reference. */
1982 HOWTO (R_MIPS16_TLS_LDM, /* type */
1984 2, /* size (0 = byte, 1 = short, 2 = long) */
1986 FALSE, /* pc_relative */
1988 complain_overflow_signed, /* complain_on_overflow */
1989 _bfd_mips_elf_generic_reloc, /* special_function */
1990 "R_MIPS16_TLS_LDM", /* name */
1991 FALSE, /* partial_inplace */
1993 0x0000ffff, /* dst_mask */
1994 FALSE), /* pcrel_offset */
1996 /* MIPS16 TLS local dynamic offset. */
1997 HOWTO (R_MIPS16_TLS_DTPREL_HI16, /* type */
1999 2, /* size (0 = byte, 1 = short, 2 = long) */
2001 FALSE, /* pc_relative */
2003 complain_overflow_signed, /* complain_on_overflow */
2004 _bfd_mips_elf_generic_reloc, /* special_function */
2005 "R_MIPS16_TLS_DTPREL_HI16", /* name */
2006 FALSE, /* partial_inplace */
2008 0x0000ffff, /* dst_mask */
2009 FALSE), /* pcrel_offset */
2011 /* MIPS16 TLS local dynamic offset. */
2012 HOWTO (R_MIPS16_TLS_DTPREL_LO16, /* type */
2014 2, /* size (0 = byte, 1 = short, 2 = long) */
2016 FALSE, /* pc_relative */
2018 complain_overflow_signed, /* complain_on_overflow */
2019 _bfd_mips_elf_generic_reloc, /* special_function */
2020 "R_MIPS16_TLS_DTPREL_LO16", /* name */
2021 FALSE, /* partial_inplace */
2023 0x0000ffff, /* dst_mask */
2024 FALSE), /* pcrel_offset */
2026 /* MIPS16 TLS thread pointer offset. */
2027 HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
2029 2, /* size (0 = byte, 1 = short, 2 = long) */
2031 FALSE, /* pc_relative */
2033 complain_overflow_signed, /* complain_on_overflow */
2034 _bfd_mips_elf_generic_reloc, /* special_function */
2035 "R_MIPS16_TLS_GOTTPREL", /* name */
2036 FALSE, /* partial_inplace */
2038 0x0000ffff, /* dst_mask */
2039 FALSE), /* pcrel_offset */
2041 /* MIPS16 TLS thread pointer offset. */
2042 HOWTO (R_MIPS16_TLS_TPREL_HI16, /* type */
2044 2, /* size (0 = byte, 1 = short, 2 = long) */
2046 FALSE, /* pc_relative */
2048 complain_overflow_signed, /* complain_on_overflow */
2049 _bfd_mips_elf_generic_reloc, /* special_function */
2050 "R_MIPS16_TLS_TPREL_HI16", /* name */
2051 FALSE, /* partial_inplace */
2053 0x0000ffff, /* dst_mask */
2054 FALSE), /* pcrel_offset */
2056 /* MIPS16 TLS thread pointer offset. */
2057 HOWTO (R_MIPS16_TLS_TPREL_LO16, /* type */
2059 2, /* size (0 = byte, 1 = short, 2 = long) */
2061 FALSE, /* pc_relative */
2063 complain_overflow_signed, /* complain_on_overflow */
2064 _bfd_mips_elf_generic_reloc, /* special_function */
2065 "R_MIPS16_TLS_TPREL_LO16", /* name */
2066 FALSE, /* partial_inplace */
2068 0x0000ffff, /* dst_mask */
2069 FALSE), /* pcrel_offset */
2071 /* MIPS16 16-bit PC-relative branch offset. */
2072 HOWTO (R_MIPS16_PC16_S1, /* type */
2074 2, /* size (0 = byte, 1 = short, 2 = long) */
2076 TRUE, /* pc_relative */
2078 complain_overflow_signed, /* complain_on_overflow */
2079 _bfd_mips_elf_generic_reloc, /* special_function */
2080 "R_MIPS16_PC16_S1", /* name */
2081 FALSE, /* partial_inplace */
2083 0x0000ffff, /* dst_mask */
2084 TRUE), /* pcrel_offset */
2087 static reloc_howto_type elf_micromips_howto_table_rel[] =
2093 /* 26 bit jump address. */
2094 HOWTO (R_MICROMIPS_26_S1, /* type */
2096 2, /* size (0 = byte, 1 = short, 2 = long) */
2098 FALSE, /* pc_relative */
2100 complain_overflow_dont, /* complain_on_overflow */
2101 /* This needs complex overflow
2102 detection, because the upper four
2103 bits must match the PC. */
2104 _bfd_mips_elf_generic_reloc, /* special_function */
2105 "R_MICROMIPS_26_S1", /* name */
2106 TRUE, /* partial_inplace */
2107 0x3ffffff, /* src_mask */
2108 0x3ffffff, /* dst_mask */
2109 FALSE), /* pcrel_offset */
2111 /* High 16 bits of symbol value. */
2112 HOWTO (R_MICROMIPS_HI16, /* type */
2113 16, /* rightshift */
2114 2, /* size (0 = byte, 1 = short, 2 = long) */
2116 FALSE, /* pc_relative */
2118 complain_overflow_dont, /* complain_on_overflow */
2119 _bfd_mips_elf_hi16_reloc, /* special_function */
2120 "R_MICROMIPS_HI16", /* name */
2121 TRUE, /* partial_inplace */
2122 0x0000ffff, /* src_mask */
2123 0x0000ffff, /* dst_mask */
2124 FALSE), /* pcrel_offset */
2126 /* Low 16 bits of symbol value. */
2127 HOWTO (R_MICROMIPS_LO16, /* type */
2129 2, /* size (0 = byte, 1 = short, 2 = long) */
2131 FALSE, /* pc_relative */
2133 complain_overflow_dont, /* complain_on_overflow */
2134 _bfd_mips_elf_lo16_reloc, /* special_function */
2135 "R_MICROMIPS_LO16", /* name */
2136 TRUE, /* partial_inplace */
2137 0x0000ffff, /* src_mask */
2138 0x0000ffff, /* dst_mask */
2139 FALSE), /* pcrel_offset */
2141 /* GP relative reference. */
2142 HOWTO (R_MICROMIPS_GPREL16, /* type */
2144 2, /* size (0 = byte, 1 = short, 2 = long) */
2146 FALSE, /* pc_relative */
2148 complain_overflow_signed, /* complain_on_overflow */
2149 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2150 "R_MICROMIPS_GPREL16", /* name */
2151 TRUE, /* partial_inplace */
2152 0x0000ffff, /* src_mask */
2153 0x0000ffff, /* dst_mask */
2154 FALSE), /* pcrel_offset */
2156 /* Reference to literal section. */
2157 HOWTO (R_MICROMIPS_LITERAL, /* type */
2159 2, /* size (0 = byte, 1 = short, 2 = long) */
2161 FALSE, /* pc_relative */
2163 complain_overflow_signed, /* complain_on_overflow */
2164 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2165 "R_MICROMIPS_LITERAL", /* name */
2166 TRUE, /* partial_inplace */
2167 0x0000ffff, /* src_mask */
2168 0x0000ffff, /* dst_mask */
2169 FALSE), /* pcrel_offset */
2171 /* Reference to global offset table. */
2172 HOWTO (R_MICROMIPS_GOT16, /* type */
2174 2, /* size (0 = byte, 1 = short, 2 = long) */
2176 FALSE, /* pc_relative */
2178 complain_overflow_signed, /* complain_on_overflow */
2179 _bfd_mips_elf_got16_reloc, /* special_function */
2180 "R_MICROMIPS_GOT16", /* name */
2181 TRUE, /* partial_inplace */
2182 0x0000ffff, /* src_mask */
2183 0x0000ffff, /* dst_mask */
2184 FALSE), /* pcrel_offset */
2186 /* This is for microMIPS branches. */
2187 HOWTO (R_MICROMIPS_PC7_S1, /* type */
2189 1, /* size (0 = byte, 1 = short, 2 = long) */
2191 TRUE, /* pc_relative */
2193 complain_overflow_signed, /* complain_on_overflow */
2194 _bfd_mips_elf_generic_reloc, /* special_function */
2195 "R_MICROMIPS_PC7_S1", /* name */
2196 TRUE, /* partial_inplace */
2197 0x0000007f, /* src_mask */
2198 0x0000007f, /* dst_mask */
2199 TRUE), /* pcrel_offset */
2201 HOWTO (R_MICROMIPS_PC10_S1, /* type */
2203 1, /* size (0 = byte, 1 = short, 2 = long) */
2205 TRUE, /* pc_relative */
2207 complain_overflow_signed, /* complain_on_overflow */
2208 _bfd_mips_elf_generic_reloc, /* special_function */
2209 "R_MICROMIPS_PC10_S1", /* name */
2210 TRUE, /* partial_inplace */
2211 0x000003ff, /* src_mask */
2212 0x000003ff, /* dst_mask */
2213 TRUE), /* pcrel_offset */
2215 HOWTO (R_MICROMIPS_PC16_S1, /* type */
2217 2, /* size (0 = byte, 1 = short, 2 = long) */
2219 TRUE, /* pc_relative */
2221 complain_overflow_signed, /* complain_on_overflow */
2222 _bfd_mips_elf_generic_reloc, /* special_function */
2223 "R_MICROMIPS_PC16_S1", /* name */
2224 TRUE, /* partial_inplace */
2225 0x0000ffff, /* src_mask */
2226 0x0000ffff, /* dst_mask */
2227 TRUE), /* pcrel_offset */
2229 /* 16 bit call through global offset table. */
2230 HOWTO (R_MICROMIPS_CALL16, /* type */
2232 2, /* size (0 = byte, 1 = short, 2 = long) */
2234 FALSE, /* pc_relative */
2236 complain_overflow_signed, /* complain_on_overflow */
2237 _bfd_mips_elf_generic_reloc, /* special_function */
2238 "R_MICROMIPS_CALL16", /* name */
2239 TRUE, /* partial_inplace */
2240 0x0000ffff, /* src_mask */
2241 0x0000ffff, /* dst_mask */
2242 FALSE), /* pcrel_offset */
2247 /* Displacement in the global offset table. */
2248 HOWTO (R_MICROMIPS_GOT_DISP, /* type */
2250 2, /* size (0 = byte, 1 = short, 2 = long) */
2252 FALSE, /* pc_relative */
2254 complain_overflow_signed, /* complain_on_overflow */
2255 _bfd_mips_elf_generic_reloc, /* special_function */
2256 "R_MICROMIPS_GOT_DISP",/* name */
2257 TRUE, /* partial_inplace */
2258 0x0000ffff, /* src_mask */
2259 0x0000ffff, /* dst_mask */
2260 FALSE), /* pcrel_offset */
2262 /* Displacement to page pointer in the global offset table. */
2263 HOWTO (R_MICROMIPS_GOT_PAGE, /* type */
2265 2, /* size (0 = byte, 1 = short, 2 = long) */
2267 FALSE, /* pc_relative */
2269 complain_overflow_signed, /* complain_on_overflow */
2270 _bfd_mips_elf_generic_reloc, /* special_function */
2271 "R_MICROMIPS_GOT_PAGE",/* name */
2272 TRUE, /* partial_inplace */
2273 0x0000ffff, /* src_mask */
2274 0x0000ffff, /* dst_mask */
2275 FALSE), /* pcrel_offset */
2277 /* Offset from page pointer in the global offset table. */
2278 HOWTO (R_MICROMIPS_GOT_OFST, /* type */
2280 2, /* size (0 = byte, 1 = short, 2 = long) */
2282 FALSE, /* pc_relative */
2284 complain_overflow_signed, /* complain_on_overflow */
2285 _bfd_mips_elf_generic_reloc, /* special_function */
2286 "R_MICROMIPS_GOT_OFST",/* name */
2287 TRUE, /* partial_inplace */
2288 0x0000ffff, /* src_mask */
2289 0x0000ffff, /* dst_mask */
2290 FALSE), /* pcrel_offset */
2292 /* High 16 bits of displacement in global offset table. */
2293 HOWTO (R_MICROMIPS_GOT_HI16, /* type */
2295 2, /* size (0 = byte, 1 = short, 2 = long) */
2297 FALSE, /* pc_relative */
2299 complain_overflow_dont, /* complain_on_overflow */
2300 _bfd_mips_elf_generic_reloc, /* special_function */
2301 "R_MICROMIPS_GOT_HI16",/* name */
2302 TRUE, /* partial_inplace */
2303 0x0000ffff, /* src_mask */
2304 0x0000ffff, /* dst_mask */
2305 FALSE), /* pcrel_offset */
2307 /* Low 16 bits of displacement in global offset table. */
2308 HOWTO (R_MICROMIPS_GOT_LO16, /* type */
2310 2, /* size (0 = byte, 1 = short, 2 = long) */
2312 FALSE, /* pc_relative */
2314 complain_overflow_dont, /* complain_on_overflow */
2315 _bfd_mips_elf_generic_reloc, /* special_function */
2316 "R_MICROMIPS_GOT_LO16",/* name */
2317 TRUE, /* partial_inplace */
2318 0x0000ffff, /* src_mask */
2319 0x0000ffff, /* dst_mask */
2320 FALSE), /* pcrel_offset */
2322 /* 64 bit subtraction. Used in the N32 ABI. */
2323 HOWTO (R_MICROMIPS_SUB, /* type */
2325 4, /* size (0 = byte, 1 = short, 2 = long) */
2327 FALSE, /* pc_relative */
2329 complain_overflow_dont, /* complain_on_overflow */
2330 _bfd_mips_elf_generic_reloc, /* special_function */
2331 "R_MICROMIPS_SUB", /* name */
2332 TRUE, /* partial_inplace */
2333 MINUS_ONE, /* src_mask */
2334 MINUS_ONE, /* dst_mask */
2335 FALSE), /* pcrel_offset */
2337 /* We don't support these for REL relocations, because it means building
2338 the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
2339 R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
2340 using fallable heuristics. */
2341 EMPTY_HOWTO (R_MICROMIPS_HIGHER),
2342 EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
2344 /* High 16 bits of displacement in global offset table. */
2345 HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2347 2, /* size (0 = byte, 1 = short, 2 = long) */
2349 FALSE, /* pc_relative */
2351 complain_overflow_dont, /* complain_on_overflow */
2352 _bfd_mips_elf_generic_reloc, /* special_function */
2353 "R_MICROMIPS_CALL_HI16",/* name */
2354 TRUE, /* partial_inplace */
2355 0x0000ffff, /* src_mask */
2356 0x0000ffff, /* dst_mask */
2357 FALSE), /* pcrel_offset */
2359 /* Low 16 bits of displacement in global offset table. */
2360 HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2362 2, /* size (0 = byte, 1 = short, 2 = long) */
2364 FALSE, /* pc_relative */
2366 complain_overflow_dont, /* complain_on_overflow */
2367 _bfd_mips_elf_generic_reloc, /* special_function */
2368 "R_MICROMIPS_CALL_LO16",/* name */
2369 TRUE, /* partial_inplace */
2370 0x0000ffff, /* src_mask */
2371 0x0000ffff, /* dst_mask */
2372 FALSE), /* pcrel_offset */
2374 /* Section displacement. */
2375 HOWTO (R_MICROMIPS_SCN_DISP, /* type */
2377 2, /* size (0 = byte, 1 = short, 2 = long) */
2379 FALSE, /* pc_relative */
2381 complain_overflow_dont, /* complain_on_overflow */
2382 _bfd_mips_elf_generic_reloc, /* special_function */
2383 "R_MICROMIPS_SCN_DISP", /* name */
2384 TRUE, /* partial_inplace */
2385 0xffffffff, /* src_mask */
2386 0xffffffff, /* dst_mask */
2387 FALSE), /* pcrel_offset */
2389 /* Protected jump conversion. This is an optimization hint. No
2390 relocation is required for correctness. */
2391 HOWTO (R_MICROMIPS_JALR, /* type */
2393 2, /* size (0 = byte, 1 = short, 2 = long) */
2395 FALSE, /* pc_relative */
2397 complain_overflow_dont, /* complain_on_overflow */
2398 _bfd_mips_elf_generic_reloc, /* special_function */
2399 "R_MICROMIPS_JALR", /* name */
2400 FALSE, /* partial_inplace */
2402 0x00000000, /* dst_mask */
2403 FALSE), /* pcrel_offset */
2406 static reloc_howto_type elf_micromips_howto_table_rela[] =
2412 /* 26 bit jump address. */
2413 HOWTO (R_MICROMIPS_26_S1, /* type */
2415 2, /* size (0 = byte, 1 = short, 2 = long) */
2417 FALSE, /* pc_relative */
2419 complain_overflow_dont, /* complain_on_overflow */
2420 /* This needs complex overflow
2421 detection, because the upper four
2422 bits must match the PC. */
2423 _bfd_mips_elf_generic_reloc, /* special_function */
2424 "R_MICROMIPS_26_S1", /* name */
2425 FALSE, /* partial_inplace */
2427 0x3ffffff, /* dst_mask */
2428 FALSE), /* pcrel_offset */
2430 /* High 16 bits of symbol value. */
2431 HOWTO (R_MICROMIPS_HI16, /* type */
2432 16, /* rightshift */
2433 2, /* size (0 = byte, 1 = short, 2 = long) */
2435 FALSE, /* pc_relative */
2437 complain_overflow_dont, /* complain_on_overflow */
2438 _bfd_mips_elf_hi16_reloc, /* special_function */
2439 "R_MICROMIPS_HI16", /* name */
2440 FALSE, /* partial_inplace */
2442 0x0000ffff, /* dst_mask */
2443 FALSE), /* pcrel_offset */
2445 /* Low 16 bits of symbol value. */
2446 HOWTO (R_MICROMIPS_LO16, /* type */
2448 2, /* size (0 = byte, 1 = short, 2 = long) */
2450 FALSE, /* pc_relative */
2452 complain_overflow_dont, /* complain_on_overflow */
2453 _bfd_mips_elf_lo16_reloc, /* special_function */
2454 "R_MICROMIPS_LO16", /* name */
2455 FALSE, /* partial_inplace */
2457 0x0000ffff, /* dst_mask */
2458 FALSE), /* pcrel_offset */
2460 /* GP relative reference. */
2461 HOWTO (R_MICROMIPS_GPREL16, /* type */
2463 2, /* size (0 = byte, 1 = short, 2 = long) */
2465 FALSE, /* pc_relative */
2467 complain_overflow_signed, /* complain_on_overflow */
2468 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2469 "R_MICROMIPS_GPREL16", /* name */
2470 FALSE, /* partial_inplace */
2472 0x0000ffff, /* dst_mask */
2473 FALSE), /* pcrel_offset */
2475 /* Reference to literal section. */
2476 HOWTO (R_MICROMIPS_LITERAL, /* type */
2478 2, /* size (0 = byte, 1 = short, 2 = long) */
2480 FALSE, /* pc_relative */
2482 complain_overflow_signed, /* complain_on_overflow */
2483 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2484 "R_MICROMIPS_LITERAL", /* name */
2485 FALSE, /* partial_inplace */
2487 0x0000ffff, /* dst_mask */
2488 FALSE), /* pcrel_offset */
2490 /* Reference to global offset table. */
2491 HOWTO (R_MICROMIPS_GOT16, /* type */
2493 2, /* size (0 = byte, 1 = short, 2 = long) */
2495 FALSE, /* pc_relative */
2497 complain_overflow_signed, /* complain_on_overflow */
2498 _bfd_mips_elf_got16_reloc, /* special_function */
2499 "R_MICROMIPS_GOT16", /* name */
2500 FALSE, /* partial_inplace */
2502 0x0000ffff, /* dst_mask */
2503 FALSE), /* pcrel_offset */
2505 /* This is for microMIPS branches. */
2506 HOWTO (R_MICROMIPS_PC7_S1, /* type */
2508 1, /* size (0 = byte, 1 = short, 2 = long) */
2510 TRUE, /* pc_relative */
2512 complain_overflow_signed, /* complain_on_overflow */
2513 _bfd_mips_elf_generic_reloc, /* special_function */
2514 "R_MICROMIPS_PC7_S1", /* name */
2515 FALSE, /* partial_inplace */
2517 0x0000007f, /* dst_mask */
2518 TRUE), /* pcrel_offset */
2520 HOWTO (R_MICROMIPS_PC10_S1, /* type */
2522 1, /* size (0 = byte, 1 = short, 2 = long) */
2524 TRUE, /* pc_relative */
2526 complain_overflow_signed, /* complain_on_overflow */
2527 _bfd_mips_elf_generic_reloc, /* special_function */
2528 "R_MICROMIPS_PC10_S1", /* name */
2529 FALSE, /* partial_inplace */
2531 0x000003ff, /* dst_mask */
2532 TRUE), /* pcrel_offset */
2534 HOWTO (R_MICROMIPS_PC16_S1, /* type */
2536 2, /* size (0 = byte, 1 = short, 2 = long) */
2538 TRUE, /* pc_relative */
2540 complain_overflow_signed, /* complain_on_overflow */
2541 _bfd_mips_elf_generic_reloc, /* special_function */
2542 "R_MICROMIPS_PC16_S1", /* name */
2543 FALSE, /* partial_inplace */
2545 0x0000ffff, /* dst_mask */
2546 TRUE), /* pcrel_offset */
2548 /* 16 bit call through global offset table. */
2549 HOWTO (R_MICROMIPS_CALL16, /* type */
2551 2, /* size (0 = byte, 1 = short, 2 = long) */
2553 FALSE, /* pc_relative */
2555 complain_overflow_signed, /* complain_on_overflow */
2556 _bfd_mips_elf_generic_reloc, /* special_function */
2557 "R_MICROMIPS_CALL16", /* name */
2558 FALSE, /* partial_inplace */
2560 0x0000ffff, /* dst_mask */
2561 FALSE), /* pcrel_offset */
2566 /* Displacement in the global offset table. */
2567 HOWTO (R_MICROMIPS_GOT_DISP, /* type */
2569 2, /* size (0 = byte, 1 = short, 2 = long) */
2571 FALSE, /* pc_relative */
2573 complain_overflow_signed, /* complain_on_overflow */
2574 _bfd_mips_elf_generic_reloc, /* special_function */
2575 "R_MICROMIPS_GOT_DISP",/* name */
2576 FALSE, /* partial_inplace */
2578 0x0000ffff, /* dst_mask */
2579 FALSE), /* pcrel_offset */
2581 /* Displacement to page pointer in the global offset table. */
2582 HOWTO (R_MICROMIPS_GOT_PAGE, /* type */
2584 2, /* size (0 = byte, 1 = short, 2 = long) */
2586 FALSE, /* pc_relative */
2588 complain_overflow_signed, /* complain_on_overflow */
2589 _bfd_mips_elf_generic_reloc, /* special_function */
2590 "R_MICROMIPS_GOT_PAGE",/* name */
2591 FALSE, /* partial_inplace */
2593 0x0000ffff, /* dst_mask */
2594 FALSE), /* pcrel_offset */
2596 /* Offset from page pointer in the global offset table. */
2597 HOWTO (R_MICROMIPS_GOT_OFST, /* type */
2599 2, /* size (0 = byte, 1 = short, 2 = long) */
2601 FALSE, /* pc_relative */
2603 complain_overflow_signed, /* complain_on_overflow */
2604 _bfd_mips_elf_generic_reloc, /* special_function */
2605 "R_MICROMIPS_GOT_OFST",/* name */
2606 FALSE, /* partial_inplace */
2608 0x0000ffff, /* dst_mask */
2609 FALSE), /* pcrel_offset */
2611 /* High 16 bits of displacement in global offset table. */
2612 HOWTO (R_MICROMIPS_GOT_HI16, /* type */
2614 2, /* size (0 = byte, 1 = short, 2 = long) */
2616 FALSE, /* pc_relative */
2618 complain_overflow_dont, /* complain_on_overflow */
2619 _bfd_mips_elf_generic_reloc, /* special_function */
2620 "R_MICROMIPS_GOT_HI16",/* name */
2621 FALSE, /* partial_inplace */
2623 0x0000ffff, /* dst_mask */
2624 FALSE), /* pcrel_offset */
2626 /* Low 16 bits of displacement in global offset table. */
2627 HOWTO (R_MICROMIPS_GOT_LO16, /* type */
2629 2, /* size (0 = byte, 1 = short, 2 = long) */
2631 FALSE, /* pc_relative */
2633 complain_overflow_dont, /* complain_on_overflow */
2634 _bfd_mips_elf_generic_reloc, /* special_function */
2635 "R_MICROMIPS_GOT_LO16",/* name */
2636 FALSE, /* partial_inplace */
2638 0x0000ffff, /* dst_mask */
2639 FALSE), /* pcrel_offset */
2641 /* 64 bit subtraction. Used in the N32 ABI. */
2642 HOWTO (R_MICROMIPS_SUB, /* type */
2644 4, /* size (0 = byte, 1 = short, 2 = long) */
2646 FALSE, /* pc_relative */
2648 complain_overflow_dont, /* complain_on_overflow */
2649 _bfd_mips_elf_generic_reloc, /* special_function */
2650 "R_MICROMIPS_SUB", /* name */
2651 FALSE, /* partial_inplace */
2653 MINUS_ONE, /* dst_mask */
2654 FALSE), /* pcrel_offset */
2656 /* Get the higher value of a 64 bit addend. */
2657 HOWTO (R_MICROMIPS_HIGHER, /* type */
2659 2, /* size (0 = byte, 1 = short, 2 = long) */
2661 FALSE, /* pc_relative */
2663 complain_overflow_dont, /* complain_on_overflow */
2664 _bfd_mips_elf_generic_reloc, /* special_function */
2665 "R_MICROMIPS_HIGHER", /* name */
2666 FALSE, /* partial_inplace */
2668 0x0000ffff, /* dst_mask */
2669 FALSE), /* pcrel_offset */
2671 /* Get the highest value of a 64 bit addend. */
2672 HOWTO (R_MICROMIPS_HIGHEST, /* type */
2674 2, /* size (0 = byte, 1 = short, 2 = long) */
2676 FALSE, /* pc_relative */
2678 complain_overflow_dont, /* complain_on_overflow */
2679 _bfd_mips_elf_generic_reloc, /* special_function */
2680 "R_MICROMIPS_HIGHEST", /* name */
2681 FALSE, /* partial_inplace */
2683 0x0000ffff, /* dst_mask */
2684 FALSE), /* pcrel_offset */
2686 /* High 16 bits of displacement in global offset table. */
2687 HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2689 2, /* size (0 = byte, 1 = short, 2 = long) */
2691 FALSE, /* pc_relative */
2693 complain_overflow_dont, /* complain_on_overflow */
2694 _bfd_mips_elf_generic_reloc, /* special_function */
2695 "R_MICROMIPS_CALL_HI16",/* name */
2696 FALSE, /* partial_inplace */
2698 0x0000ffff, /* dst_mask */
2699 FALSE), /* pcrel_offset */
2701 /* Low 16 bits of displacement in global offset table. */
2702 HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2704 2, /* size (0 = byte, 1 = short, 2 = long) */
2706 FALSE, /* pc_relative */
2708 complain_overflow_dont, /* complain_on_overflow */
2709 _bfd_mips_elf_generic_reloc, /* special_function */
2710 "R_MICROMIPS_CALL_LO16",/* name */
2711 FALSE, /* partial_inplace */
2713 0x0000ffff, /* dst_mask */
2714 FALSE), /* pcrel_offset */
2716 /* Section displacement. */
2717 HOWTO (R_MICROMIPS_SCN_DISP, /* type */
2719 2, /* size (0 = byte, 1 = short, 2 = long) */
2721 FALSE, /* pc_relative */
2723 complain_overflow_dont, /* complain_on_overflow */
2724 _bfd_mips_elf_generic_reloc, /* special_function */
2725 "R_MICROMIPS_SCN_DISP", /* name */
2726 FALSE, /* partial_inplace */
2728 0xffffffff, /* dst_mask */
2729 FALSE), /* pcrel_offset */
2731 /* Protected jump conversion. This is an optimization hint. No
2732 relocation is required for correctness. */
2733 HOWTO (R_MICROMIPS_JALR, /* type */
2735 2, /* size (0 = byte, 1 = short, 2 = long) */
2737 FALSE, /* pc_relative */
2739 complain_overflow_dont, /* complain_on_overflow */
2740 _bfd_mips_elf_generic_reloc, /* special_function */
2741 "R_MICROMIPS_JALR", /* name */
2742 FALSE, /* partial_inplace */
2744 0x00000000, /* dst_mask */
2745 FALSE), /* pcrel_offset */
2748 /* GNU extension to record C++ vtable hierarchy */
2749 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
2750 HOWTO (R_MIPS_GNU_VTINHERIT, /* type */
2752 2, /* size (0 = byte, 1 = short, 2 = long) */
2754 FALSE, /* pc_relative */
2756 complain_overflow_dont, /* complain_on_overflow */
2757 NULL, /* special_function */
2758 "R_MIPS_GNU_VTINHERIT", /* name */
2759 FALSE, /* partial_inplace */
2762 FALSE); /* pcrel_offset */
2764 /* GNU extension to record C++ vtable member usage */
2765 static reloc_howto_type elf_mips_gnu_vtentry_howto =
2766 HOWTO (R_MIPS_GNU_VTENTRY, /* type */
2768 2, /* size (0 = byte, 1 = short, 2 = long) */
2770 FALSE, /* pc_relative */
2772 complain_overflow_dont, /* complain_on_overflow */
2773 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
2774 "R_MIPS_GNU_VTENTRY", /* name */
2775 FALSE, /* partial_inplace */
2778 FALSE); /* pcrel_offset */
2780 /* 16 bit offset for pc-relative branches. */
2781 static reloc_howto_type elf_mips_gnu_rel16_s2 =
2782 HOWTO (R_MIPS_GNU_REL16_S2, /* type */
2784 2, /* size (0 = byte, 1 = short, 2 = long) */
2786 TRUE, /* pc_relative */
2788 complain_overflow_signed, /* complain_on_overflow */
2789 _bfd_mips_elf_generic_reloc, /* special_function */
2790 "R_MIPS_GNU_REL16_S2", /* name */
2791 TRUE, /* partial_inplace */
2792 0x0000ffff, /* src_mask */
2793 0x0000ffff, /* dst_mask */
2794 TRUE); /* pcrel_offset */
2796 /* 16 bit offset for pc-relative branches. */
2797 static reloc_howto_type elf_mips_gnu_rela16_s2 =
2798 HOWTO (R_MIPS_GNU_REL16_S2, /* type */
2800 2, /* size (0 = byte, 1 = short, 2 = long) */
2802 TRUE, /* pc_relative */
2804 complain_overflow_signed, /* complain_on_overflow */
2805 _bfd_mips_elf_generic_reloc, /* special_function */
2806 "R_MIPS_GNU_REL16_S2", /* name */
2807 FALSE, /* partial_inplace */
2809 0x0000ffff, /* dst_mask */
2810 TRUE); /* pcrel_offset */
2812 /* 32 bit pc-relative. Used for compact EH tables. */
2813 static reloc_howto_type elf_mips_gnu_pcrel32 =
2814 HOWTO (R_MIPS_PC32, /* type */
2816 2, /* size (0 = byte, 1 = short, 2 = long) */
2818 TRUE, /* pc_relative */
2820 complain_overflow_signed, /* complain_on_overflow */
2821 _bfd_mips_elf_generic_reloc, /* special_function */
2822 "R_MIPS_PC32", /* name */
2823 TRUE, /* partial_inplace */
2824 0xffffffff, /* src_mask */
2825 0xffffffff, /* dst_mask */
2826 TRUE); /* pcrel_offset */
2829 /* Originally a VxWorks extension, but now used for other systems too. */
2830 static reloc_howto_type elf_mips_copy_howto =
2831 HOWTO (R_MIPS_COPY, /* type */
2833 0, /* this one is variable size */
2835 FALSE, /* pc_relative */
2837 complain_overflow_bitfield, /* complain_on_overflow */
2838 _bfd_mips_elf_generic_reloc, /* special_function */
2839 "R_MIPS_COPY", /* name */
2840 FALSE, /* partial_inplace */
2843 FALSE); /* pcrel_offset */
2845 /* Originally a VxWorks extension, but now used for other systems too. */
2846 static reloc_howto_type elf_mips_jump_slot_howto =
2847 HOWTO (R_MIPS_JUMP_SLOT, /* type */
2849 2, /* size (0 = byte, 1 = short, 2 = long) */
2851 FALSE, /* pc_relative */
2853 complain_overflow_bitfield, /* complain_on_overflow */
2854 _bfd_mips_elf_generic_reloc, /* special_function */
2855 "R_MIPS_JUMP_SLOT", /* name */
2856 FALSE, /* partial_inplace */
2859 FALSE); /* pcrel_offset */
2861 /* Used in EH tables. */
2862 static reloc_howto_type elf_mips_eh_howto =
2863 HOWTO (R_MIPS_EH, /* type */
2865 2, /* size (0 = byte, 1 = short, 2 = long) */
2867 FALSE, /* pc_relative */
2869 complain_overflow_signed, /* complain_on_overflow */
2870 _bfd_mips_elf_generic_reloc, /* special_function */
2871 "R_MIPS_EH", /* name */
2872 TRUE, /* partial_inplace */
2873 0xffffffff, /* src_mask */
2874 0xffffffff, /* dst_mask */
2875 FALSE); /* pcrel_offset */
2878 /* Set the GP value for OUTPUT_BFD. Returns FALSE if this is a
2879 dangerous relocation. */
2882 mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
2888 /* If we've already figured out what GP will be, just return it. */
2889 *pgp = _bfd_get_gp_value (output_bfd);
2893 count = bfd_get_symcount (output_bfd);
2894 sym = bfd_get_outsymbols (output_bfd);
2896 /* The linker script will have created a symbol named `_gp' with the
2897 appropriate value. */
2902 for (i = 0; i < count; i++, sym++)
2904 register const char *name;
2906 name = bfd_asymbol_name (*sym);
2907 if (*name == '_' && strcmp (name, "_gp") == 0)
2909 *pgp = bfd_asymbol_value (*sym);
2910 _bfd_set_gp_value (output_bfd, *pgp);
2918 /* Only get the error once. */
2920 _bfd_set_gp_value (output_bfd, *pgp);
2927 /* We have to figure out the gp value, so that we can adjust the
2928 symbol value correctly. We look up the symbol _gp in the output
2929 BFD. If we can't find it, we're stuck. We cache it in the ELF
2930 target data. We don't need to adjust the symbol value for an
2931 external symbol if we are producing relocatable output. */
2933 static bfd_reloc_status_type
2934 mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
2935 char **error_message, bfd_vma *pgp)
2937 if (bfd_is_und_section (symbol->section)
2941 return bfd_reloc_undefined;
2944 *pgp = _bfd_get_gp_value (output_bfd);
2947 || (symbol->flags & BSF_SECTION_SYM) != 0))
2951 /* Make up a value. */
2952 *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
2953 _bfd_set_gp_value (output_bfd, *pgp);
2955 else if (!mips_elf_assign_gp (output_bfd, pgp))
2958 (char *) _("GP relative relocation when _gp not defined");
2959 return bfd_reloc_dangerous;
2963 return bfd_reloc_ok;
2966 /* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must
2967 become the offset from the gp register. */
2969 static bfd_reloc_status_type
2970 mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2971 asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2972 asection *input_section, bfd *output_bfd,
2973 char **error_message ATTRIBUTE_UNUSED)
2975 bfd_boolean relocatable;
2976 bfd_reloc_status_type ret;
2979 if (output_bfd != NULL)
2983 relocatable = FALSE;
2984 output_bfd = symbol->section->output_section->owner;
2987 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
2989 if (ret != bfd_reloc_ok)
2992 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2993 input_section, relocatable,
2997 /* Do a R_MIPS_LITERAL relocation. */
2999 static bfd_reloc_status_type
3000 mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3001 void *data, asection *input_section, bfd *output_bfd,
3002 char **error_message)
3004 bfd_boolean relocatable;
3005 bfd_reloc_status_type ret;
3008 /* R_MIPS_LITERAL relocations are defined for local symbols only. */
3009 if (output_bfd != NULL
3010 && (symbol->flags & BSF_SECTION_SYM) == 0
3011 && (symbol->flags & BSF_LOCAL) != 0)
3013 *error_message = (char *)
3014 _("literal relocation occurs for an external symbol");
3015 return bfd_reloc_outofrange;
3018 /* FIXME: The entries in the .lit8 and .lit4 sections should be merged. */
3019 if (output_bfd != NULL)
3023 relocatable = FALSE;
3024 output_bfd = symbol->section->output_section->owner;
3027 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
3029 if (ret != bfd_reloc_ok)
3032 return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3033 input_section, relocatable,
3037 /* Do a R_MIPS_GPREL32 relocation. This is a 32 bit value which must
3038 become the offset from the gp register. */
3040 static bfd_reloc_status_type
3041 mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3042 void *data, asection *input_section, bfd *output_bfd,
3043 char **error_message)
3045 bfd_boolean relocatable;
3046 bfd_reloc_status_type ret;
3049 /* R_MIPS_GPREL32 relocations are defined for local symbols only. */
3050 if (output_bfd != NULL
3051 && (symbol->flags & BSF_SECTION_SYM) == 0
3052 && (symbol->flags & BSF_LOCAL) != 0)
3054 *error_message = (char *)
3055 _("32bits gp relative relocation occurs for an external symbol");
3056 return bfd_reloc_outofrange;
3059 if (output_bfd != NULL)
3062 gp = _bfd_get_gp_value (output_bfd);
3066 relocatable = FALSE;
3067 output_bfd = symbol->section->output_section->owner;
3069 ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
3070 error_message, &gp);
3071 if (ret != bfd_reloc_ok)
3075 return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
3076 relocatable, data, gp);
3079 static bfd_reloc_status_type
3080 gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
3081 asection *input_section, bfd_boolean relocatable,
3082 void *data, bfd_vma gp)
3087 if (bfd_is_com_section (symbol->section))
3090 relocation = symbol->value;
3092 relocation += symbol->section->output_section->vma;
3093 relocation += symbol->section->output_offset;
3095 if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
3096 return bfd_reloc_outofrange;
3098 if (reloc_entry->howto->src_mask == 0)
3101 val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
3103 /* Set val to the offset into the section or symbol. */
3104 val += reloc_entry->addend;
3106 /* Adjust val for the final section location and GP value. If we
3107 are producing relocatable output, we don't want to do this for
3108 an external symbol. */
3110 || (symbol->flags & BSF_SECTION_SYM) != 0)
3111 val += relocation - gp;
3113 bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
3116 reloc_entry->address += input_section->output_offset;
3118 return bfd_reloc_ok;
3121 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
3122 the rest is at bits 6-10. The bitpos already got right by the howto. */
3124 static bfd_reloc_status_type
3125 mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3126 void *data, asection *input_section, bfd *output_bfd,
3127 char **error_message)
3129 if (reloc_entry->howto->partial_inplace)
3131 reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
3132 | (reloc_entry->addend & 0x00000800) >> 9);
3135 return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
3136 input_section, output_bfd,
3140 /* Handle a mips16 GP relative reloc. */
3142 static bfd_reloc_status_type
3143 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3144 void *data, asection *input_section, bfd *output_bfd,
3145 char **error_message)
3147 bfd_boolean relocatable;
3148 bfd_reloc_status_type ret;
3152 /* If we're relocating, and this is an external symbol, we don't want
3153 to change anything. */
3154 if (output_bfd != NULL
3155 && (symbol->flags & BSF_SECTION_SYM) == 0
3156 && (symbol->flags & BSF_LOCAL) != 0)
3158 reloc_entry->address += input_section->output_offset;
3159 return bfd_reloc_ok;
3162 if (output_bfd != NULL)
3166 relocatable = FALSE;
3167 output_bfd = symbol->section->output_section->owner;
3170 ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
3172 if (ret != bfd_reloc_ok)
3175 location = (bfd_byte *) data + reloc_entry->address;
3176 _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
3178 ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3179 input_section, relocatable,
3181 _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
3187 /* A mapping from BFD reloc types to MIPS ELF reloc types. */
3189 struct elf_reloc_map {
3190 bfd_reloc_code_real_type bfd_val;
3191 enum elf_mips_reloc_type elf_val;
3194 static const struct elf_reloc_map mips_reloc_map[] =
3196 { BFD_RELOC_NONE, R_MIPS_NONE },
3197 { BFD_RELOC_16, R_MIPS_16 },
3198 { BFD_RELOC_32, R_MIPS_32 },
3199 /* There is no BFD reloc for R_MIPS_REL32. */
3200 { BFD_RELOC_CTOR, R_MIPS_32 },
3201 { BFD_RELOC_64, R_MIPS_64 },
3202 { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
3203 { BFD_RELOC_HI16_S, R_MIPS_HI16 },
3204 { BFD_RELOC_LO16, R_MIPS_LO16 },
3205 { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
3206 { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
3207 { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
3208 { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
3209 { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
3210 { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
3211 { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
3212 { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
3213 { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
3214 { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
3215 { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
3216 { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
3217 { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
3218 { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
3219 { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
3220 { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
3221 { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
3222 { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
3223 { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
3224 { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
3225 { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
3226 { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
3227 { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
3228 /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated. */
3229 { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
3230 { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
3231 { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
3232 { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
3233 { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
3234 { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
3235 { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
3236 { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
3237 { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
3238 { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
3239 { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
3240 { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
3241 { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
3242 { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
3243 { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 },
3244 { BFD_RELOC_MIPS_21_PCREL_S2, R_MIPS_PC21_S2 },
3245 { BFD_RELOC_MIPS_26_PCREL_S2, R_MIPS_PC26_S2 },
3246 { BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
3247 { BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
3248 { BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
3249 { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
3252 static const struct elf_reloc_map mips16_reloc_map[] =
3254 { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
3255 { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
3256 { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
3257 { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
3258 { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
3259 { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
3260 { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
3261 { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
3262 { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
3263 R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
3264 { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
3265 R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
3266 { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
3267 { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
3268 { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min },
3269 { BFD_RELOC_MIPS16_16_PCREL_S1, R_MIPS16_PC16_S1 - R_MIPS16_min }
3272 static const struct elf_reloc_map micromips_reloc_map[] =
3274 { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
3275 { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
3276 { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
3277 { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
3278 { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
3279 { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
3280 { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
3281 { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
3282 { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
3283 { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
3284 { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
3285 { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
3286 { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
3287 { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
3288 { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
3289 { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
3290 { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
3291 { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
3292 { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
3293 { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
3294 { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
3295 { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
3298 /* Given a BFD reloc type, return a howto structure. */
3300 static reloc_howto_type *
3301 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3302 bfd_reloc_code_real_type code)
3305 /* FIXME: We default to RELA here instead of choosing the right
3306 relocation variant. */
3307 reloc_howto_type *howto_table = elf_mips_howto_table_rela;
3308 reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
3309 reloc_howto_type *howto_micromips_table = elf_micromips_howto_table_rela;
3311 for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
3314 if (mips_reloc_map[i].bfd_val == code)
3315 return &howto_table[(int) mips_reloc_map[i].elf_val];
3318 for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
3321 if (mips16_reloc_map[i].bfd_val == code)
3322 return &howto16_table[(int) mips16_reloc_map[i].elf_val];
3325 for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
3328 if (micromips_reloc_map[i].bfd_val == code)
3329 return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
3334 case BFD_RELOC_VTABLE_INHERIT:
3335 return &elf_mips_gnu_vtinherit_howto;
3336 case BFD_RELOC_VTABLE_ENTRY:
3337 return &elf_mips_gnu_vtentry_howto;
3338 case BFD_RELOC_32_PCREL:
3339 return &elf_mips_gnu_pcrel32;
3340 case BFD_RELOC_MIPS_EH:
3341 return &elf_mips_eh_howto;
3342 case BFD_RELOC_MIPS_COPY:
3343 return &elf_mips_copy_howto;
3344 case BFD_RELOC_MIPS_JUMP_SLOT:
3345 return &elf_mips_jump_slot_howto;
3347 bfd_set_error (bfd_error_bad_value);
3352 static reloc_howto_type *
3353 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3359 i < (sizeof (elf_mips_howto_table_rela)
3360 / sizeof (elf_mips_howto_table_rela[0]));
3362 if (elf_mips_howto_table_rela[i].name != NULL
3363 && strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
3364 return &elf_mips_howto_table_rela[i];
3367 i < (sizeof (elf_mips16_howto_table_rela)
3368 / sizeof (elf_mips16_howto_table_rela[0]));
3370 if (elf_mips16_howto_table_rela[i].name != NULL
3371 && strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
3372 return &elf_mips16_howto_table_rela[i];
3375 i < (sizeof (elf_micromips_howto_table_rela)
3376 / sizeof (elf_micromips_howto_table_rela[0]));
3378 if (elf_micromips_howto_table_rela[i].name != NULL
3379 && strcasecmp (elf_micromips_howto_table_rela[i].name, r_name) == 0)
3380 return &elf_micromips_howto_table_rela[i];
3382 if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
3383 return &elf_mips_gnu_vtinherit_howto;
3384 if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
3385 return &elf_mips_gnu_vtentry_howto;
3386 if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
3387 return &elf_mips_gnu_rel16_s2;
3388 if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
3389 return &elf_mips_gnu_rela16_s2;
3390 if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
3391 return &elf_mips_gnu_pcrel32;
3392 if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0)
3393 return &elf_mips_eh_howto;
3394 if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
3395 return &elf_mips_copy_howto;
3396 if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
3397 return &elf_mips_jump_slot_howto;
3402 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
3404 static reloc_howto_type *
3405 mips_elf_n32_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
3409 case R_MIPS_GNU_VTINHERIT:
3410 return &elf_mips_gnu_vtinherit_howto;
3411 case R_MIPS_GNU_VTENTRY:
3412 return &elf_mips_gnu_vtentry_howto;
3413 case R_MIPS_GNU_REL16_S2:
3415 return &elf_mips_gnu_rela16_s2;
3417 return &elf_mips_gnu_rel16_s2;
3419 return &elf_mips_gnu_pcrel32;
3421 return &elf_mips_eh_howto;
3423 return &elf_mips_copy_howto;
3424 case R_MIPS_JUMP_SLOT:
3425 return &elf_mips_jump_slot_howto;
3427 if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
3430 return &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min];
3432 return &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min];
3434 if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
3437 return &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
3439 return &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
3441 if (r_type >= R_MIPS_max)
3443 _bfd_error_handler (_("unrecognised MIPS reloc number: %d"), r_type);
3444 bfd_set_error (bfd_error_bad_value);
3445 r_type = R_MIPS_NONE;
3448 return &elf_mips_howto_table_rela[r_type];
3450 return &elf_mips_howto_table_rel[r_type];
3455 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure. */
3458 mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
3460 unsigned int r_type;
3462 r_type = ELF32_R_TYPE (dst->r_info);
3463 cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, FALSE);
3465 /* The addend for a GPREL16 or LITERAL relocation comes from the GP
3466 value for the object file. We get the addend now, rather than
3467 when we do the relocation, because the symbol manipulations done
3468 by the linker may cause us to lose track of the input BFD. */
3469 if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
3470 && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
3471 cache_ptr->addend = elf_gp (abfd);
3474 /* Given a MIPS Elf_Internal_Rela, fill in an arelent structure. */
3477 mips_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
3478 arelent *cache_ptr, Elf_Internal_Rela *dst)
3480 unsigned int r_type;
3482 r_type = ELF32_R_TYPE (dst->r_info);
3483 cache_ptr->howto = mips_elf_n32_rtype_to_howto (r_type, TRUE);
3484 cache_ptr->addend = dst->r_addend;
3487 /* Determine whether a symbol is global for the purposes of splitting
3488 the symbol table into global symbols and local symbols. At least
3489 on Irix 5, this split must be between section symbols and all other
3490 symbols. On most ELF targets the split is between static symbols
3491 and externally visible symbols. */
3494 mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
3496 if (SGI_COMPAT (abfd))
3497 return (sym->flags & BSF_SECTION_SYM) == 0;
3499 return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
3500 || bfd_is_und_section (bfd_get_section (sym))
3501 || bfd_is_com_section (bfd_get_section (sym)));
3504 /* Set the right machine number for a MIPS ELF file. */
3507 mips_elf_n32_object_p (bfd *abfd)
3511 if (!ABI_N32_P (abfd))
3514 /* Irix 5 and 6 are broken. Object file symbol tables are not always
3515 sorted correctly such that local symbols precede global symbols,
3516 and the sh_info field in the symbol table is not always right. */
3517 if (SGI_COMPAT (abfd))
3518 elf_bad_symtab (abfd) = TRUE;
3520 mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
3521 bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
3525 /* Support for core dump NOTE sections. */
3527 elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3532 switch (note->descsz)
3537 case 440: /* Linux/MIPS N32 */
3539 elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3542 elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
3551 /* Make a ".reg/999" section. */
3552 return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
3553 note->descpos + offset);
3557 elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3559 switch (note->descsz)
3564 case 128: /* Linux/MIPS elf_prpsinfo */
3565 elf_tdata (abfd)->core->program
3566 = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
3567 elf_tdata (abfd)->core->command
3568 = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3571 /* Note that for some reason, a spurious space is tacked
3572 onto the end of the args in some (at least one anyway)
3573 implementations, so strip it off if it exists. */
3576 char *command = elf_tdata (abfd)->core->command;
3577 int n = strlen (command);
3579 if (0 < n && command[n - 1] == ' ')
3580 command[n - 1] = '\0';
3587 elf_n32_mips_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
3593 /* Compute offset of pr_getregsz, skipping over pr_statussz.
3594 Also compute minimum size of this note. */
3596 min_size = offset + 4 * 2 + 4 + 4 + 4;
3598 if (note->descsz < min_size)
3601 /* Check for version 1 in pr_version. */
3602 if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
3605 /* Extract size of pr_reg from pr_gregsetsz. */
3606 /* Skip over pr_gregsetsz and pr_fpregsetsz. */
3607 size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
3610 /* Skip over pr_osreldate. */
3613 /* Read signal from pr_cursig. */
3614 if (elf_tdata (abfd)->core->signal == 0)
3615 elf_tdata (abfd)->core->signal
3616 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
3619 /* Read TID from pr_pid. */
3620 elf_tdata (abfd)->core->lwpid
3621 = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
3624 /* Padding before pr_reg. */
3627 /* Make sure that there is enough data remaining in the note. */
3628 if (note->descsz - offset < size)
3631 /* Make a ".reg/999" section and a ".reg" section. */
3632 return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3633 size, note->descpos + offset);
3636 /* Depending on the target vector we generate some version of Irix
3637 executables or "normal" MIPS ELF ABI executables. */
3638 static irix_compat_t
3639 elf_n32_mips_irix_compat (bfd *abfd)
3641 if ((abfd->xvec == &mips_elf32_n_be_vec)
3642 || (abfd->xvec == &mips_elf32_n_le_vec))
3648 /* Make an n32 MIPS object. We need to set the n32 ABI flag in
3649 `e_flags' to tell the object apart from an o32 object. */
3652 mips_elf_n32_mkobject (bfd *abfd)
3656 ret = _bfd_mips_elf_mkobject (abfd);
3658 elf_elfheader (abfd)->e_flags |= EF_MIPS_ABI2;
3663 /* ECOFF swapping routines. These are used when dealing with the
3664 .mdebug section, which is in the ECOFF debugging format. */
3665 static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
3666 /* Symbol table magic number. */
3668 /* Alignment of debugging information. E.g., 4. */
3670 /* Sizes of external symbolic information. */
3671 sizeof (struct hdr_ext),
3672 sizeof (struct dnr_ext),
3673 sizeof (struct pdr_ext),
3674 sizeof (struct sym_ext),
3675 sizeof (struct opt_ext),
3676 sizeof (struct fdr_ext),
3677 sizeof (struct rfd_ext),
3678 sizeof (struct ext_ext),
3679 /* Functions to swap in external symbolic data. */
3688 _bfd_ecoff_swap_tir_in,
3689 _bfd_ecoff_swap_rndx_in,
3690 /* Functions to swap out external symbolic data. */
3699 _bfd_ecoff_swap_tir_out,
3700 _bfd_ecoff_swap_rndx_out,
3701 /* Function to read in symbolic data. */
3702 _bfd_mips_elf_read_ecoff_info
3705 #define ELF_ARCH bfd_arch_mips
3706 #define ELF_TARGET_ID MIPS_ELF_DATA
3707 #define ELF_MACHINE_CODE EM_MIPS
3709 #define elf_backend_collect TRUE
3710 #define elf_backend_type_change_ok TRUE
3711 #define elf_backend_can_gc_sections TRUE
3712 #define elf_backend_gc_mark_extra_sections \
3713 _bfd_mips_elf_gc_mark_extra_sections
3714 #define elf_info_to_howto mips_info_to_howto_rela
3715 #define elf_info_to_howto_rel mips_info_to_howto_rel
3716 #define elf_backend_sym_is_global mips_elf_sym_is_global
3717 #define elf_backend_object_p mips_elf_n32_object_p
3718 #define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
3719 #define elf_backend_section_processing _bfd_mips_elf_section_processing
3720 #define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr
3721 #define elf_backend_fake_sections _bfd_mips_elf_fake_sections
3722 #define elf_backend_section_from_bfd_section \
3723 _bfd_mips_elf_section_from_bfd_section
3724 #define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook
3725 #define elf_backend_link_output_symbol_hook \
3726 _bfd_mips_elf_link_output_symbol_hook
3727 #define elf_backend_create_dynamic_sections \
3728 _bfd_mips_elf_create_dynamic_sections
3729 #define elf_backend_check_relocs _bfd_mips_elf_check_relocs
3730 #define elf_backend_merge_symbol_attribute \
3731 _bfd_mips_elf_merge_symbol_attribute
3732 #define elf_backend_get_target_dtag _bfd_mips_elf_get_target_dtag
3733 #define elf_backend_adjust_dynamic_symbol \
3734 _bfd_mips_elf_adjust_dynamic_symbol
3735 #define elf_backend_always_size_sections \
3736 _bfd_mips_elf_always_size_sections
3737 #define elf_backend_size_dynamic_sections \
3738 _bfd_mips_elf_size_dynamic_sections
3739 #define elf_backend_init_index_section _bfd_elf_init_1_index_section
3740 #define elf_backend_relocate_section _bfd_mips_elf_relocate_section
3741 #define elf_backend_finish_dynamic_symbol \
3742 _bfd_mips_elf_finish_dynamic_symbol
3743 #define elf_backend_finish_dynamic_sections \
3744 _bfd_mips_elf_finish_dynamic_sections
3745 #define elf_backend_final_write_processing \
3746 _bfd_mips_elf_final_write_processing
3747 #define elf_backend_additional_program_headers \
3748 _bfd_mips_elf_additional_program_headers
3749 #define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map
3750 #define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook
3751 #define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook
3752 #define elf_backend_copy_indirect_symbol \
3753 _bfd_mips_elf_copy_indirect_symbol
3754 #define elf_backend_grok_prstatus elf32_mips_grok_prstatus
3755 #define elf_backend_grok_psinfo elf32_mips_grok_psinfo
3756 #define elf_backend_grok_freebsd_prstatus \
3757 elf_n32_mips_grok_freebsd_prstatus
3758 #define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap
3760 #define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO)
3761 #define elf_backend_want_dynrelro 1
3763 /* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
3764 work better/work only in RELA, so we default to this. */
3765 #define elf_backend_may_use_rel_p 1
3766 #define elf_backend_may_use_rela_p 1
3767 #define elf_backend_default_use_rela_p 1
3768 #define elf_backend_rela_plts_and_copies_p 0
3769 #define elf_backend_sign_extend_vma TRUE
3770 #define elf_backend_plt_readonly 1
3771 #define elf_backend_plt_sym_val _bfd_mips_elf_plt_sym_val
3773 #define elf_backend_discard_info _bfd_mips_elf_discard_info
3774 #define elf_backend_ignore_discarded_relocs \
3775 _bfd_mips_elf_ignore_discarded_relocs
3776 #define elf_backend_write_section _bfd_mips_elf_write_section
3777 #define elf_backend_mips_irix_compat elf_n32_mips_irix_compat
3778 #define elf_backend_mips_rtype_to_howto mips_elf_n32_rtype_to_howto
3779 #define bfd_elf32_bfd_is_target_special_symbol \
3780 _bfd_mips_elf_is_target_special_symbol
3781 #define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line
3782 #define bfd_elf32_find_inliner_info _bfd_mips_elf_find_inliner_info
3783 #define bfd_elf32_new_section_hook _bfd_mips_elf_new_section_hook
3784 #define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents
3785 #define bfd_elf32_bfd_get_relocated_section_contents \
3786 _bfd_elf_mips_get_relocated_section_contents
3787 #define bfd_elf32_bfd_link_hash_table_create \
3788 _bfd_mips_elf_link_hash_table_create
3789 #define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link
3790 #define bfd_elf32_bfd_merge_private_bfd_data \
3791 _bfd_mips_elf_merge_private_bfd_data
3792 #define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
3793 #define bfd_elf32_bfd_print_private_bfd_data \
3794 _bfd_mips_elf_print_private_bfd_data
3795 #define bfd_elf32_mkobject mips_elf_n32_mkobject
3797 /* Support for SGI-ish mips targets using n32 ABI. */
3799 #define TARGET_LITTLE_SYM mips_elf32_n_le_vec
3800 #define TARGET_LITTLE_NAME "elf32-nlittlemips"
3801 #define TARGET_BIG_SYM mips_elf32_n_be_vec
3802 #define TARGET_BIG_NAME "elf32-nbigmips"
3804 #define ELF_MAXPAGESIZE 0x10000
3805 #define ELF_COMMONPAGESIZE 0x1000
3807 #include "elf32-target.h"
3809 /* Support for traditional mips targets using n32 ABI. */
3810 #undef TARGET_LITTLE_SYM
3811 #undef TARGET_LITTLE_NAME
3812 #undef TARGET_BIG_SYM
3813 #undef TARGET_BIG_NAME
3815 #undef ELF_MAXPAGESIZE
3816 #undef ELF_COMMONPAGESIZE
3818 #define TARGET_LITTLE_SYM mips_elf32_ntrad_le_vec
3819 #define TARGET_LITTLE_NAME "elf32-ntradlittlemips"
3820 #define TARGET_BIG_SYM mips_elf32_ntrad_be_vec
3821 #define TARGET_BIG_NAME "elf32-ntradbigmips"
3823 #define ELF_MAXPAGESIZE 0x10000
3824 #define ELF_COMMONPAGESIZE 0x1000
3825 #define elf32_bed elf32_tradbed
3827 /* Include the target file again for this target. */
3828 #include "elf32-target.h"
3831 /* FreeBSD support. */
3833 #undef TARGET_LITTLE_SYM
3834 #undef TARGET_LITTLE_NAME
3835 #undef TARGET_BIG_SYM
3836 #undef TARGET_BIG_NAME
3838 #define TARGET_LITTLE_SYM mips_elf32_ntradfbsd_le_vec
3839 #define TARGET_LITTLE_NAME "elf32-ntradlittlemips-freebsd"
3840 #define TARGET_BIG_SYM mips_elf32_ntradfbsd_be_vec
3841 #define TARGET_BIG_NAME "elf32-ntradbigmips-freebsd"
3844 #define ELF_OSABI ELFOSABI_FREEBSD
3847 #define elf32_bed elf32_fbsd_tradbed
3849 #include "elf32-target.h"