]> Git Repo - binutils.git/blob - bfd/elfn32-mips.c
gdb/testsuite: more testing of pretty printer 'array' display_hint
[binutils.git] / bfd / elfn32-mips.c
1 /* MIPS-specific support for 32-bit ELF
2    Copyright (C) 1993-2021 Free Software Foundation, Inc.
3
4    Most of the information added by Ian Lance Taylor, Cygnus Support,
5    <[email protected]>.
6    N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
7    <[email protected]>
8    Traditional MIPS targets support added by Koundinya.K, Dansk Data
9    Elektronik & Operations Research Group. <[email protected]>
10
11    This file is part of BFD, the Binary File Descriptor library.
12
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.
17
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.
22
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.  */
27
28
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.  */
32
33 #include "sysdep.h"
34 #include "bfd.h"
35 #include "libbfd.h"
36 #include "bfdlink.h"
37 #include "genlink.h"
38 #include "elf-bfd.h"
39 #include "elfxx-mips.h"
40 #include "elf/mips.h"
41
42 /* Get the ECOFF swapping routines.  */
43 #include "coff/sym.h"
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"
50
51 static bfd_boolean mips_elf_assign_gp
52   (bfd *, bfd_vma *);
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 bfd_boolean mips_info_to_howto_rel
70   (bfd *, arelent *, Elf_Internal_Rela *);
71 static bfd_boolean mips_info_to_howto_rela
72   (bfd *, arelent *, Elf_Internal_Rela *);
73 static bfd_boolean mips_elf_sym_is_global
74   (bfd *, asymbol *);
75 static bfd_boolean mips_elf_n32_elfsym_local_is_section
76   (bfd *);
77 static bfd_boolean mips_elf_n32_object_p
78   (bfd *);
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
86   (bfd *);
87 static bfd_boolean mips_elf_n32_mkobject
88   (bfd *);
89
90 extern const bfd_target mips_elf32_n_be_vec;
91 extern const bfd_target mips_elf32_n_le_vec;
92
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)
96
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)
100
101 /* The number of local .got entries we reserve.  */
102 #define MIPS_RESERVED_GOTNO (2)
103
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)
107
108 /* The relocation table used for SHT_REL sections.  */
109
110 static reloc_howto_type elf_mips_howto_table_rel[] =
111 {
112   /* No relocation.  */
113   HOWTO (R_MIPS_NONE,           /* type */
114          0,                     /* rightshift */
115          3,                     /* size (0 = byte, 1 = short, 2 = long) */
116          0,                     /* bitsize */
117          FALSE,                 /* pc_relative */
118          0,                     /* bitpos */
119          complain_overflow_dont, /* complain_on_overflow */
120          _bfd_mips_elf_generic_reloc, /* special_function */
121          "R_MIPS_NONE",         /* name */
122          FALSE,                 /* partial_inplace */
123          0,                     /* src_mask */
124          0,                     /* dst_mask */
125          FALSE),                /* pcrel_offset */
126
127   /* 16 bit relocation.  */
128   HOWTO (R_MIPS_16,             /* type */
129          0,                     /* rightshift */
130          2,                     /* size (0 = byte, 1 = short, 2 = long) */
131          16,                    /* bitsize */
132          FALSE,                 /* pc_relative */
133          0,                     /* bitpos */
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 */
141
142   /* 32 bit relocation.  */
143   HOWTO (R_MIPS_32,             /* type */
144          0,                     /* rightshift */
145          2,                     /* size (0 = byte, 1 = short, 2 = long) */
146          32,                    /* bitsize */
147          FALSE,                 /* pc_relative */
148          0,                     /* bitpos */
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 */
156
157   /* 32 bit symbol relative relocation.  */
158   HOWTO (R_MIPS_REL32,          /* type */
159          0,                     /* rightshift */
160          2,                     /* size (0 = byte, 1 = short, 2 = long) */
161          32,                    /* bitsize */
162          FALSE,                 /* pc_relative */
163          0,                     /* bitpos */
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 */
171
172   /* 26 bit jump address.  */
173   HOWTO (R_MIPS_26,             /* type */
174          2,                     /* rightshift */
175          2,                     /* size (0 = byte, 1 = short, 2 = long) */
176          26,                    /* bitsize */
177          FALSE,                 /* pc_relative */
178          0,                     /* bitpos */
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 */
189
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. */
192
193   /* High 16 bits of symbol value.  */
194   HOWTO (R_MIPS_HI16,           /* type */
195          16,                    /* rightshift */
196          2,                     /* size (0 = byte, 1 = short, 2 = long) */
197          16,                    /* bitsize */
198          FALSE,                 /* pc_relative */
199          0,                     /* bitpos */
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 */
207
208   /* Low 16 bits of symbol value.  */
209   HOWTO (R_MIPS_LO16,           /* type */
210          0,                     /* rightshift */
211          2,                     /* size (0 = byte, 1 = short, 2 = long) */
212          16,                    /* bitsize */
213          FALSE,                 /* pc_relative */
214          0,                     /* bitpos */
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 */
222
223   /* GP relative reference.  */
224   HOWTO (R_MIPS_GPREL16,        /* type */
225          0,                     /* rightshift */
226          2,                     /* size (0 = byte, 1 = short, 2 = long) */
227          16,                    /* bitsize */
228          FALSE,                 /* pc_relative */
229          0,                     /* bitpos */
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 */
237
238   /* Reference to literal section.  */
239   HOWTO (R_MIPS_LITERAL,        /* type */
240          0,                     /* rightshift */
241          2,                     /* size (0 = byte, 1 = short, 2 = long) */
242          16,                    /* bitsize */
243          FALSE,                 /* pc_relative */
244          0,                     /* bitpos */
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 */
252
253   /* Reference to global offset table.  */
254   HOWTO (R_MIPS_GOT16,          /* type */
255          0,                     /* rightshift */
256          2,                     /* size (0 = byte, 1 = short, 2 = long) */
257          16,                    /* bitsize */
258          FALSE,                 /* pc_relative */
259          0,                     /* bitpos */
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 */
267
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 */
272          2,                     /* rightshift */
273          2,                     /* size (0 = byte, 1 = short, 2 = long) */
274          16,                    /* bitsize */
275          TRUE,                  /* pc_relative */
276          0,                     /* bitpos */
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 */
284
285   /* 16 bit call through global offset table.  */
286   HOWTO (R_MIPS_CALL16,         /* type */
287          0,                     /* rightshift */
288          2,                     /* size (0 = byte, 1 = short, 2 = long) */
289          16,                    /* bitsize */
290          FALSE,                 /* pc_relative */
291          0,                     /* bitpos */
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 */
299
300   /* 32 bit GP relative reference.  */
301   HOWTO (R_MIPS_GPREL32,        /* type */
302          0,                     /* rightshift */
303          2,                     /* size (0 = byte, 1 = short, 2 = long) */
304          32,                    /* bitsize */
305          FALSE,                 /* pc_relative */
306          0,                     /* bitpos */
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 */
314
315   /* The remaining relocs are defined on Irix 5, although they are
316      not defined by the ABI.  */
317   EMPTY_HOWTO (13),
318   EMPTY_HOWTO (14),
319   EMPTY_HOWTO (15),
320
321   /* A 5 bit shift field.  */
322   HOWTO (R_MIPS_SHIFT5,         /* type */
323          0,                     /* rightshift */
324          2,                     /* size (0 = byte, 1 = short, 2 = long) */
325          5,                     /* bitsize */
326          FALSE,                 /* pc_relative */
327          6,                     /* bitpos */
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 */
335
336   /* A 6 bit shift field.  */
337   HOWTO (R_MIPS_SHIFT6,         /* type */
338          0,                     /* rightshift */
339          2,                     /* size (0 = byte, 1 = short, 2 = long) */
340          6,                     /* bitsize */
341          FALSE,                 /* pc_relative */
342          6,                     /* bitpos */
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 */
350
351   /* A 64 bit relocation.  */
352   HOWTO (R_MIPS_64,             /* type */
353          0,                     /* rightshift */
354          4,                     /* size (0 = byte, 1 = short, 2 = long) */
355          64,                    /* bitsize */
356          FALSE,                 /* pc_relative */
357          0,                     /* bitpos */
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 */
365
366   /* Displacement in the global offset table.  */
367   HOWTO (R_MIPS_GOT_DISP,       /* type */
368          0,                     /* rightshift */
369          2,                     /* size (0 = byte, 1 = short, 2 = long) */
370          16,                    /* bitsize */
371          FALSE,                 /* pc_relative */
372          0,                     /* bitpos */
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 */
380
381   /* Displacement to page pointer in the global offset table.  */
382   HOWTO (R_MIPS_GOT_PAGE,       /* type */
383          0,                     /* rightshift */
384          2,                     /* size (0 = byte, 1 = short, 2 = long) */
385          16,                    /* bitsize */
386          FALSE,                 /* pc_relative */
387          0,                     /* bitpos */
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 */
395
396   /* Offset from page pointer in the global offset table.  */
397   HOWTO (R_MIPS_GOT_OFST,       /* type */
398          0,                     /* rightshift */
399          2,                     /* size (0 = byte, 1 = short, 2 = long) */
400          16,                    /* bitsize */
401          FALSE,                 /* pc_relative */
402          0,                     /* bitpos */
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 */
410
411   /* High 16 bits of displacement in global offset table.  */
412   HOWTO (R_MIPS_GOT_HI16,       /* type */
413          0,                     /* rightshift */
414          2,                     /* size (0 = byte, 1 = short, 2 = long) */
415          16,                    /* bitsize */
416          FALSE,                 /* pc_relative */
417          0,                     /* bitpos */
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 */
425
426   /* Low 16 bits of displacement in global offset table.  */
427   HOWTO (R_MIPS_GOT_LO16,       /* type */
428          0,                     /* rightshift */
429          2,                     /* size (0 = byte, 1 = short, 2 = long) */
430          16,                    /* bitsize */
431          FALSE,                 /* pc_relative */
432          0,                     /* bitpos */
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 */
440
441   /* 64 bit subtraction.  */
442   HOWTO (R_MIPS_SUB,            /* type */
443          0,                     /* rightshift */
444          4,                     /* size (0 = byte, 1 = short, 2 = long) */
445          64,                    /* bitsize */
446          FALSE,                 /* pc_relative */
447          0,                     /* bitpos */
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 */
455
456   /* Insert the addend as an instruction.  */
457   /* FIXME: Not handled correctly.  */
458   HOWTO (R_MIPS_INSERT_A,       /* type */
459          0,                     /* rightshift */
460          2,                     /* size (0 = byte, 1 = short, 2 = long) */
461          32,                    /* bitsize */
462          FALSE,                 /* pc_relative */
463          0,                     /* bitpos */
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 */
471
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 */
476          0,                     /* rightshift */
477          2,                     /* size (0 = byte, 1 = short, 2 = long) */
478          32,                    /* bitsize */
479          FALSE,                 /* pc_relative */
480          0,                     /* bitpos */
481          complain_overflow_dont, /* complain_on_overflow */
482          _bfd_mips_elf_generic_reloc, /* special_function */
483          "R_MIPS_INSERT_B",     /* name */
484          TRUE,                  /* partial_inplace */
485          0xffffffff,            /* src_mask */
486          0xffffffff,            /* dst_mask */
487          FALSE),                /* pcrel_offset */
488
489   /* Delete a 32 bit instruction.  */
490   /* FIXME: Not handled correctly.  */
491   HOWTO (R_MIPS_DELETE,         /* type */
492          0,                     /* rightshift */
493          2,                     /* size (0 = byte, 1 = short, 2 = long) */
494          32,                    /* bitsize */
495          FALSE,                 /* pc_relative */
496          0,                     /* bitpos */
497          complain_overflow_dont, /* complain_on_overflow */
498          _bfd_mips_elf_generic_reloc, /* special_function */
499          "R_MIPS_DELETE",       /* name */
500          TRUE,                  /* partial_inplace */
501          0xffffffff,            /* src_mask */
502          0xffffffff,            /* dst_mask */
503          FALSE),                /* pcrel_offset */
504
505   /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
506      We don't, because
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
509           fallable heuristics.
510        b) No other NewABI toolchain actually emits such relocations.  */
511   EMPTY_HOWTO (R_MIPS_HIGHER),
512   EMPTY_HOWTO (R_MIPS_HIGHEST),
513
514   /* High 16 bits of displacement in global offset table.  */
515   HOWTO (R_MIPS_CALL_HI16,      /* type */
516          0,                     /* rightshift */
517          2,                     /* size (0 = byte, 1 = short, 2 = long) */
518          16,                    /* bitsize */
519          FALSE,                 /* pc_relative */
520          0,                     /* bitpos */
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 */
528
529   /* Low 16 bits of displacement in global offset table.  */
530   HOWTO (R_MIPS_CALL_LO16,      /* type */
531          0,                     /* rightshift */
532          2,                     /* size (0 = byte, 1 = short, 2 = long) */
533          16,                    /* bitsize */
534          FALSE,                 /* pc_relative */
535          0,                     /* bitpos */
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 */
543
544   /* Section displacement.  */
545   HOWTO (R_MIPS_SCN_DISP,       /* type */
546          0,                     /* rightshift */
547          2,                     /* size (0 = byte, 1 = short, 2 = long) */
548          32,                    /* bitsize */
549          FALSE,                 /* pc_relative */
550          0,                     /* bitpos */
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 */
558
559   HOWTO (R_MIPS_REL16,          /* type */
560          0,                     /* rightshift */
561          1,                     /* size (0 = byte, 1 = short, 2 = long) */
562          16,                    /* bitsize */
563          FALSE,                 /* pc_relative */
564          0,                     /* bitpos */
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 */
572
573   /* These two are obsolete.  */
574   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
575   EMPTY_HOWTO (R_MIPS_PJUMP),
576
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 */
580          0,                     /* rightshift */
581          2,                     /* size (0 = byte, 1 = short, 2 = long) */
582          32,                    /* bitsize */
583          FALSE,                 /* pc_relative */
584          0,                     /* bitpos */
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 */
592
593   /* Protected jump conversion.  This is an optimization hint.  No
594      relocation is required for correctness.  */
595   HOWTO (R_MIPS_JALR,           /* type */
596          0,                     /* rightshift */
597          2,                     /* size (0 = byte, 1 = short, 2 = long) */
598          32,                    /* bitsize */
599          FALSE,                 /* pc_relative */
600          0,                     /* bitpos */
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 */
608
609   /* TLS GD/LD dynamic relocations.  */
610   HOWTO (R_MIPS_TLS_DTPMOD32,   /* type */
611          0,                     /* rightshift */
612          2,                     /* size (0 = byte, 1 = short, 2 = long) */
613          32,                    /* bitsize */
614          FALSE,                 /* pc_relative */
615          0,                     /* bitpos */
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 */
623
624   HOWTO (R_MIPS_TLS_DTPREL32,   /* type */
625          0,                     /* rightshift */
626          2,                     /* size (0 = byte, 1 = short, 2 = long) */
627          32,                    /* bitsize */
628          FALSE,                 /* pc_relative */
629          0,                     /* bitpos */
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 */
637
638   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
639   EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
640
641   /* TLS general dynamic variable reference.  */
642   HOWTO (R_MIPS_TLS_GD,         /* type */
643          0,                     /* rightshift */
644          2,                     /* size (0 = byte, 1 = short, 2 = long) */
645          16,                    /* bitsize */
646          FALSE,                 /* pc_relative */
647          0,                     /* bitpos */
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 */
655
656   /* TLS local dynamic variable reference.  */
657   HOWTO (R_MIPS_TLS_LDM,        /* type */
658          0,                     /* rightshift */
659          2,                     /* size (0 = byte, 1 = short, 2 = long) */
660          16,                    /* bitsize */
661          FALSE,                 /* pc_relative */
662          0,                     /* bitpos */
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 */
670
671   /* TLS local dynamic offset.  */
672   HOWTO (R_MIPS_TLS_DTPREL_HI16,        /* type */
673          0,                     /* rightshift */
674          2,                     /* size (0 = byte, 1 = short, 2 = long) */
675          16,                    /* bitsize */
676          FALSE,                 /* pc_relative */
677          0,                     /* bitpos */
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 */
685
686   /* TLS local dynamic offset.  */
687   HOWTO (R_MIPS_TLS_DTPREL_LO16,        /* type */
688          0,                     /* rightshift */
689          2,                     /* size (0 = byte, 1 = short, 2 = long) */
690          16,                    /* bitsize */
691          FALSE,                 /* pc_relative */
692          0,                     /* bitpos */
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 */
700
701   /* TLS thread pointer offset.  */
702   HOWTO (R_MIPS_TLS_GOTTPREL,   /* type */
703          0,                     /* rightshift */
704          2,                     /* size (0 = byte, 1 = short, 2 = long) */
705          16,                    /* bitsize */
706          FALSE,                 /* pc_relative */
707          0,                     /* bitpos */
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 */
715
716   /* TLS IE dynamic relocations.  */
717   HOWTO (R_MIPS_TLS_TPREL32,    /* type */
718          0,                     /* rightshift */
719          2,                     /* size (0 = byte, 1 = short, 2 = long) */
720          32,                    /* bitsize */
721          FALSE,                 /* pc_relative */
722          0,                     /* bitpos */
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 */
730
731   EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
732
733   /* TLS thread pointer offset.  */
734   HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
735          0,                     /* rightshift */
736          2,                     /* size (0 = byte, 1 = short, 2 = long) */
737          16,                    /* bitsize */
738          FALSE,                 /* pc_relative */
739          0,                     /* bitpos */
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 */
747
748   /* TLS thread pointer offset.  */
749   HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
750          0,                     /* rightshift */
751          2,                     /* size (0 = byte, 1 = short, 2 = long) */
752          16,                    /* bitsize */
753          FALSE,                 /* pc_relative */
754          0,                     /* bitpos */
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 */
762
763   /* 32 bit relocation with no addend.  */
764   HOWTO (R_MIPS_GLOB_DAT,       /* type */
765          0,                     /* rightshift */
766          2,                     /* size (0 = byte, 1 = short, 2 = long) */
767          32,                    /* bitsize */
768          FALSE,                 /* pc_relative */
769          0,                     /* bitpos */
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 */
774          0x0,                   /* src_mask */
775          0xffffffff,            /* dst_mask */
776          FALSE),                /* pcrel_offset */
777
778   EMPTY_HOWTO (52),
779   EMPTY_HOWTO (53),
780   EMPTY_HOWTO (54),
781   EMPTY_HOWTO (55),
782   EMPTY_HOWTO (56),
783   EMPTY_HOWTO (57),
784   EMPTY_HOWTO (58),
785   EMPTY_HOWTO (59),
786
787   HOWTO (R_MIPS_PC21_S2,        /* type */
788          2,                     /* rightshift */
789          2,                     /* size (0 = byte, 1 = short, 2 = long) */
790          21,                    /* bitsize */
791          TRUE,                  /* pc_relative */
792          0,                     /* bitpos */
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 */
800
801   HOWTO (R_MIPS_PC26_S2,        /* type */
802          2,                     /* rightshift */
803          2,                     /* size (0 = byte, 1 = short, 2 = long) */
804          26,                    /* bitsize */
805          TRUE,                  /* pc_relative */
806          0,                     /* bitpos */
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 */
814
815   HOWTO (R_MIPS_PC18_S3,        /* type */
816          3,                     /* rightshift */
817          2,                     /* size (0 = byte, 1 = short, 2 = long) */
818          18,                    /* bitsize */
819          TRUE,                  /* pc_relative */
820          0,                     /* bitpos */
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 */
828
829   HOWTO (R_MIPS_PC19_S2,        /* type */
830          2,                     /* rightshift */
831          2,                     /* size (0 = byte, 1 = short, 2 = long) */
832          19,                    /* bitsize */
833          TRUE,                  /* pc_relative */
834          0,                     /* bitpos */
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 */
842
843   HOWTO (R_MIPS_PCHI16,         /* type */
844          16,                    /* rightshift */
845          2,                     /* size (0 = byte, 1 = short, 2 = long) */
846          16,                    /* bitsize */
847          TRUE,                  /* pc_relative */
848          0,                     /* bitpos */
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 */
856
857   HOWTO (R_MIPS_PCLO16,         /* type */
858          0,                     /* rightshift */
859          2,                     /* size (0 = byte, 1 = short, 2 = long) */
860          16,                    /* bitsize */
861          TRUE,                  /* pc_relative */
862          0,                     /* bitpos */
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 */
870
871 };
872
873 /* The relocation table used for SHT_RELA sections.  */
874
875 static reloc_howto_type elf_mips_howto_table_rela[] =
876 {
877   /* No relocation.  */
878   HOWTO (R_MIPS_NONE,           /* type */
879          0,                     /* rightshift */
880          0,                     /* size (0 = byte, 1 = short, 2 = long) */
881          0,                     /* bitsize */
882          FALSE,                 /* pc_relative */
883          0,                     /* bitpos */
884          complain_overflow_dont, /* complain_on_overflow */
885          _bfd_mips_elf_generic_reloc, /* special_function */
886          "R_MIPS_NONE",         /* name */
887          FALSE,                 /* partial_inplace */
888          0,                     /* src_mask */
889          0,                     /* dst_mask */
890          FALSE),                /* pcrel_offset */
891
892   /* 16 bit relocation.  */
893   HOWTO (R_MIPS_16,             /* type */
894          0,                     /* rightshift */
895          2,                     /* size (0 = byte, 1 = short, 2 = long) */
896          16,                    /* bitsize */
897          FALSE,                 /* pc_relative */
898          0,                     /* bitpos */
899          complain_overflow_signed, /* complain_on_overflow */
900          _bfd_mips_elf_generic_reloc, /* special_function */
901          "R_MIPS_16",           /* name */
902          FALSE,                 /* partial_inplace */
903          0,                     /* src_mask */
904          0x0000,                /* dst_mask */
905          FALSE),                /* pcrel_offset */
906
907   /* 32 bit relocation.  */
908   HOWTO (R_MIPS_32,             /* type */
909          0,                     /* rightshift */
910          2,                     /* size (0 = byte, 1 = short, 2 = long) */
911          32,                    /* bitsize */
912          FALSE,                 /* pc_relative */
913          0,                     /* bitpos */
914          complain_overflow_dont, /* complain_on_overflow */
915          _bfd_mips_elf_generic_reloc, /* special_function */
916          "R_MIPS_32",           /* name */
917          FALSE,                 /* partial_inplace */
918          0,                     /* src_mask */
919          0xffffffff,            /* dst_mask */
920          FALSE),                /* pcrel_offset */
921
922   /* 32 bit symbol relative relocation.  */
923   HOWTO (R_MIPS_REL32,          /* type */
924          0,                     /* rightshift */
925          2,                     /* size (0 = byte, 1 = short, 2 = long) */
926          32,                    /* bitsize */
927          FALSE,                 /* pc_relative */
928          0,                     /* bitpos */
929          complain_overflow_dont, /* complain_on_overflow */
930          _bfd_mips_elf_generic_reloc, /* special_function */
931          "R_MIPS_REL32",        /* name */
932          FALSE,                 /* partial_inplace */
933          0,                     /* src_mask */
934          0xffffffff,            /* dst_mask */
935          FALSE),                /* pcrel_offset */
936
937   /* 26 bit jump address.  */
938   HOWTO (R_MIPS_26,             /* type */
939          2,                     /* rightshift */
940          2,                     /* size (0 = byte, 1 = short, 2 = long) */
941          26,                    /* bitsize */
942          FALSE,                 /* pc_relative */
943          0,                     /* bitpos */
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 */
951          0,                     /* src_mask */
952          0x03ffffff,            /* dst_mask */
953          FALSE),                /* pcrel_offset */
954
955   /* High 16 bits of symbol value.  */
956   HOWTO (R_MIPS_HI16,           /* type */
957          0,                     /* rightshift */
958          2,                     /* size (0 = byte, 1 = short, 2 = long) */
959          16,                    /* bitsize */
960          FALSE,                 /* pc_relative */
961          0,                     /* bitpos */
962          complain_overflow_dont, /* complain_on_overflow */
963          _bfd_mips_elf_generic_reloc, /* special_function */
964          "R_MIPS_HI16",         /* name */
965          FALSE,                 /* partial_inplace */
966          0,                     /* src_mask */
967          0x0000ffff,            /* dst_mask */
968          FALSE),                /* pcrel_offset */
969
970   /* Low 16 bits of symbol value.  */
971   HOWTO (R_MIPS_LO16,           /* type */
972          0,                     /* rightshift */
973          2,                     /* size (0 = byte, 1 = short, 2 = long) */
974          16,                    /* bitsize */
975          FALSE,                 /* pc_relative */
976          0,                     /* bitpos */
977          complain_overflow_dont, /* complain_on_overflow */
978          _bfd_mips_elf_generic_reloc, /* special_function */
979          "R_MIPS_LO16",         /* name */
980          FALSE,                 /* partial_inplace */
981          0,                     /* src_mask */
982          0x0000ffff,            /* dst_mask */
983          FALSE),                /* pcrel_offset */
984
985   /* GP relative reference.  */
986   HOWTO (R_MIPS_GPREL16,        /* type */
987          0,                     /* rightshift */
988          2,                     /* size (0 = byte, 1 = short, 2 = long) */
989          16,                    /* bitsize */
990          FALSE,                 /* pc_relative */
991          0,                     /* bitpos */
992          complain_overflow_signed, /* complain_on_overflow */
993          mips_elf_gprel16_reloc, /* special_function */
994          "R_MIPS_GPREL16",      /* name */
995          FALSE,                 /* partial_inplace */
996          0,                     /* src_mask */
997          0x0000ffff,            /* dst_mask */
998          FALSE),                /* pcrel_offset */
999
1000   /* Reference to literal section.  */
1001   HOWTO (R_MIPS_LITERAL,        /* type */
1002          0,                     /* rightshift */
1003          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1004          16,                    /* bitsize */
1005          FALSE,                 /* pc_relative */
1006          0,                     /* bitpos */
1007          complain_overflow_signed, /* complain_on_overflow */
1008          mips_elf_literal_reloc, /* special_function */
1009          "R_MIPS_LITERAL",      /* name */
1010          FALSE,                 /* partial_inplace */
1011          0,                     /* src_mask */
1012          0x0000ffff,            /* dst_mask */
1013          FALSE),                /* pcrel_offset */
1014
1015   /* Reference to global offset table.  */
1016   HOWTO (R_MIPS_GOT16,          /* type */
1017          0,                     /* rightshift */
1018          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1019          16,                    /* bitsize */
1020          FALSE,                 /* pc_relative */
1021          0,                     /* bitpos */
1022          complain_overflow_signed, /* complain_on_overflow */
1023          _bfd_mips_elf_generic_reloc, /* special_function */
1024          "R_MIPS_GOT16",        /* name */
1025          FALSE,                 /* partial_inplace */
1026          0,                     /* src_mask */
1027          0x0000ffff,            /* dst_mask */
1028          FALSE),                /* pcrel_offset */
1029
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 */
1034          2,                     /* rightshift */
1035          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1036          16,                    /* bitsize */
1037          TRUE,                  /* pc_relative */
1038          0,                     /* bitpos */
1039          complain_overflow_signed, /* complain_on_overflow */
1040          _bfd_mips_elf_generic_reloc, /* special_function */
1041          "R_MIPS_PC16",         /* name */
1042          FALSE,                 /* partial_inplace */
1043          0,                     /* src_mask */
1044          0x0000ffff,            /* dst_mask */
1045          TRUE),                 /* pcrel_offset */
1046
1047   /* 16 bit call through global offset table.  */
1048   HOWTO (R_MIPS_CALL16,         /* type */
1049          0,                     /* rightshift */
1050          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1051          16,                    /* bitsize */
1052          FALSE,                 /* pc_relative */
1053          0,                     /* bitpos */
1054          complain_overflow_signed, /* complain_on_overflow */
1055          _bfd_mips_elf_generic_reloc, /* special_function */
1056          "R_MIPS_CALL16",       /* name */
1057          FALSE,                 /* partial_inplace */
1058          0,                     /* src_mask */
1059          0x0000ffff,            /* dst_mask */
1060          FALSE),                /* pcrel_offset */
1061
1062   /* 32 bit GP relative reference.  */
1063   HOWTO (R_MIPS_GPREL32,        /* type */
1064          0,                     /* rightshift */
1065          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1066          32,                    /* bitsize */
1067          FALSE,                 /* pc_relative */
1068          0,                     /* bitpos */
1069          complain_overflow_dont, /* complain_on_overflow */
1070          mips_elf_gprel32_reloc, /* special_function */
1071          "R_MIPS_GPREL32",      /* name */
1072          FALSE,                 /* partial_inplace */
1073          0,                     /* src_mask */
1074          0xffffffff,            /* dst_mask */
1075          FALSE),                /* pcrel_offset */
1076
1077   EMPTY_HOWTO (13),
1078   EMPTY_HOWTO (14),
1079   EMPTY_HOWTO (15),
1080
1081   /* A 5 bit shift field.  */
1082   HOWTO (R_MIPS_SHIFT5,         /* type */
1083          0,                     /* rightshift */
1084          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1085          5,                     /* bitsize */
1086          FALSE,                 /* pc_relative */
1087          6,                     /* bitpos */
1088          complain_overflow_bitfield, /* complain_on_overflow */
1089          _bfd_mips_elf_generic_reloc, /* special_function */
1090          "R_MIPS_SHIFT5",       /* name */
1091          FALSE,                 /* partial_inplace */
1092          0,                     /* src_mask */
1093          0x000007c0,            /* dst_mask */
1094          FALSE),                /* pcrel_offset */
1095
1096   /* A 6 bit shift field.  */
1097   HOWTO (R_MIPS_SHIFT6,         /* type */
1098          0,                     /* rightshift */
1099          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1100          6,                     /* bitsize */
1101          FALSE,                 /* pc_relative */
1102          6,                     /* bitpos */
1103          complain_overflow_bitfield, /* complain_on_overflow */
1104          mips_elf_shift6_reloc, /* special_function */
1105          "R_MIPS_SHIFT6",       /* name */
1106          FALSE,                 /* partial_inplace */
1107          0,                     /* src_mask */
1108          0x000007c4,            /* dst_mask */
1109          FALSE),                /* pcrel_offset */
1110
1111   /* 64 bit relocation.  */
1112   HOWTO (R_MIPS_64,             /* type */
1113          0,                     /* rightshift */
1114          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1115          64,                    /* bitsize */
1116          FALSE,                 /* pc_relative */
1117          0,                     /* bitpos */
1118          complain_overflow_dont, /* complain_on_overflow */
1119          _bfd_mips_elf_generic_reloc, /* special_function */
1120          "R_MIPS_64",           /* name */
1121          FALSE,                 /* partial_inplace */
1122          0,                     /* src_mask */
1123          MINUS_ONE,             /* dst_mask */
1124          FALSE),                /* pcrel_offset */
1125
1126   /* Displacement in the global offset table.  */
1127   HOWTO (R_MIPS_GOT_DISP,       /* type */
1128          0,                     /* rightshift */
1129          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1130          16,                    /* bitsize */
1131          FALSE,                 /* pc_relative */
1132          0,                     /* bitpos */
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 */
1137          0,                     /* src_mask */
1138          0x0000ffff,            /* dst_mask */
1139          FALSE),                /* pcrel_offset */
1140
1141   /* Displacement to page pointer in the global offset table.  */
1142   HOWTO (R_MIPS_GOT_PAGE,       /* type */
1143          0,                     /* rightshift */
1144          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1145          16,                    /* bitsize */
1146          FALSE,                 /* pc_relative */
1147          0,                     /* bitpos */
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 */
1152          0,                     /* src_mask */
1153          0x0000ffff,            /* dst_mask */
1154          FALSE),                /* pcrel_offset */
1155
1156   /* Offset from page pointer in the global offset table.  */
1157   HOWTO (R_MIPS_GOT_OFST,       /* type */
1158          0,                     /* rightshift */
1159          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1160          16,                    /* bitsize */
1161          FALSE,                 /* pc_relative */
1162          0,                     /* bitpos */
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 */
1167          0,                     /* src_mask */
1168          0x0000ffff,            /* dst_mask */
1169          FALSE),                /* pcrel_offset */
1170
1171   /* High 16 bits of displacement in global offset table.  */
1172   HOWTO (R_MIPS_GOT_HI16,       /* type */
1173          0,                     /* rightshift */
1174          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1175          16,                    /* bitsize */
1176          FALSE,                 /* pc_relative */
1177          0,                     /* bitpos */
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 */
1182          0,                     /* src_mask */
1183          0x0000ffff,            /* dst_mask */
1184          FALSE),                /* pcrel_offset */
1185
1186   /* Low 16 bits of displacement in global offset table.  */
1187   HOWTO (R_MIPS_GOT_LO16,       /* type */
1188          0,                     /* rightshift */
1189          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1190          16,                    /* bitsize */
1191          FALSE,                 /* pc_relative */
1192          0,                     /* bitpos */
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 */
1197          0,                     /* src_mask */
1198          0x0000ffff,            /* dst_mask */
1199          FALSE),                /* pcrel_offset */
1200
1201   /* 64 bit subtraction.  */
1202   HOWTO (R_MIPS_SUB,            /* type */
1203          0,                     /* rightshift */
1204          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1205          64,                    /* bitsize */
1206          FALSE,                 /* pc_relative */
1207          0,                     /* bitpos */
1208          complain_overflow_dont, /* complain_on_overflow */
1209          _bfd_mips_elf_generic_reloc, /* special_function */
1210          "R_MIPS_SUB",          /* name */
1211          FALSE,                 /* partial_inplace */
1212          0,                     /* src_mask */
1213          MINUS_ONE,             /* dst_mask */
1214          FALSE),                /* pcrel_offset */
1215
1216   /* Insert the addend as an instruction.  */
1217   /* FIXME: Not handled correctly.  */
1218   HOWTO (R_MIPS_INSERT_A,       /* type */
1219          0,                     /* rightshift */
1220          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1221          32,                    /* bitsize */
1222          FALSE,                 /* pc_relative */
1223          0,                     /* bitpos */
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 */
1228          0,                     /* src_mask */
1229          0xffffffff,            /* dst_mask */
1230          FALSE),                /* pcrel_offset */
1231
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 */
1236          0,                     /* rightshift */
1237          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1238          32,                    /* bitsize */
1239          FALSE,                 /* pc_relative */
1240          0,                     /* bitpos */
1241          complain_overflow_dont, /* complain_on_overflow */
1242          _bfd_mips_elf_generic_reloc, /* special_function */
1243          "R_MIPS_INSERT_B",     /* name */
1244          FALSE,                 /* partial_inplace */
1245          0,                     /* src_mask */
1246          0xffffffff,            /* dst_mask */
1247          FALSE),                /* pcrel_offset */
1248
1249   /* Delete a 32 bit instruction.  */
1250   /* FIXME: Not handled correctly.  */
1251   HOWTO (R_MIPS_DELETE,         /* type */
1252          0,                     /* rightshift */
1253          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1254          32,                    /* bitsize */
1255          FALSE,                 /* pc_relative */
1256          0,                     /* bitpos */
1257          complain_overflow_dont, /* complain_on_overflow */
1258          _bfd_mips_elf_generic_reloc, /* special_function */
1259          "R_MIPS_DELETE",       /* name */
1260          FALSE,                 /* partial_inplace */
1261          0,                     /* src_mask */
1262          0xffffffff,            /* dst_mask */
1263          FALSE),                /* pcrel_offset */
1264
1265   /* Get the higher value of a 64 bit addend.  */
1266   HOWTO (R_MIPS_HIGHER,         /* type */
1267          0,                     /* rightshift */
1268          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1269          16,                    /* bitsize */
1270          FALSE,                 /* pc_relative */
1271          0,                     /* bitpos */
1272          complain_overflow_dont, /* complain_on_overflow */
1273          _bfd_mips_elf_generic_reloc, /* special_function */
1274          "R_MIPS_HIGHER",       /* name */
1275          FALSE,                 /* partial_inplace */
1276          0,                     /* src_mask */
1277          0x0000ffff,            /* dst_mask */
1278          FALSE),                /* pcrel_offset */
1279
1280   /* Get the highest value of a 64 bit addend.  */
1281   HOWTO (R_MIPS_HIGHEST,        /* type */
1282          0,                     /* rightshift */
1283          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1284          16,                    /* bitsize */
1285          FALSE,                 /* pc_relative */
1286          0,                     /* bitpos */
1287          complain_overflow_dont, /* complain_on_overflow */
1288          _bfd_mips_elf_generic_reloc, /* special_function */
1289          "R_MIPS_HIGHEST",      /* name */
1290          FALSE,                 /* partial_inplace */
1291          0,                     /* src_mask */
1292          0x0000ffff,            /* dst_mask */
1293          FALSE),                /* pcrel_offset */
1294
1295   /* High 16 bits of displacement in global offset table.  */
1296   HOWTO (R_MIPS_CALL_HI16,      /* type */
1297          0,                     /* rightshift */
1298          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1299          16,                    /* bitsize */
1300          FALSE,                 /* pc_relative */
1301          0,                     /* bitpos */
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 */
1306          0,                     /* src_mask */
1307          0x0000ffff,            /* dst_mask */
1308          FALSE),                /* pcrel_offset */
1309
1310   /* Low 16 bits of displacement in global offset table.  */
1311   HOWTO (R_MIPS_CALL_LO16,      /* type */
1312          0,                     /* rightshift */
1313          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1314          16,                    /* bitsize */
1315          FALSE,                 /* pc_relative */
1316          0,                     /* bitpos */
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 */
1321          0,                     /* src_mask */
1322          0x0000ffff,            /* dst_mask */
1323          FALSE),                /* pcrel_offset */
1324
1325   /* Section displacement, used by an associated event location section.  */
1326   HOWTO (R_MIPS_SCN_DISP,       /* type */
1327          0,                     /* rightshift */
1328          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1329          32,                    /* bitsize */
1330          FALSE,                 /* pc_relative */
1331          0,                     /* bitpos */
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 */
1336          0,                     /* src_mask */
1337          0xffffffff,            /* dst_mask */
1338          FALSE),                /* pcrel_offset */
1339
1340   /* 16 bit relocation.  */
1341   HOWTO (R_MIPS_REL16,          /* type */
1342          0,                     /* rightshift */
1343          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1344          16,                    /* bitsize */
1345          FALSE,                 /* pc_relative */
1346          0,                     /* bitpos */
1347          complain_overflow_signed, /* complain_on_overflow */
1348          _bfd_mips_elf_generic_reloc, /* special_function */
1349          "R_MIPS_REL16",        /* name */
1350          FALSE,                 /* partial_inplace */
1351          0,                     /* src_mask */
1352          0xffff,                /* dst_mask */
1353          FALSE),                /* pcrel_offset */
1354
1355   /* These two are obsolete.  */
1356   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1357   EMPTY_HOWTO (R_MIPS_PJUMP),
1358
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 */
1362          0,                     /* rightshift */
1363          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1364          32,                    /* bitsize */
1365          FALSE,                 /* pc_relative */
1366          0,                     /* bitpos */
1367          complain_overflow_dont, /* complain_on_overflow */
1368          _bfd_mips_elf_generic_reloc, /* special_function */
1369          "R_MIPS_RELGOT",       /* name */
1370          FALSE,                 /* partial_inplace */
1371          0,                     /* src_mask */
1372          0xffffffff,            /* dst_mask */
1373          FALSE),                /* pcrel_offset */
1374
1375   /* Protected jump conversion.  This is an optimization hint.  No
1376      relocation is required for correctness.  */
1377   HOWTO (R_MIPS_JALR,           /* type */
1378          0,                     /* rightshift */
1379          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1380          32,                    /* bitsize */
1381          FALSE,                 /* pc_relative */
1382          0,                     /* bitpos */
1383          complain_overflow_dont, /* complain_on_overflow */
1384          _bfd_mips_elf_generic_reloc, /* special_function */
1385          "R_MIPS_JALR",         /* name */
1386          FALSE,                 /* partial_inplace */
1387          0,                     /* src_mask */
1388          0,                     /* dst_mask */
1389          FALSE),                /* pcrel_offset */
1390
1391   /* TLS GD/LD dynamic relocations.  */
1392   HOWTO (R_MIPS_TLS_DTPMOD32,   /* type */
1393          0,                     /* rightshift */
1394          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1395          32,                    /* bitsize */
1396          FALSE,                 /* pc_relative */
1397          0,                     /* bitpos */
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 */
1402          0,                     /* src_mask */
1403          0xffffffff,            /* dst_mask */
1404          FALSE),                /* pcrel_offset */
1405
1406   HOWTO (R_MIPS_TLS_DTPREL32,   /* type */
1407          0,                     /* rightshift */
1408          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1409          32,                    /* bitsize */
1410          FALSE,                 /* pc_relative */
1411          0,                     /* bitpos */
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 */
1416          0,                     /* src_mask */
1417          0xffffffff,            /* dst_mask */
1418          FALSE),                /* pcrel_offset */
1419
1420   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
1421   EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
1422
1423   /* TLS general dynamic variable reference.  */
1424   HOWTO (R_MIPS_TLS_GD,         /* type */
1425          0,                     /* rightshift */
1426          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1427          16,                    /* bitsize */
1428          FALSE,                 /* pc_relative */
1429          0,                     /* bitpos */
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 */
1434          0,                     /* src_mask */
1435          0x0000ffff,            /* dst_mask */
1436          FALSE),                /* pcrel_offset */
1437
1438   /* TLS local dynamic variable reference.  */
1439   HOWTO (R_MIPS_TLS_LDM,        /* type */
1440          0,                     /* rightshift */
1441          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1442          16,                    /* bitsize */
1443          FALSE,                 /* pc_relative */
1444          0,                     /* bitpos */
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 */
1449          0,                     /* src_mask */
1450          0x0000ffff,            /* dst_mask */
1451          FALSE),                /* pcrel_offset */
1452
1453   /* TLS local dynamic offset.  */
1454   HOWTO (R_MIPS_TLS_DTPREL_HI16,        /* type */
1455          0,                     /* rightshift */
1456          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1457          16,                    /* bitsize */
1458          FALSE,                 /* pc_relative */
1459          0,                     /* bitpos */
1460          complain_overflow_signed, /* complain_on_overflow */
1461          _bfd_mips_elf_generic_reloc, /* special_function */
1462          "R_MIPS_TLS_DTPREL_HI16",      /* name */
1463          FALSE,                 /* partial_inplace */
1464          0,                     /* src_mask */
1465          0x0000ffff,            /* dst_mask */
1466          FALSE),                /* pcrel_offset */
1467
1468   /* TLS local dynamic offset.  */
1469   HOWTO (R_MIPS_TLS_DTPREL_LO16,        /* type */
1470          0,                     /* rightshift */
1471          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1472          16,                    /* bitsize */
1473          FALSE,                 /* pc_relative */
1474          0,                     /* bitpos */
1475          complain_overflow_signed, /* complain_on_overflow */
1476          _bfd_mips_elf_generic_reloc, /* special_function */
1477          "R_MIPS_TLS_DTPREL_LO16",      /* name */
1478          FALSE,                 /* partial_inplace */
1479          0,                     /* src_mask */
1480          0x0000ffff,            /* dst_mask */
1481          FALSE),                /* pcrel_offset */
1482
1483   /* TLS thread pointer offset.  */
1484   HOWTO (R_MIPS_TLS_GOTTPREL,   /* type */
1485          0,                     /* rightshift */
1486          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1487          16,                    /* bitsize */
1488          FALSE,                 /* pc_relative */
1489          0,                     /* bitpos */
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 */
1494          0,                     /* src_mask */
1495          0x0000ffff,            /* dst_mask */
1496          FALSE),                /* pcrel_offset */
1497
1498   /* TLS IE dynamic relocations.  */
1499   HOWTO (R_MIPS_TLS_TPREL32,    /* type */
1500          0,                     /* rightshift */
1501          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1502          32,                    /* bitsize */
1503          FALSE,                 /* pc_relative */
1504          0,                     /* bitpos */
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 */
1509          0,                     /* src_mask */
1510          0xffffffff,            /* dst_mask */
1511          FALSE),                /* pcrel_offset */
1512
1513   EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
1514
1515   /* TLS thread pointer offset.  */
1516   HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
1517          0,                     /* rightshift */
1518          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1519          16,                    /* bitsize */
1520          FALSE,                 /* pc_relative */
1521          0,                     /* bitpos */
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 */
1526          0,                     /* src_mask */
1527          0x0000ffff,            /* dst_mask */
1528          FALSE),                /* pcrel_offset */
1529
1530   /* TLS thread pointer offset.  */
1531   HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
1532          0,                     /* rightshift */
1533          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1534          16,                    /* bitsize */
1535          FALSE,                 /* pc_relative */
1536          0,                     /* bitpos */
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 */
1541          0,                     /* src_mask */
1542          0x0000ffff,            /* dst_mask */
1543          FALSE),                /* pcrel_offset */
1544
1545   /* 32 bit relocation with no addend.  */
1546   HOWTO (R_MIPS_GLOB_DAT,       /* type */
1547          0,                     /* rightshift */
1548          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1549          32,                    /* bitsize */
1550          FALSE,                 /* pc_relative */
1551          0,                     /* bitpos */
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 */
1556          0x0,                   /* src_mask */
1557          0xffffffff,            /* dst_mask */
1558          FALSE),                /* pcrel_offset */
1559
1560   EMPTY_HOWTO (52),
1561   EMPTY_HOWTO (53),
1562   EMPTY_HOWTO (54),
1563   EMPTY_HOWTO (55),
1564   EMPTY_HOWTO (56),
1565   EMPTY_HOWTO (57),
1566   EMPTY_HOWTO (58),
1567   EMPTY_HOWTO (59),
1568
1569   HOWTO (R_MIPS_PC21_S2,        /* type */
1570          2,                     /* rightshift */
1571          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1572          21,                    /* bitsize */
1573          TRUE,                  /* pc_relative */
1574          0,                     /* bitpos */
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 */
1579          0,                     /* src_mask */
1580          0x001fffff,            /* dst_mask */
1581          TRUE),                 /* pcrel_offset */
1582
1583   HOWTO (R_MIPS_PC26_S2,        /* type */
1584          2,                     /* rightshift */
1585          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1586          26,                    /* bitsize */
1587          TRUE,                  /* pc_relative */
1588          0,                     /* bitpos */
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 */
1593          0,                     /* src_mask */
1594          0x03ffffff,            /* dst_mask */
1595          TRUE),                 /* pcrel_offset */
1596
1597   HOWTO (R_MIPS_PC18_S3,        /* type */
1598          3,                     /* rightshift */
1599          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1600          18,                    /* bitsize */
1601          TRUE,                  /* pc_relative */
1602          0,                     /* bitpos */
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 */
1607          0,                     /* src_mask */
1608          0x0003ffff,            /* dst_mask */
1609          TRUE),                 /* pcrel_offset */
1610
1611   HOWTO (R_MIPS_PC19_S2,        /* type */
1612          2,                     /* rightshift */
1613          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1614          19,                    /* bitsize */
1615          TRUE,                  /* pc_relative */
1616          0,                     /* bitpos */
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 */
1621          0,                     /* src_mask */
1622          0x0007ffff,            /* dst_mask */
1623          TRUE),                 /* pcrel_offset */
1624
1625   HOWTO (R_MIPS_PCHI16,         /* type */
1626          16,                    /* rightshift */
1627          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1628          16,                    /* bitsize */
1629          TRUE,                  /* pc_relative */
1630          0,                     /* bitpos */
1631          complain_overflow_signed, /* complain_on_overflow */
1632          _bfd_mips_elf_generic_reloc,   /* special_function */
1633          "R_MIPS_PCHI16",       /* name */
1634          FALSE,                 /* partial_inplace */
1635          0,                     /* src_mask */
1636          0x0000ffff,            /* dst_mask */
1637          TRUE),                 /* pcrel_offset */
1638
1639   HOWTO (R_MIPS_PCLO16,         /* type */
1640          0,                     /* rightshift */
1641          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1642          16,                    /* bitsize */
1643          TRUE,                  /* pc_relative */
1644          0,                     /* bitpos */
1645          complain_overflow_dont, /* complain_on_overflow */
1646          _bfd_mips_elf_generic_reloc,   /* special_function */
1647          "R_MIPS_PCLO16",       /* name */
1648          FALSE,                 /* partial_inplace */
1649          0,                     /* src_mask */
1650          0x0000ffff,            /* dst_mask */
1651          TRUE),                 /* pcrel_offset */
1652
1653 };
1654
1655 static reloc_howto_type elf_mips16_howto_table_rel[] =
1656 {
1657   /* The reloc used for the mips16 jump instruction.  */
1658   HOWTO (R_MIPS16_26,           /* type */
1659          2,                     /* rightshift */
1660          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1661          26,                    /* bitsize */
1662          FALSE,                 /* pc_relative */
1663          0,                     /* bitpos */
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 */
1674
1675   /* The reloc used for the mips16 gprel instruction.  */
1676   HOWTO (R_MIPS16_GPREL,        /* type */
1677          0,                     /* rightshift */
1678          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1679          16,                    /* bitsize */
1680          FALSE,                 /* pc_relative */
1681          0,                     /* bitpos */
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 */
1689
1690   /* A MIPS16 reference to the global offset table.  */
1691   HOWTO (R_MIPS16_GOT16,        /* type */
1692          0,                     /* rightshift */
1693          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1694          16,                    /* bitsize */
1695          FALSE,                 /* pc_relative */
1696          0,                     /* bitpos */
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 */
1704
1705   /* A MIPS16 call through the global offset table.  */
1706   HOWTO (R_MIPS16_CALL16,       /* type */
1707          0,                     /* rightshift */
1708          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1709          16,                    /* bitsize */
1710          FALSE,                 /* pc_relative */
1711          0,                     /* bitpos */
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 */
1719
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) */
1724          16,                    /* bitsize */
1725          FALSE,                 /* pc_relative */
1726          0,                     /* bitpos */
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 */
1734
1735   /* MIPS16 low 16 bits of symbol value.  */
1736   HOWTO (R_MIPS16_LO16,         /* type */
1737          0,                     /* rightshift */
1738          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1739          16,                    /* bitsize */
1740          FALSE,                 /* pc_relative */
1741          0,                     /* bitpos */
1742          complain_overflow_dont, /* complain_on_overflow */
1743          _bfd_mips_elf_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 */
1749
1750   /* MIPS16 TLS general dynamic variable reference.  */
1751   HOWTO (R_MIPS16_TLS_GD,       /* type */
1752          0,                     /* rightshift */
1753          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1754          16,                    /* bitsize */
1755          FALSE,                 /* pc_relative */
1756          0,                     /* bitpos */
1757          complain_overflow_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 */
1764
1765   /* MIPS16 TLS local dynamic variable reference.  */
1766   HOWTO (R_MIPS16_TLS_LDM,      /* type */
1767          0,                     /* rightshift */
1768          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1769          16,                    /* bitsize */
1770          FALSE,                 /* pc_relative */
1771          0,                     /* bitpos */
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 */
1779
1780   /* MIPS16 TLS local dynamic offset.  */
1781   HOWTO (R_MIPS16_TLS_DTPREL_HI16,      /* type */
1782          0,                     /* rightshift */
1783          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1784          16,                    /* bitsize */
1785          FALSE,                 /* pc_relative */
1786          0,                     /* bitpos */
1787          complain_overflow_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 */
1794
1795   /* MIPS16 TLS local dynamic offset.  */
1796   HOWTO (R_MIPS16_TLS_DTPREL_LO16,      /* type */
1797          0,                     /* rightshift */
1798          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1799          16,                    /* bitsize */
1800          FALSE,                 /* pc_relative */
1801          0,                     /* bitpos */
1802          complain_overflow_signed, /* complain_on_overflow */
1803          _bfd_mips_elf_generic_reloc, /* special_function */
1804          "R_MIPS16_TLS_DTPREL_LO16",    /* name */
1805          TRUE,                  /* partial_inplace */
1806          0x0000ffff,            /* src_mask */
1807          0x0000ffff,            /* dst_mask */
1808          FALSE),                /* pcrel_offset */
1809
1810   /* MIPS16 TLS thread pointer offset.  */
1811   HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
1812          0,                     /* rightshift */
1813          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1814          16,                    /* bitsize */
1815          FALSE,                 /* pc_relative */
1816          0,                     /* bitpos */
1817          complain_overflow_signed, /* complain_on_overflow */
1818          _bfd_mips_elf_generic_reloc, /* special_function */
1819          "R_MIPS16_TLS_GOTTPREL",       /* name */
1820          TRUE,                  /* partial_inplace */
1821          0x0000ffff,            /* src_mask */
1822          0x0000ffff,            /* dst_mask */
1823          FALSE),                /* pcrel_offset */
1824
1825   /* MIPS16 TLS thread pointer offset.  */
1826   HOWTO (R_MIPS16_TLS_TPREL_HI16,       /* type */
1827          0,                     /* rightshift */
1828          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1829          16,                    /* bitsize */
1830          FALSE,                 /* pc_relative */
1831          0,                     /* bitpos */
1832          complain_overflow_signed, /* complain_on_overflow */
1833          _bfd_mips_elf_generic_reloc, /* special_function */
1834          "R_MIPS16_TLS_TPREL_HI16", /* name */
1835          TRUE,                  /* partial_inplace */
1836          0x0000ffff,            /* src_mask */
1837          0x0000ffff,            /* dst_mask */
1838          FALSE),                /* pcrel_offset */
1839
1840   /* MIPS16 TLS thread pointer offset.  */
1841   HOWTO (R_MIPS16_TLS_TPREL_LO16,       /* type */
1842          0,                     /* rightshift */
1843          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1844          16,                    /* bitsize */
1845          FALSE,                 /* pc_relative */
1846          0,                     /* bitpos */
1847          complain_overflow_signed, /* complain_on_overflow */
1848          _bfd_mips_elf_generic_reloc, /* special_function */
1849          "R_MIPS16_TLS_TPREL_LO16", /* name */
1850          TRUE,                  /* partial_inplace */
1851          0x0000ffff,            /* src_mask */
1852          0x0000ffff,            /* dst_mask */
1853          FALSE),                /* pcrel_offset */
1854
1855   /* MIPS16 16-bit PC-relative branch offset.  */
1856   HOWTO (R_MIPS16_PC16_S1,      /* type */
1857          1,                     /* rightshift */
1858          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1859          16,                    /* bitsize */
1860          TRUE,                  /* pc_relative */
1861          0,                     /* bitpos */
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 */
1869 };
1870
1871 static reloc_howto_type elf_mips16_howto_table_rela[] =
1872 {
1873   /* The reloc used for the mips16 jump instruction.  */
1874   HOWTO (R_MIPS16_26,           /* type */
1875          2,                     /* rightshift */
1876          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1877          26,                    /* bitsize */
1878          FALSE,                 /* pc_relative */
1879          0,                     /* bitpos */
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 */
1887          0,                     /* src_mask */
1888          0x3ffffff,             /* dst_mask */
1889          FALSE),                /* pcrel_offset */
1890
1891   /* The reloc used for the mips16 gprel instruction.  */
1892   HOWTO (R_MIPS16_GPREL,        /* type */
1893          0,                     /* rightshift */
1894          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1895          16,                    /* bitsize */
1896          FALSE,                 /* pc_relative */
1897          0,                     /* bitpos */
1898          complain_overflow_signed, /* complain_on_overflow */
1899          mips16_gprel_reloc,    /* special_function */
1900          "R_MIPS16_GPREL",      /* name */
1901          FALSE,                 /* partial_inplace */
1902          0,                     /* src_mask */
1903          0x0000ffff,            /* dst_mask */
1904          FALSE),                /* pcrel_offset */
1905
1906   /* A MIPS16 reference to the global offset table.  */
1907   HOWTO (R_MIPS16_GOT16,        /* type */
1908          0,                     /* rightshift */
1909          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1910          16,                    /* bitsize */
1911          FALSE,                 /* pc_relative */
1912          0,                     /* bitpos */
1913          complain_overflow_dont, /* complain_on_overflow */
1914          _bfd_mips_elf_got16_reloc, /* special_function */
1915          "R_MIPS16_GOT16",      /* name */
1916          FALSE,                 /* partial_inplace */
1917          0,                     /* src_mask */
1918          0x0000ffff,            /* dst_mask */
1919          FALSE),                /* pcrel_offset */
1920
1921   /* A MIPS16 call through the global offset table.  */
1922   HOWTO (R_MIPS16_CALL16,       /* type */
1923          0,                     /* rightshift */
1924          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1925          16,                    /* bitsize */
1926          FALSE,                 /* pc_relative */
1927          0,                     /* bitpos */
1928          complain_overflow_dont, /* complain_on_overflow */
1929          _bfd_mips_elf_generic_reloc, /* special_function */
1930          "R_MIPS16_CALL16",     /* name */
1931          FALSE,                 /* partial_inplace */
1932          0,                     /* src_mask */
1933          0x0000ffff,            /* dst_mask */
1934          FALSE),                /* pcrel_offset */
1935
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) */
1940          16,                    /* bitsize */
1941          FALSE,                 /* pc_relative */
1942          0,                     /* bitpos */
1943          complain_overflow_dont, /* complain_on_overflow */
1944          _bfd_mips_elf_hi16_reloc, /* special_function */
1945          "R_MIPS16_HI16",       /* name */
1946          FALSE,                 /* partial_inplace */
1947          0,                     /* src_mask */
1948          0x0000ffff,            /* dst_mask */
1949          FALSE),                /* pcrel_offset */
1950
1951   /* MIPS16 low 16 bits of symbol value.  */
1952   HOWTO (R_MIPS16_LO16,         /* type */
1953          0,                     /* rightshift */
1954          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1955          16,                    /* bitsize */
1956          FALSE,                 /* pc_relative */
1957          0,                     /* bitpos */
1958          complain_overflow_dont, /* complain_on_overflow */
1959          _bfd_mips_elf_lo16_reloc, /* special_function */
1960          "R_MIPS16_LO16",       /* name */
1961          FALSE,                 /* partial_inplace */
1962          0,                     /* src_mask */
1963          0x0000ffff,            /* dst_mask */
1964          FALSE),                /* pcrel_offset */
1965
1966   /* MIPS16 TLS general dynamic variable reference.  */
1967   HOWTO (R_MIPS16_TLS_GD,       /* type */
1968          0,                     /* rightshift */
1969          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1970          16,                    /* bitsize */
1971          FALSE,                 /* pc_relative */
1972          0,                     /* bitpos */
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 */
1977          0,                     /* src_mask */
1978          0x0000ffff,            /* dst_mask */
1979          FALSE),                /* pcrel_offset */
1980
1981   /* MIPS16 TLS local dynamic variable reference.  */
1982   HOWTO (R_MIPS16_TLS_LDM,      /* type */
1983          0,                     /* rightshift */
1984          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1985          16,                    /* bitsize */
1986          FALSE,                 /* pc_relative */
1987          0,                     /* bitpos */
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 */
1992          0,                     /* src_mask */
1993          0x0000ffff,            /* dst_mask */
1994          FALSE),                /* pcrel_offset */
1995
1996   /* MIPS16 TLS local dynamic offset.  */
1997   HOWTO (R_MIPS16_TLS_DTPREL_HI16,      /* type */
1998          0,                     /* rightshift */
1999          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2000          16,                    /* bitsize */
2001          FALSE,                 /* pc_relative */
2002          0,                     /* bitpos */
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 */
2007          0,                     /* src_mask */
2008          0x0000ffff,            /* dst_mask */
2009          FALSE),                /* pcrel_offset */
2010
2011   /* MIPS16 TLS local dynamic offset.  */
2012   HOWTO (R_MIPS16_TLS_DTPREL_LO16,      /* type */
2013          0,                     /* rightshift */
2014          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2015          16,                    /* bitsize */
2016          FALSE,                 /* pc_relative */
2017          0,                     /* bitpos */
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 */
2022          0,                     /* src_mask */
2023          0x0000ffff,            /* dst_mask */
2024          FALSE),                /* pcrel_offset */
2025
2026   /* MIPS16 TLS thread pointer offset.  */
2027   HOWTO (R_MIPS16_TLS_GOTTPREL, /* type */
2028          0,                     /* rightshift */
2029          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2030          16,                    /* bitsize */
2031          FALSE,                 /* pc_relative */
2032          0,                     /* bitpos */
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 */
2037          0,                     /* src_mask */
2038          0x0000ffff,            /* dst_mask */
2039          FALSE),                /* pcrel_offset */
2040
2041   /* MIPS16 TLS thread pointer offset.  */
2042   HOWTO (R_MIPS16_TLS_TPREL_HI16,       /* type */
2043          0,                     /* rightshift */
2044          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2045          16,                    /* bitsize */
2046          FALSE,                 /* pc_relative */
2047          0,                     /* bitpos */
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 */
2052          0,                     /* src_mask */
2053          0x0000ffff,            /* dst_mask */
2054          FALSE),                /* pcrel_offset */
2055
2056   /* MIPS16 TLS thread pointer offset.  */
2057   HOWTO (R_MIPS16_TLS_TPREL_LO16,       /* type */
2058          0,                     /* rightshift */
2059          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2060          16,                    /* bitsize */
2061          FALSE,                 /* pc_relative */
2062          0,                     /* bitpos */
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 */
2067          0,                     /* src_mask */
2068          0x0000ffff,            /* dst_mask */
2069          FALSE),                /* pcrel_offset */
2070
2071   /* MIPS16 16-bit PC-relative branch offset.  */
2072   HOWTO (R_MIPS16_PC16_S1,      /* type */
2073          1,                     /* rightshift */
2074          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2075          16,                    /* bitsize */
2076          TRUE,                  /* pc_relative */
2077          0,                     /* bitpos */
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 */
2082          0,                     /* src_mask */
2083          0x0000ffff,            /* dst_mask */
2084          TRUE),                 /* pcrel_offset */
2085 };
2086
2087 static reloc_howto_type elf_micromips_howto_table_rel[] =
2088 {
2089   EMPTY_HOWTO (130),
2090   EMPTY_HOWTO (131),
2091   EMPTY_HOWTO (132),
2092
2093   /* 26 bit jump address.  */
2094   HOWTO (R_MICROMIPS_26_S1,     /* type */
2095          1,                     /* rightshift */
2096          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2097          26,                    /* bitsize */
2098          FALSE,                 /* pc_relative */
2099          0,                     /* bitpos */
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 */
2110
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) */
2115          16,                    /* bitsize */
2116          FALSE,                 /* pc_relative */
2117          0,                     /* bitpos */
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 */
2125
2126   /* Low 16 bits of symbol value.  */
2127   HOWTO (R_MICROMIPS_LO16,      /* type */
2128          0,                     /* rightshift */
2129          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2130          16,                    /* bitsize */
2131          FALSE,                 /* pc_relative */
2132          0,                     /* bitpos */
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 */
2140
2141   /* GP relative reference.  */
2142   HOWTO (R_MICROMIPS_GPREL16,   /* type */
2143          0,                     /* rightshift */
2144          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2145          16,                    /* bitsize */
2146          FALSE,                 /* pc_relative */
2147          0,                     /* bitpos */
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 */
2155
2156   /* Reference to literal section.  */
2157   HOWTO (R_MICROMIPS_LITERAL,   /* type */
2158          0,                     /* rightshift */
2159          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2160          16,                    /* bitsize */
2161          FALSE,                 /* pc_relative */
2162          0,                     /* bitpos */
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 */
2170
2171   /* Reference to global offset table.  */
2172   HOWTO (R_MICROMIPS_GOT16,     /* type */
2173          0,                     /* rightshift */
2174          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2175          16,                    /* bitsize */
2176          FALSE,                 /* pc_relative */
2177          0,                     /* bitpos */
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 */
2185
2186   /* This is for microMIPS branches.  */
2187   HOWTO (R_MICROMIPS_PC7_S1,    /* type */
2188          1,                     /* rightshift */
2189          1,                     /* size (0 = byte, 1 = short, 2 = long) */
2190          7,                     /* bitsize */
2191          TRUE,                  /* pc_relative */
2192          0,                     /* bitpos */
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 */
2200
2201   HOWTO (R_MICROMIPS_PC10_S1,   /* type */
2202          1,                     /* rightshift */
2203          1,                     /* size (0 = byte, 1 = short, 2 = long) */
2204          10,                    /* bitsize */
2205          TRUE,                  /* pc_relative */
2206          0,                     /* bitpos */
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 */
2214
2215   HOWTO (R_MICROMIPS_PC16_S1,   /* type */
2216          1,                     /* rightshift */
2217          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2218          16,                    /* bitsize */
2219          TRUE,                  /* pc_relative */
2220          0,                     /* bitpos */
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 */
2228
2229   /* 16 bit call through global offset table.  */
2230   HOWTO (R_MICROMIPS_CALL16,    /* type */
2231          0,                     /* rightshift */
2232          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2233          16,                    /* bitsize */
2234          FALSE,                 /* pc_relative */
2235          0,                     /* bitpos */
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 */
2243
2244   EMPTY_HOWTO (143),
2245   EMPTY_HOWTO (144),
2246
2247   /* Displacement in the global offset table.  */
2248   HOWTO (R_MICROMIPS_GOT_DISP,  /* type */
2249          0,                     /* rightshift */
2250          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2251          16,                    /* bitsize */
2252          FALSE,                 /* pc_relative */
2253          0,                     /* bitpos */
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 */
2261
2262   /* Displacement to page pointer in the global offset table.  */
2263   HOWTO (R_MICROMIPS_GOT_PAGE,  /* type */
2264          0,                     /* rightshift */
2265          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2266          16,                    /* bitsize */
2267          FALSE,                 /* pc_relative */
2268          0,                     /* bitpos */
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 */
2276
2277   /* Offset from page pointer in the global offset table.  */
2278   HOWTO (R_MICROMIPS_GOT_OFST,  /* type */
2279          0,                     /* rightshift */
2280          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2281          16,                    /* bitsize */
2282          FALSE,                 /* pc_relative */
2283          0,                     /* bitpos */
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 */
2291
2292   /* High 16 bits of displacement in global offset table.  */
2293   HOWTO (R_MICROMIPS_GOT_HI16,  /* type */
2294          0,                     /* rightshift */
2295          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2296          16,                    /* bitsize */
2297          FALSE,                 /* pc_relative */
2298          0,                     /* bitpos */
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 */
2306
2307   /* Low 16 bits of displacement in global offset table.  */
2308   HOWTO (R_MICROMIPS_GOT_LO16,  /* type */
2309          0,                     /* rightshift */
2310          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2311          16,                    /* bitsize */
2312          FALSE,                 /* pc_relative */
2313          0,                     /* bitpos */
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 */
2321
2322   /* 64 bit subtraction.  Used in the N32 ABI.  */
2323   HOWTO (R_MICROMIPS_SUB,       /* type */
2324          0,                     /* rightshift */
2325          4,                     /* size (0 = byte, 1 = short, 2 = long) */
2326          64,                    /* bitsize */
2327          FALSE,                 /* pc_relative */
2328          0,                     /* bitpos */
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 */
2336
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),
2343
2344   /* High 16 bits of displacement in global offset table.  */
2345   HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2346          0,                     /* rightshift */
2347          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2348          16,                    /* bitsize */
2349          FALSE,                 /* pc_relative */
2350          0,                     /* bitpos */
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 */
2358
2359   /* Low 16 bits of displacement in global offset table.  */
2360   HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2361          0,                     /* rightshift */
2362          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2363          16,                    /* bitsize */
2364          FALSE,                 /* pc_relative */
2365          0,                     /* bitpos */
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 */
2373
2374   /* Section displacement.  */
2375   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
2376          0,                     /* rightshift */
2377          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2378          32,                    /* bitsize */
2379          FALSE,                 /* pc_relative */
2380          0,                     /* bitpos */
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 */
2388
2389   /* Protected jump conversion.  This is an optimization hint.  No
2390      relocation is required for correctness.  */
2391   HOWTO (R_MICROMIPS_JALR,      /* type */
2392          0,                     /* rightshift */
2393          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2394          32,                    /* bitsize */
2395          FALSE,                 /* pc_relative */
2396          0,                     /* bitpos */
2397          complain_overflow_dont, /* complain_on_overflow */
2398          _bfd_mips_elf_generic_reloc, /* special_function */
2399          "R_MICROMIPS_JALR",    /* name */
2400          FALSE,                 /* partial_inplace */
2401          0,                     /* src_mask */
2402          0x00000000,            /* dst_mask */
2403          FALSE),                /* pcrel_offset */
2404
2405   /* Low 16 bits of symbol value.  Note that the high 16 bits of symbol values
2406      must be zero.  This is used for relaxation.  */
2407   HOWTO (R_MICROMIPS_HI0_LO16,  /* type */
2408          0,                     /* rightshift */
2409          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2410          16,                    /* bitsize */
2411          FALSE,                 /* pc_relative */
2412          0,                     /* bitpos */
2413          complain_overflow_dont, /* complain_on_overflow */
2414          _bfd_mips_elf_generic_reloc, /* special_function */
2415          "R_MICROMIPS_HI0_LO16",/* name */
2416          TRUE,                  /* partial_inplace */
2417          0x0000ffff,            /* src_mask */
2418          0x0000ffff,            /* dst_mask */
2419          FALSE),                /* pcrel_offset */
2420
2421   EMPTY_HOWTO (158),
2422   EMPTY_HOWTO (159),
2423   EMPTY_HOWTO (160),
2424   EMPTY_HOWTO (161),
2425
2426   /* TLS general dynamic variable reference.  */
2427   HOWTO (R_MICROMIPS_TLS_GD,            /* type */
2428          0,                     /* rightshift */
2429          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2430          16,                    /* bitsize */
2431          FALSE,                 /* pc_relative */
2432          0,                     /* bitpos */
2433          complain_overflow_signed, /* complain_on_overflow */
2434          _bfd_mips_elf_generic_reloc, /* special_function */
2435          "R_MICROMIPS_TLS_GD",  /* name */
2436          TRUE,                  /* partial_inplace */
2437          0x0000ffff,            /* src_mask */
2438          0x0000ffff,            /* dst_mask */
2439          FALSE),                /* pcrel_offset */
2440
2441   /* TLS local dynamic variable reference.  */
2442   HOWTO (R_MICROMIPS_TLS_LDM,   /* type */
2443          0,                     /* rightshift */
2444          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2445          16,                    /* bitsize */
2446          FALSE,                 /* pc_relative */
2447          0,                     /* bitpos */
2448          complain_overflow_signed, /* complain_on_overflow */
2449          _bfd_mips_elf_generic_reloc, /* special_function */
2450          "R_MICROMIPS_TLS_LDM", /* name */
2451          TRUE,                  /* partial_inplace */
2452          0x0000ffff,            /* src_mask */
2453          0x0000ffff,            /* dst_mask */
2454          FALSE),                /* pcrel_offset */
2455
2456   /* TLS local dynamic offset.  */
2457   HOWTO (R_MICROMIPS_TLS_DTPREL_HI16,   /* type */
2458          0,                     /* rightshift */
2459          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2460          16,                    /* bitsize */
2461          FALSE,                 /* pc_relative */
2462          0,                     /* bitpos */
2463          complain_overflow_signed, /* complain_on_overflow */
2464          _bfd_mips_elf_generic_reloc, /* special_function */
2465          "R_MICROMIPS_TLS_DTPREL_HI16", /* name */
2466          TRUE,                  /* partial_inplace */
2467          0x0000ffff,            /* src_mask */
2468          0x0000ffff,            /* dst_mask */
2469          FALSE),                /* pcrel_offset */
2470
2471   /* TLS local dynamic offset.  */
2472   HOWTO (R_MICROMIPS_TLS_DTPREL_LO16,   /* type */
2473          0,                     /* rightshift */
2474          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2475          16,                    /* bitsize */
2476          FALSE,                 /* pc_relative */
2477          0,                     /* bitpos */
2478          complain_overflow_signed, /* complain_on_overflow */
2479          _bfd_mips_elf_generic_reloc, /* special_function */
2480          "R_MICROMIPS_TLS_DTPREL_LO16", /* name */
2481          TRUE,                  /* partial_inplace */
2482          0x0000ffff,            /* src_mask */
2483          0x0000ffff,            /* dst_mask */
2484          FALSE),                /* pcrel_offset */
2485
2486   /* TLS thread pointer offset.  */
2487   HOWTO (R_MICROMIPS_TLS_GOTTPREL,      /* type */
2488          0,                     /* rightshift */
2489          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2490          16,                    /* bitsize */
2491          FALSE,                 /* pc_relative */
2492          0,                     /* bitpos */
2493          complain_overflow_signed, /* complain_on_overflow */
2494          _bfd_mips_elf_generic_reloc, /* special_function */
2495          "R_MICROMIPS_TLS_GOTTPREL",    /* name */
2496          TRUE,                  /* partial_inplace */
2497          0x0000ffff,            /* src_mask */
2498          0x0000ffff,            /* dst_mask */
2499          FALSE),                /* pcrel_offset */
2500
2501   EMPTY_HOWTO (167),
2502   EMPTY_HOWTO (168),
2503
2504   /* TLS thread pointer offset.  */
2505   HOWTO (R_MICROMIPS_TLS_TPREL_HI16,    /* type */
2506          0,                     /* rightshift */
2507          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2508          16,                    /* bitsize */
2509          FALSE,                 /* pc_relative */
2510          0,                     /* bitpos */
2511          complain_overflow_signed, /* complain_on_overflow */
2512          _bfd_mips_elf_generic_reloc, /* special_function */
2513          "R_MICROMIPS_TLS_TPREL_HI16", /* name */
2514          TRUE,                  /* partial_inplace */
2515          0x0000ffff,            /* src_mask */
2516          0x0000ffff,            /* dst_mask */
2517          FALSE),                /* pcrel_offset */
2518
2519   /* TLS thread pointer offset.  */
2520   HOWTO (R_MICROMIPS_TLS_TPREL_LO16,    /* type */
2521          0,                     /* rightshift */
2522          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2523          16,                    /* bitsize */
2524          FALSE,                 /* pc_relative */
2525          0,                     /* bitpos */
2526          complain_overflow_signed, /* complain_on_overflow */
2527          _bfd_mips_elf_generic_reloc, /* special_function */
2528          "R_MICROMIPS_TLS_TPREL_LO16", /* name */
2529          TRUE,                  /* partial_inplace */
2530          0x0000ffff,            /* src_mask */
2531          0x0000ffff,            /* dst_mask */
2532          FALSE),                /* pcrel_offset */
2533
2534   EMPTY_HOWTO (171),
2535
2536   /* GP- and PC-relative relocations.  */
2537   HOWTO (R_MICROMIPS_GPREL7_S2, /* type */
2538          2,                     /* rightshift */
2539          1,                     /* size (0 = byte, 1 = short, 2 = long) */
2540          7,                     /* bitsize */
2541          FALSE,                 /* pc_relative */
2542          0,                     /* bitpos */
2543          complain_overflow_signed, /* complain_on_overflow */
2544          _bfd_mips_elf32_gprel16_reloc, /* special_function */
2545          "R_MICROMIPS_GPREL7_S2",       /* name */
2546          TRUE,                  /* partial_inplace */
2547          0x0000007f,            /* src_mask */
2548          0x0000007f,            /* dst_mask */
2549          FALSE),                /* pcrel_offset */
2550
2551   HOWTO (R_MICROMIPS_PC23_S2,   /* type */
2552          2,                     /* rightshift */
2553          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2554          23,                    /* bitsize */
2555          TRUE,                  /* pc_relative */
2556          0,                     /* bitpos */
2557          complain_overflow_signed, /* complain_on_overflow */
2558          _bfd_mips_elf_generic_reloc, /* special_function */
2559          "R_MICROMIPS_PC23_S2", /* name */
2560          TRUE,                  /* partial_inplace */
2561          0x007fffff,            /* src_mask */
2562          0x007fffff,            /* dst_mask */
2563          TRUE),                 /* pcrel_offset */
2564 };
2565
2566 static reloc_howto_type elf_micromips_howto_table_rela[] =
2567 {
2568   EMPTY_HOWTO (130),
2569   EMPTY_HOWTO (131),
2570   EMPTY_HOWTO (132),
2571
2572   /* 26 bit jump address.  */
2573   HOWTO (R_MICROMIPS_26_S1,     /* type */
2574          1,                     /* rightshift */
2575          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2576          26,                    /* bitsize */
2577          FALSE,                 /* pc_relative */
2578          0,                     /* bitpos */
2579          complain_overflow_dont, /* complain_on_overflow */
2580                                 /* This needs complex overflow
2581                                    detection, because the upper four
2582                                    bits must match the PC.  */
2583          _bfd_mips_elf_generic_reloc, /* special_function */
2584          "R_MICROMIPS_26_S1",   /* name */
2585          FALSE,                 /* partial_inplace */
2586          0,                     /* src_mask */
2587          0x3ffffff,             /* dst_mask */
2588          FALSE),                /* pcrel_offset */
2589
2590   /* High 16 bits of symbol value.  */
2591   HOWTO (R_MICROMIPS_HI16,      /* type */
2592          16,                    /* rightshift */
2593          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2594          16,                    /* bitsize */
2595          FALSE,                 /* pc_relative */
2596          0,                     /* bitpos */
2597          complain_overflow_dont, /* complain_on_overflow */
2598          _bfd_mips_elf_hi16_reloc, /* special_function */
2599          "R_MICROMIPS_HI16",    /* name */
2600          FALSE,                 /* partial_inplace */
2601          0,                     /* src_mask */
2602          0x0000ffff,            /* dst_mask */
2603          FALSE),                /* pcrel_offset */
2604
2605   /* Low 16 bits of symbol value.  */
2606   HOWTO (R_MICROMIPS_LO16,      /* type */
2607          0,                     /* rightshift */
2608          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2609          16,                    /* bitsize */
2610          FALSE,                 /* pc_relative */
2611          0,                     /* bitpos */
2612          complain_overflow_dont, /* complain_on_overflow */
2613          _bfd_mips_elf_lo16_reloc, /* special_function */
2614          "R_MICROMIPS_LO16",    /* name */
2615          FALSE,                 /* partial_inplace */
2616          0,                     /* src_mask */
2617          0x0000ffff,            /* dst_mask */
2618          FALSE),                /* pcrel_offset */
2619
2620   /* GP relative reference.  */
2621   HOWTO (R_MICROMIPS_GPREL16,   /* type */
2622          0,                     /* rightshift */
2623          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2624          16,                    /* bitsize */
2625          FALSE,                 /* pc_relative */
2626          0,                     /* bitpos */
2627          complain_overflow_signed, /* complain_on_overflow */
2628          _bfd_mips_elf32_gprel16_reloc, /* special_function */
2629          "R_MICROMIPS_GPREL16", /* name */
2630          FALSE,                 /* partial_inplace */
2631          0,                     /* src_mask */
2632          0x0000ffff,            /* dst_mask */
2633          FALSE),                /* pcrel_offset */
2634
2635   /* Reference to literal section.  */
2636   HOWTO (R_MICROMIPS_LITERAL,   /* type */
2637          0,                     /* rightshift */
2638          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2639          16,                    /* bitsize */
2640          FALSE,                 /* pc_relative */
2641          0,                     /* bitpos */
2642          complain_overflow_signed, /* complain_on_overflow */
2643          _bfd_mips_elf32_gprel16_reloc, /* special_function */
2644          "R_MICROMIPS_LITERAL", /* name */
2645          FALSE,                 /* partial_inplace */
2646          0,                     /* src_mask */
2647          0x0000ffff,            /* dst_mask */
2648          FALSE),                /* pcrel_offset */
2649
2650   /* Reference to global offset table.  */
2651   HOWTO (R_MICROMIPS_GOT16,     /* type */
2652          0,                     /* rightshift */
2653          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2654          16,                    /* bitsize */
2655          FALSE,                 /* pc_relative */
2656          0,                     /* bitpos */
2657          complain_overflow_signed, /* complain_on_overflow */
2658          _bfd_mips_elf_got16_reloc, /* special_function */
2659          "R_MICROMIPS_GOT16",   /* name */
2660          FALSE,                 /* partial_inplace */
2661          0,                     /* src_mask */
2662          0x0000ffff,            /* dst_mask */
2663          FALSE),                /* pcrel_offset */
2664
2665   /* This is for microMIPS branches.  */
2666   HOWTO (R_MICROMIPS_PC7_S1,    /* type */
2667          1,                     /* rightshift */
2668          1,                     /* size (0 = byte, 1 = short, 2 = long) */
2669          7,                     /* bitsize */
2670          TRUE,                  /* pc_relative */
2671          0,                     /* bitpos */
2672          complain_overflow_signed, /* complain_on_overflow */
2673          _bfd_mips_elf_generic_reloc, /* special_function */
2674          "R_MICROMIPS_PC7_S1",  /* name */
2675          FALSE,                 /* partial_inplace */
2676          0,                     /* src_mask */
2677          0x0000007f,            /* dst_mask */
2678          TRUE),                 /* pcrel_offset */
2679
2680   HOWTO (R_MICROMIPS_PC10_S1,   /* type */
2681          1,                     /* rightshift */
2682          1,                     /* size (0 = byte, 1 = short, 2 = long) */
2683          10,                    /* bitsize */
2684          TRUE,                  /* pc_relative */
2685          0,                     /* bitpos */
2686          complain_overflow_signed, /* complain_on_overflow */
2687          _bfd_mips_elf_generic_reloc, /* special_function */
2688          "R_MICROMIPS_PC10_S1", /* name */
2689          FALSE,                 /* partial_inplace */
2690          0,                     /* src_mask */
2691          0x000003ff,            /* dst_mask */
2692          TRUE),                 /* pcrel_offset */
2693
2694   HOWTO (R_MICROMIPS_PC16_S1,   /* type */
2695          1,                     /* rightshift */
2696          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2697          16,                    /* bitsize */
2698          TRUE,                  /* pc_relative */
2699          0,                     /* bitpos */
2700          complain_overflow_signed, /* complain_on_overflow */
2701          _bfd_mips_elf_generic_reloc, /* special_function */
2702          "R_MICROMIPS_PC16_S1", /* name */
2703          FALSE,                 /* partial_inplace */
2704          0,                     /* src_mask */
2705          0x0000ffff,            /* dst_mask */
2706          TRUE),                 /* pcrel_offset */
2707
2708   /* 16 bit call through global offset table.  */
2709   HOWTO (R_MICROMIPS_CALL16,    /* type */
2710          0,                     /* rightshift */
2711          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2712          16,                    /* bitsize */
2713          FALSE,                 /* pc_relative */
2714          0,                     /* bitpos */
2715          complain_overflow_signed, /* complain_on_overflow */
2716          _bfd_mips_elf_generic_reloc, /* special_function */
2717          "R_MICROMIPS_CALL16",  /* name */
2718          FALSE,                 /* partial_inplace */
2719          0,                     /* src_mask */
2720          0x0000ffff,            /* dst_mask */
2721          FALSE),                /* pcrel_offset */
2722
2723   EMPTY_HOWTO (143),
2724   EMPTY_HOWTO (144),
2725
2726   /* Displacement in the global offset table.  */
2727   HOWTO (R_MICROMIPS_GOT_DISP,  /* type */
2728          0,                     /* rightshift */
2729          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2730          16,                    /* bitsize */
2731          FALSE,                 /* pc_relative */
2732          0,                     /* bitpos */
2733          complain_overflow_signed, /* complain_on_overflow */
2734          _bfd_mips_elf_generic_reloc, /* special_function */
2735          "R_MICROMIPS_GOT_DISP",/* name */
2736          FALSE,                 /* partial_inplace */
2737          0,                     /* src_mask */
2738          0x0000ffff,            /* dst_mask */
2739          FALSE),                /* pcrel_offset */
2740
2741   /* Displacement to page pointer in the global offset table.  */
2742   HOWTO (R_MICROMIPS_GOT_PAGE,  /* type */
2743          0,                     /* rightshift */
2744          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2745          16,                    /* bitsize */
2746          FALSE,                 /* pc_relative */
2747          0,                     /* bitpos */
2748          complain_overflow_signed, /* complain_on_overflow */
2749          _bfd_mips_elf_generic_reloc, /* special_function */
2750          "R_MICROMIPS_GOT_PAGE",/* name */
2751          FALSE,                 /* partial_inplace */
2752          0,                     /* src_mask */
2753          0x0000ffff,            /* dst_mask */
2754          FALSE),                /* pcrel_offset */
2755
2756   /* Offset from page pointer in the global offset table.  */
2757   HOWTO (R_MICROMIPS_GOT_OFST,  /* type */
2758          0,                     /* rightshift */
2759          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2760          16,                    /* bitsize */
2761          FALSE,                 /* pc_relative */
2762          0,                     /* bitpos */
2763          complain_overflow_signed, /* complain_on_overflow */
2764          _bfd_mips_elf_generic_reloc, /* special_function */
2765          "R_MICROMIPS_GOT_OFST",/* name */
2766          FALSE,                 /* partial_inplace */
2767          0,                     /* src_mask */
2768          0x0000ffff,            /* dst_mask */
2769          FALSE),                /* pcrel_offset */
2770
2771   /* High 16 bits of displacement in global offset table.  */
2772   HOWTO (R_MICROMIPS_GOT_HI16,  /* type */
2773          0,                     /* rightshift */
2774          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2775          16,                    /* bitsize */
2776          FALSE,                 /* pc_relative */
2777          0,                     /* bitpos */
2778          complain_overflow_dont, /* complain_on_overflow */
2779          _bfd_mips_elf_generic_reloc, /* special_function */
2780          "R_MICROMIPS_GOT_HI16",/* name */
2781          FALSE,                 /* partial_inplace */
2782          0,                     /* src_mask */
2783          0x0000ffff,            /* dst_mask */
2784          FALSE),                /* pcrel_offset */
2785
2786   /* Low 16 bits of displacement in global offset table.  */
2787   HOWTO (R_MICROMIPS_GOT_LO16,  /* type */
2788          0,                     /* rightshift */
2789          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2790          16,                    /* bitsize */
2791          FALSE,                 /* pc_relative */
2792          0,                     /* bitpos */
2793          complain_overflow_dont, /* complain_on_overflow */
2794          _bfd_mips_elf_generic_reloc, /* special_function */
2795          "R_MICROMIPS_GOT_LO16",/* name */
2796          FALSE,                 /* partial_inplace */
2797          0,                     /* src_mask */
2798          0x0000ffff,            /* dst_mask */
2799          FALSE),                /* pcrel_offset */
2800
2801   /* 64 bit subtraction.  Used in the N32 ABI.  */
2802   HOWTO (R_MICROMIPS_SUB,       /* type */
2803          0,                     /* rightshift */
2804          4,                     /* size (0 = byte, 1 = short, 2 = long) */
2805          64,                    /* bitsize */
2806          FALSE,                 /* pc_relative */
2807          0,                     /* bitpos */
2808          complain_overflow_dont, /* complain_on_overflow */
2809          _bfd_mips_elf_generic_reloc, /* special_function */
2810          "R_MICROMIPS_SUB",     /* name */
2811          FALSE,                 /* partial_inplace */
2812          0,                     /* src_mask */
2813          MINUS_ONE,             /* dst_mask */
2814          FALSE),                /* pcrel_offset */
2815
2816   /* Get the higher value of a 64 bit addend.  */
2817   HOWTO (R_MICROMIPS_HIGHER,    /* type */
2818          0,                     /* rightshift */
2819          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2820          16,                    /* bitsize */
2821          FALSE,                 /* pc_relative */
2822          0,                     /* bitpos */
2823          complain_overflow_dont, /* complain_on_overflow */
2824          _bfd_mips_elf_generic_reloc, /* special_function */
2825          "R_MICROMIPS_HIGHER",  /* name */
2826          FALSE,                 /* partial_inplace */
2827          0,                     /* src_mask */
2828          0x0000ffff,            /* dst_mask */
2829          FALSE),                /* pcrel_offset */
2830
2831   /* Get the highest value of a 64 bit addend.  */
2832   HOWTO (R_MICROMIPS_HIGHEST,   /* type */
2833          0,                     /* rightshift */
2834          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2835          16,                    /* bitsize */
2836          FALSE,                 /* pc_relative */
2837          0,                     /* bitpos */
2838          complain_overflow_dont, /* complain_on_overflow */
2839          _bfd_mips_elf_generic_reloc, /* special_function */
2840          "R_MICROMIPS_HIGHEST", /* name */
2841          FALSE,                 /* partial_inplace */
2842          0,                     /* src_mask */
2843          0x0000ffff,            /* dst_mask */
2844          FALSE),                /* pcrel_offset */
2845
2846   /* High 16 bits of displacement in global offset table.  */
2847   HOWTO (R_MICROMIPS_CALL_HI16, /* type */
2848          0,                     /* rightshift */
2849          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2850          16,                    /* bitsize */
2851          FALSE,                 /* pc_relative */
2852          0,                     /* bitpos */
2853          complain_overflow_dont, /* complain_on_overflow */
2854          _bfd_mips_elf_generic_reloc, /* special_function */
2855          "R_MICROMIPS_CALL_HI16",/* name */
2856          FALSE,                 /* partial_inplace */
2857          0,                     /* src_mask */
2858          0x0000ffff,            /* dst_mask */
2859          FALSE),                /* pcrel_offset */
2860
2861   /* Low 16 bits of displacement in global offset table.  */
2862   HOWTO (R_MICROMIPS_CALL_LO16, /* type */
2863          0,                     /* rightshift */
2864          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2865          16,                    /* bitsize */
2866          FALSE,                 /* pc_relative */
2867          0,                     /* bitpos */
2868          complain_overflow_dont, /* complain_on_overflow */
2869          _bfd_mips_elf_generic_reloc, /* special_function */
2870          "R_MICROMIPS_CALL_LO16",/* name */
2871          FALSE,                 /* partial_inplace */
2872          0,                     /* src_mask */
2873          0x0000ffff,            /* dst_mask */
2874          FALSE),                /* pcrel_offset */
2875
2876   /* Section displacement.  */
2877   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
2878          0,                     /* rightshift */
2879          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2880          32,                    /* bitsize */
2881          FALSE,                 /* pc_relative */
2882          0,                     /* bitpos */
2883          complain_overflow_dont, /* complain_on_overflow */
2884          _bfd_mips_elf_generic_reloc, /* special_function */
2885          "R_MICROMIPS_SCN_DISP", /* name */
2886          FALSE,                 /* partial_inplace */
2887          0,                     /* src_mask */
2888          0xffffffff,            /* dst_mask */
2889          FALSE),                /* pcrel_offset */
2890
2891   /* Protected jump conversion.  This is an optimization hint.  No
2892      relocation is required for correctness.  */
2893   HOWTO (R_MICROMIPS_JALR,      /* type */
2894          0,                     /* rightshift */
2895          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2896          32,                    /* bitsize */
2897          FALSE,                 /* pc_relative */
2898          0,                     /* bitpos */
2899          complain_overflow_dont, /* complain_on_overflow */
2900          _bfd_mips_elf_generic_reloc, /* special_function */
2901          "R_MICROMIPS_JALR",    /* name */
2902          FALSE,                 /* partial_inplace */
2903          0,                     /* src_mask */
2904          0x00000000,            /* dst_mask */
2905          FALSE),                /* pcrel_offset */
2906
2907   /* Low 16 bits of symbol value.  Note that the high 16 bits of symbol values
2908      must be zero.  This is used for relaxation.  */
2909   HOWTO (R_MICROMIPS_HI0_LO16,  /* type */
2910          0,                     /* rightshift */
2911          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2912          16,                    /* bitsize */
2913          FALSE,                 /* pc_relative */
2914          0,                     /* bitpos */
2915          complain_overflow_dont, /* complain_on_overflow */
2916          _bfd_mips_elf_generic_reloc, /* special_function */
2917          "R_MICROMIPS_HI0_LO16",/* name */
2918          FALSE,                 /* partial_inplace */
2919          0,                     /* src_mask */
2920          0x0000ffff,            /* dst_mask */
2921          FALSE),                /* pcrel_offset */
2922
2923   EMPTY_HOWTO (158),
2924   EMPTY_HOWTO (159),
2925   EMPTY_HOWTO (160),
2926   EMPTY_HOWTO (161),
2927
2928   /* TLS general dynamic variable reference.  */
2929   HOWTO (R_MICROMIPS_TLS_GD,            /* type */
2930          0,                     /* rightshift */
2931          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2932          16,                    /* bitsize */
2933          FALSE,                 /* pc_relative */
2934          0,                     /* bitpos */
2935          complain_overflow_signed, /* complain_on_overflow */
2936          _bfd_mips_elf_generic_reloc, /* special_function */
2937          "R_MICROMIPS_TLS_GD",  /* name */
2938          FALSE,                 /* partial_inplace */
2939          0,                     /* src_mask */
2940          0x0000ffff,            /* dst_mask */
2941          FALSE),                /* pcrel_offset */
2942
2943   /* TLS local dynamic variable reference.  */
2944   HOWTO (R_MICROMIPS_TLS_LDM,   /* type */
2945          0,                     /* rightshift */
2946          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2947          16,                    /* bitsize */
2948          FALSE,                 /* pc_relative */
2949          0,                     /* bitpos */
2950          complain_overflow_signed, /* complain_on_overflow */
2951          _bfd_mips_elf_generic_reloc, /* special_function */
2952          "R_MICROMIPS_TLS_LDM", /* name */
2953          FALSE,                 /* partial_inplace */
2954          0,                     /* src_mask */
2955          0x0000ffff,            /* dst_mask */
2956          FALSE),                /* pcrel_offset */
2957
2958   /* TLS local dynamic offset.  */
2959   HOWTO (R_MICROMIPS_TLS_DTPREL_HI16,   /* type */
2960          0,                     /* rightshift */
2961          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2962          16,                    /* bitsize */
2963          FALSE,                 /* pc_relative */
2964          0,                     /* bitpos */
2965          complain_overflow_signed, /* complain_on_overflow */
2966          _bfd_mips_elf_generic_reloc, /* special_function */
2967          "R_MICROMIPS_TLS_DTPREL_HI16", /* name */
2968          FALSE,                 /* partial_inplace */
2969          0,                     /* src_mask */
2970          0x0000ffff,            /* dst_mask */
2971          FALSE),                /* pcrel_offset */
2972
2973   /* TLS local dynamic offset.  */
2974   HOWTO (R_MICROMIPS_TLS_DTPREL_LO16,   /* type */
2975          0,                     /* rightshift */
2976          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2977          16,                    /* bitsize */
2978          FALSE,                 /* pc_relative */
2979          0,                     /* bitpos */
2980          complain_overflow_signed, /* complain_on_overflow */
2981          _bfd_mips_elf_generic_reloc, /* special_function */
2982          "R_MICROMIPS_TLS_DTPREL_LO16", /* name */
2983          FALSE,                 /* partial_inplace */
2984          0,                     /* src_mask */
2985          0x0000ffff,            /* dst_mask */
2986          FALSE),                /* pcrel_offset */
2987
2988   /* TLS thread pointer offset.  */
2989   HOWTO (R_MICROMIPS_TLS_GOTTPREL,      /* type */
2990          0,                     /* rightshift */
2991          2,                     /* size (0 = byte, 1 = short, 2 = long) */
2992          16,                    /* bitsize */
2993          FALSE,                 /* pc_relative */
2994          0,                     /* bitpos */
2995          complain_overflow_signed, /* complain_on_overflow */
2996          _bfd_mips_elf_generic_reloc, /* special_function */
2997          "R_MICROMIPS_TLS_GOTTPREL",    /* name */
2998          FALSE,                 /* partial_inplace */
2999          0,                     /* src_mask */
3000          0x0000ffff,            /* dst_mask */
3001          FALSE),                /* pcrel_offset */
3002
3003   EMPTY_HOWTO (167),
3004   EMPTY_HOWTO (168),
3005
3006   /* TLS thread pointer offset.  */
3007   HOWTO (R_MICROMIPS_TLS_TPREL_HI16,    /* type */
3008          0,                     /* rightshift */
3009          2,                     /* size (0 = byte, 1 = short, 2 = long) */
3010          16,                    /* bitsize */
3011          FALSE,                 /* pc_relative */
3012          0,                     /* bitpos */
3013          complain_overflow_signed, /* complain_on_overflow */
3014          _bfd_mips_elf_generic_reloc, /* special_function */
3015          "R_MICROMIPS_TLS_TPREL_HI16", /* name */
3016          FALSE,                 /* partial_inplace */
3017          0,                     /* src_mask */
3018          0x0000ffff,            /* dst_mask */
3019          FALSE),                /* pcrel_offset */
3020
3021   /* TLS thread pointer offset.  */
3022   HOWTO (R_MICROMIPS_TLS_TPREL_LO16,    /* type */
3023          0,                     /* rightshift */
3024          2,                     /* size (0 = byte, 1 = short, 2 = long) */
3025          16,                    /* bitsize */
3026          FALSE,                 /* pc_relative */
3027          0,                     /* bitpos */
3028          complain_overflow_signed, /* complain_on_overflow */
3029          _bfd_mips_elf_generic_reloc, /* special_function */
3030          "R_MICROMIPS_TLS_TPREL_LO16", /* name */
3031          FALSE,                 /* partial_inplace */
3032          0,                     /* src_mask */
3033          0x0000ffff,            /* dst_mask */
3034          FALSE),                /* pcrel_offset */
3035
3036   EMPTY_HOWTO (171),
3037
3038   /* GP- and PC-relative relocations.  */
3039   HOWTO (R_MICROMIPS_GPREL7_S2, /* type */
3040          2,                     /* rightshift */
3041          1,                     /* size (0 = byte, 1 = short, 2 = long) */
3042          7,                     /* bitsize */
3043          FALSE,                 /* pc_relative */
3044          0,                     /* bitpos */
3045          complain_overflow_signed, /* complain_on_overflow */
3046          _bfd_mips_elf32_gprel16_reloc, /* special_function */
3047          "R_MICROMIPS_GPREL7_S2",       /* name */
3048          FALSE,                 /* partial_inplace */
3049          0,                     /* src_mask */
3050          0x0000007f,            /* dst_mask */
3051          FALSE),                /* pcrel_offset */
3052
3053   HOWTO (R_MICROMIPS_PC23_S2,   /* type */
3054          2,                     /* rightshift */
3055          2,                     /* size (0 = byte, 1 = short, 2 = long) */
3056          23,                    /* bitsize */
3057          TRUE,                  /* pc_relative */
3058          0,                     /* bitpos */
3059          complain_overflow_signed, /* complain_on_overflow */
3060          _bfd_mips_elf_generic_reloc, /* special_function */
3061          "R_MICROMIPS_PC23_S2", /* name */
3062          FALSE,                 /* partial_inplace */
3063          0,                     /* src_mask */
3064          0x007fffff,            /* dst_mask */
3065          TRUE),                 /* pcrel_offset */
3066 };
3067
3068 /* GNU extension to record C++ vtable hierarchy */
3069 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
3070   HOWTO (R_MIPS_GNU_VTINHERIT,  /* type */
3071          0,                     /* rightshift */
3072          2,                     /* size (0 = byte, 1 = short, 2 = long) */
3073          0,                     /* bitsize */
3074          FALSE,                 /* pc_relative */
3075          0,                     /* bitpos */
3076          complain_overflow_dont, /* complain_on_overflow */
3077          NULL,                  /* special_function */
3078          "R_MIPS_GNU_VTINHERIT", /* name */
3079          FALSE,                 /* partial_inplace */
3080          0,                     /* src_mask */
3081          0,                     /* dst_mask */
3082          FALSE);                /* pcrel_offset */
3083
3084 /* GNU extension to record C++ vtable member usage */
3085 static reloc_howto_type elf_mips_gnu_vtentry_howto =
3086   HOWTO (R_MIPS_GNU_VTENTRY,    /* type */
3087          0,                     /* rightshift */
3088          2,                     /* size (0 = byte, 1 = short, 2 = long) */
3089          0,                     /* bitsize */
3090          FALSE,                 /* pc_relative */
3091          0,                     /* bitpos */
3092          complain_overflow_dont, /* complain_on_overflow */
3093          _bfd_elf_rel_vtable_reloc_fn, /* special_function */
3094          "R_MIPS_GNU_VTENTRY",  /* name */
3095          FALSE,                 /* partial_inplace */
3096          0,                     /* src_mask */
3097          0,                     /* dst_mask */
3098          FALSE);                /* pcrel_offset */
3099 \f
3100 /* 16 bit offset for pc-relative branches.  */
3101 static reloc_howto_type elf_mips_gnu_rel16_s2 =
3102   HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
3103          2,                     /* rightshift */
3104          2,                     /* size (0 = byte, 1 = short, 2 = long) */
3105          16,                    /* bitsize */
3106          TRUE,                  /* pc_relative */
3107          0,                     /* bitpos */
3108          complain_overflow_signed, /* complain_on_overflow */
3109          _bfd_mips_elf_generic_reloc, /* special_function */
3110          "R_MIPS_GNU_REL16_S2", /* name */
3111          TRUE,                  /* partial_inplace */
3112          0x0000ffff,            /* src_mask */
3113          0x0000ffff,            /* dst_mask */
3114          TRUE);                 /* pcrel_offset */
3115
3116 /* 16 bit offset for pc-relative branches.  */
3117 static reloc_howto_type elf_mips_gnu_rela16_s2 =
3118   HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
3119          2,                     /* rightshift */
3120          2,                     /* size (0 = byte, 1 = short, 2 = long) */
3121          16,                    /* bitsize */
3122          TRUE,                  /* pc_relative */
3123          0,                     /* bitpos */
3124          complain_overflow_signed, /* complain_on_overflow */
3125          _bfd_mips_elf_generic_reloc, /* special_function */
3126          "R_MIPS_GNU_REL16_S2", /* name */
3127          FALSE,                 /* partial_inplace */
3128          0,                     /* src_mask */
3129          0x0000ffff,            /* dst_mask */
3130          TRUE);                 /* pcrel_offset */
3131
3132 /* 32 bit pc-relative.  Used for compact EH tables.  */
3133 static reloc_howto_type elf_mips_gnu_pcrel32 =
3134   HOWTO (R_MIPS_PC32,           /* type */
3135          0,                     /* rightshift */
3136          2,                     /* size (0 = byte, 1 = short, 2 = long) */
3137          32,                    /* bitsize */
3138          TRUE,                  /* pc_relative */
3139          0,                     /* bitpos */
3140          complain_overflow_signed, /* complain_on_overflow */
3141          _bfd_mips_elf_generic_reloc, /* special_function */
3142          "R_MIPS_PC32",         /* name */
3143          TRUE,                  /* partial_inplace */
3144          0xffffffff,            /* src_mask */
3145          0xffffffff,            /* dst_mask */
3146          TRUE);                 /* pcrel_offset */
3147
3148 \f
3149 /* Originally a VxWorks extension, but now used for other systems too.  */
3150 static reloc_howto_type elf_mips_copy_howto =
3151   HOWTO (R_MIPS_COPY,           /* type */
3152          0,                     /* rightshift */
3153          0,                     /* this one is variable size */
3154          0,                     /* bitsize */
3155          FALSE,                 /* pc_relative */
3156          0,                     /* bitpos */
3157          complain_overflow_bitfield, /* complain_on_overflow */
3158          _bfd_mips_elf_generic_reloc, /* special_function */
3159          "R_MIPS_COPY",         /* name */
3160          FALSE,                 /* partial_inplace */
3161          0x0,                   /* src_mask */
3162          0x0,                   /* dst_mask */
3163          FALSE);                /* pcrel_offset */
3164
3165 /* Originally a VxWorks extension, but now used for other systems too.  */
3166 static reloc_howto_type elf_mips_jump_slot_howto =
3167   HOWTO (R_MIPS_JUMP_SLOT,      /* type */
3168          0,                     /* rightshift */
3169          2,                     /* size (0 = byte, 1 = short, 2 = long) */
3170          32,                    /* bitsize */
3171          FALSE,                 /* pc_relative */
3172          0,                     /* bitpos */
3173          complain_overflow_bitfield, /* complain_on_overflow */
3174          _bfd_mips_elf_generic_reloc, /* special_function */
3175          "R_MIPS_JUMP_SLOT",    /* name */
3176          FALSE,                 /* partial_inplace */
3177          0x0,                   /* src_mask */
3178          0x0,                   /* dst_mask */
3179          FALSE);                /* pcrel_offset */
3180
3181 /* Used in EH tables.  */
3182 static reloc_howto_type elf_mips_eh_howto =
3183   HOWTO (R_MIPS_EH,             /* type */
3184          0,                     /* rightshift */
3185          2,                     /* size (0 = byte, 1 = short, 2 = long) */
3186          32,                    /* bitsize */
3187          FALSE,                 /* pc_relative */
3188          0,                     /* bitpos */
3189          complain_overflow_signed, /* complain_on_overflow */
3190          _bfd_mips_elf_generic_reloc, /* special_function */
3191          "R_MIPS_EH",           /* name */
3192          TRUE,                  /* partial_inplace */
3193          0xffffffff,            /* src_mask */
3194          0xffffffff,            /* dst_mask */
3195          FALSE);                /* pcrel_offset */
3196
3197 \f
3198 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
3199    dangerous relocation.  */
3200
3201 static bfd_boolean
3202 mips_elf_assign_gp (bfd *output_bfd, bfd_vma *pgp)
3203 {
3204   unsigned int count;
3205   asymbol **sym;
3206   unsigned int i;
3207
3208   /* If we've already figured out what GP will be, just return it.  */
3209   *pgp = _bfd_get_gp_value (output_bfd);
3210   if (*pgp)
3211     return TRUE;
3212
3213   count = bfd_get_symcount (output_bfd);
3214   sym = bfd_get_outsymbols (output_bfd);
3215
3216   /* The linker script will have created a symbol named `_gp' with the
3217      appropriate value.  */
3218   if (sym == NULL)
3219     i = count;
3220   else
3221     {
3222       for (i = 0; i < count; i++, sym++)
3223         {
3224           register const char *name;
3225
3226           name = bfd_asymbol_name (*sym);
3227           if (*name == '_' && strcmp (name, "_gp") == 0)
3228             {
3229               *pgp = bfd_asymbol_value (*sym);
3230               _bfd_set_gp_value (output_bfd, *pgp);
3231               break;
3232             }
3233         }
3234     }
3235
3236   if (i >= count)
3237     {
3238       /* Only get the error once.  */
3239       *pgp = 4;
3240       _bfd_set_gp_value (output_bfd, *pgp);
3241       return FALSE;
3242     }
3243
3244   return TRUE;
3245 }
3246
3247 /* We have to figure out the gp value, so that we can adjust the
3248    symbol value correctly.  We look up the symbol _gp in the output
3249    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
3250    target data.  We don't need to adjust the symbol value for an
3251    external symbol if we are producing relocatable output.  */
3252
3253 static bfd_reloc_status_type
3254 mips_elf_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
3255                    char **error_message, bfd_vma *pgp)
3256 {
3257   if (bfd_is_und_section (symbol->section)
3258       && ! relocatable)
3259     {
3260       *pgp = 0;
3261       return bfd_reloc_undefined;
3262     }
3263
3264   *pgp = _bfd_get_gp_value (output_bfd);
3265   if (*pgp == 0
3266       && (! relocatable
3267           || (symbol->flags & BSF_SECTION_SYM) != 0))
3268     {
3269       if (relocatable)
3270         {
3271           /* Make up a value.  */
3272           *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
3273           _bfd_set_gp_value (output_bfd, *pgp);
3274         }
3275       else if (!mips_elf_assign_gp (output_bfd, pgp))
3276         {
3277           *error_message =
3278             (char *) _("GP relative relocation when _gp not defined");
3279           return bfd_reloc_dangerous;
3280         }
3281     }
3282
3283   return bfd_reloc_ok;
3284 }
3285
3286 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
3287    become the offset from the gp register.  */
3288
3289 static bfd_reloc_status_type
3290 mips_elf_gprel16_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
3291                         asymbol *symbol, void *data ATTRIBUTE_UNUSED,
3292                         asection *input_section, bfd *output_bfd,
3293                         char **error_message ATTRIBUTE_UNUSED)
3294 {
3295   bfd_boolean relocatable;
3296   bfd_reloc_status_type ret;
3297   bfd_vma gp;
3298
3299   if (output_bfd != NULL)
3300     relocatable = TRUE;
3301   else
3302     {
3303       relocatable = FALSE;
3304       output_bfd = symbol->section->output_section->owner;
3305     }
3306
3307   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
3308                            &gp);
3309   if (ret != bfd_reloc_ok)
3310     return ret;
3311
3312   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3313                                         input_section, relocatable,
3314                                         data, gp);
3315 }
3316
3317 /* Do a R_MIPS_LITERAL relocation.  */
3318
3319 static bfd_reloc_status_type
3320 mips_elf_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3321                         void *data, asection *input_section, bfd *output_bfd,
3322                         char **error_message)
3323 {
3324   bfd_boolean relocatable;
3325   bfd_reloc_status_type ret;
3326   bfd_vma gp;
3327
3328   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
3329   if (output_bfd != NULL
3330       && (symbol->flags & BSF_SECTION_SYM) == 0
3331       && (symbol->flags & BSF_LOCAL) != 0)
3332     {
3333       *error_message = (char *)
3334         _("literal relocation occurs for an external symbol");
3335       return bfd_reloc_outofrange;
3336     }
3337
3338   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
3339   if (output_bfd != NULL)
3340     relocatable = TRUE;
3341   else
3342     {
3343       relocatable = FALSE;
3344       output_bfd = symbol->section->output_section->owner;
3345     }
3346
3347   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
3348                            &gp);
3349   if (ret != bfd_reloc_ok)
3350     return ret;
3351
3352   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3353                                         input_section, relocatable,
3354                                         data, gp);
3355 }
3356
3357 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
3358    become the offset from the gp register.  */
3359
3360 static bfd_reloc_status_type
3361 mips_elf_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3362                         void *data, asection *input_section, bfd *output_bfd,
3363                         char **error_message)
3364 {
3365   bfd_boolean relocatable;
3366   bfd_reloc_status_type ret;
3367   bfd_vma gp;
3368
3369   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
3370   if (output_bfd != NULL
3371       && (symbol->flags & BSF_SECTION_SYM) == 0
3372       && (symbol->flags & BSF_LOCAL) != 0)
3373     {
3374       *error_message = (char *)
3375         _("32bits gp relative relocation occurs for an external symbol");
3376       return bfd_reloc_outofrange;
3377     }
3378
3379   if (output_bfd != NULL)
3380     {
3381       relocatable = TRUE;
3382       gp = _bfd_get_gp_value (output_bfd);
3383     }
3384   else
3385     {
3386       relocatable = FALSE;
3387       output_bfd = symbol->section->output_section->owner;
3388
3389       ret = mips_elf_final_gp (output_bfd, symbol, relocatable,
3390                                error_message, &gp);
3391       if (ret != bfd_reloc_ok)
3392         return ret;
3393     }
3394
3395   return gprel32_with_gp (abfd, symbol, reloc_entry, input_section,
3396                           relocatable, data, gp);
3397 }
3398
3399 static bfd_reloc_status_type
3400 gprel32_with_gp (bfd *abfd, asymbol *symbol, arelent *reloc_entry,
3401                  asection *input_section, bfd_boolean relocatable,
3402                  void *data, bfd_vma gp)
3403 {
3404   bfd_vma relocation;
3405   unsigned long val;
3406
3407   if (bfd_is_com_section (symbol->section))
3408     relocation = 0;
3409   else
3410     relocation = symbol->value;
3411
3412   relocation += symbol->section->output_section->vma;
3413   relocation += symbol->section->output_offset;
3414
3415   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
3416     return bfd_reloc_outofrange;
3417
3418   if (reloc_entry->howto->src_mask == 0)
3419     val = 0;
3420   else
3421     val = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
3422
3423   /* Set val to the offset into the section or symbol.  */
3424   val += reloc_entry->addend;
3425
3426   /* Adjust val for the final section location and GP value.  If we
3427      are producing relocatable output, we don't want to do this for
3428      an external symbol.  */
3429   if (! relocatable
3430       || (symbol->flags & BSF_SECTION_SYM) != 0)
3431     val += relocation - gp;
3432
3433   bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
3434
3435   if (relocatable)
3436     reloc_entry->address += input_section->output_offset;
3437
3438   return bfd_reloc_ok;
3439 }
3440
3441 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
3442    the rest is at bits 6-10. The bitpos already got right by the howto.  */
3443
3444 static bfd_reloc_status_type
3445 mips_elf_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3446                        void *data, asection *input_section, bfd *output_bfd,
3447                        char **error_message)
3448 {
3449   if (reloc_entry->howto->partial_inplace)
3450     {
3451       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
3452                              | (reloc_entry->addend & 0x00000800) >> 9);
3453     }
3454
3455   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
3456                                       input_section, output_bfd,
3457                                       error_message);
3458 }
3459 \f
3460 /* Handle a mips16 GP relative reloc.  */
3461
3462 static bfd_reloc_status_type
3463 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3464                     void *data, asection *input_section, bfd *output_bfd,
3465                     char **error_message)
3466 {
3467   bfd_boolean relocatable;
3468   bfd_reloc_status_type ret;
3469   bfd_byte *location;
3470   bfd_vma gp;
3471
3472   /* If we're relocating, and this is an external symbol, we don't want
3473      to change anything.  */
3474   if (output_bfd != NULL
3475       && (symbol->flags & BSF_SECTION_SYM) == 0
3476       && (symbol->flags & BSF_LOCAL) != 0)
3477     {
3478       reloc_entry->address += input_section->output_offset;
3479       return bfd_reloc_ok;
3480     }
3481
3482   if (output_bfd != NULL)
3483     relocatable = TRUE;
3484   else
3485     {
3486       relocatable = FALSE;
3487       output_bfd = symbol->section->output_section->owner;
3488     }
3489
3490   ret = mips_elf_final_gp (output_bfd, symbol, relocatable, error_message,
3491                            &gp);
3492   if (ret != bfd_reloc_ok)
3493     return ret;
3494
3495   location = (bfd_byte *) data + reloc_entry->address;
3496   _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
3497                                  location);
3498   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3499                                        input_section, relocatable,
3500                                        data, gp);
3501   _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
3502                                location);
3503
3504   return ret;
3505 }
3506 \f
3507 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
3508
3509 struct elf_reloc_map {
3510   bfd_reloc_code_real_type bfd_val;
3511   enum elf_mips_reloc_type elf_val;
3512 };
3513
3514 static const struct elf_reloc_map mips_reloc_map[] =
3515 {
3516   { BFD_RELOC_NONE, R_MIPS_NONE },
3517   { BFD_RELOC_16, R_MIPS_16 },
3518   { BFD_RELOC_32, R_MIPS_32 },
3519   /* There is no BFD reloc for R_MIPS_REL32.  */
3520   { BFD_RELOC_CTOR, R_MIPS_32 },
3521   { BFD_RELOC_64, R_MIPS_64 },
3522   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
3523   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
3524   { BFD_RELOC_LO16, R_MIPS_LO16 },
3525   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
3526   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
3527   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
3528   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
3529   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
3530   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
3531   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
3532   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
3533   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
3534   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
3535   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
3536   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
3537   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
3538   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
3539   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
3540   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
3541   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
3542   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
3543   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
3544   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
3545   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
3546   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
3547   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
3548   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
3549   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
3550   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
3551   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
3552   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
3553   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
3554   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
3555   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
3556   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
3557   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
3558   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
3559   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
3560   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
3561   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
3562   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
3563   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 },
3564   { BFD_RELOC_MIPS_21_PCREL_S2, R_MIPS_PC21_S2 },
3565   { BFD_RELOC_MIPS_26_PCREL_S2, R_MIPS_PC26_S2 },
3566   { BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
3567   { BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
3568   { BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
3569   { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
3570 };
3571
3572 static const struct elf_reloc_map mips16_reloc_map[] =
3573 {
3574   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
3575   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
3576   { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
3577   { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
3578   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
3579   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
3580   { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
3581   { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
3582   { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
3583     R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
3584   { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
3585     R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
3586   { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
3587   { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
3588   { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min },
3589   { BFD_RELOC_MIPS16_16_PCREL_S1, R_MIPS16_PC16_S1 - R_MIPS16_min }
3590 };
3591
3592 static const struct elf_reloc_map micromips_reloc_map[] =
3593 {
3594   { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
3595   { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
3596   { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
3597   { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
3598   { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
3599   { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
3600   { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
3601   { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
3602   { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
3603   { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
3604   { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
3605   { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
3606   { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
3607   { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
3608   { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
3609   { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
3610   { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
3611   { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
3612   { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
3613   { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
3614   { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
3615   { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
3616   /* There is no BFD reloc for R_MICROMIPS_HI0_LO16.  */
3617   { BFD_RELOC_MICROMIPS_TLS_GD, R_MICROMIPS_TLS_GD - R_MICROMIPS_min },
3618   { BFD_RELOC_MICROMIPS_TLS_LDM, R_MICROMIPS_TLS_LDM - R_MICROMIPS_min },
3619   { BFD_RELOC_MICROMIPS_TLS_DTPREL_HI16,
3620     R_MICROMIPS_TLS_DTPREL_HI16 - R_MICROMIPS_min },
3621   { BFD_RELOC_MICROMIPS_TLS_DTPREL_LO16,
3622     R_MICROMIPS_TLS_DTPREL_LO16 - R_MICROMIPS_min },
3623   { BFD_RELOC_MICROMIPS_TLS_GOTTPREL,
3624     R_MICROMIPS_TLS_GOTTPREL - R_MICROMIPS_min },
3625   { BFD_RELOC_MICROMIPS_TLS_TPREL_HI16,
3626     R_MICROMIPS_TLS_TPREL_HI16 - R_MICROMIPS_min },
3627   { BFD_RELOC_MICROMIPS_TLS_TPREL_LO16,
3628     R_MICROMIPS_TLS_TPREL_LO16 - R_MICROMIPS_min },
3629   /* There is no BFD reloc for R_MICROMIPS_GPREL7_S2.  */
3630   /* There is no BFD reloc for R_MICROMIPS_PC23_S2.  */
3631 };
3632
3633 /* Given a BFD reloc type, return a howto structure.  */
3634
3635 static reloc_howto_type *
3636 bfd_elf32_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3637                                  bfd_reloc_code_real_type code)
3638 {
3639   unsigned int i;
3640   /* FIXME: We default to RELA here instead of choosing the right
3641      relocation variant.  */
3642   reloc_howto_type *howto_table = elf_mips_howto_table_rela;
3643   reloc_howto_type *howto16_table = elf_mips16_howto_table_rela;
3644   reloc_howto_type *howto_micromips_table = elf_micromips_howto_table_rela;
3645
3646   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
3647        i++)
3648     {
3649       if (mips_reloc_map[i].bfd_val == code)
3650         return &howto_table[(int) mips_reloc_map[i].elf_val];
3651     }
3652
3653   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
3654        i++)
3655     {
3656       if (mips16_reloc_map[i].bfd_val == code)
3657         return &howto16_table[(int) mips16_reloc_map[i].elf_val];
3658     }
3659
3660   for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
3661        i++)
3662     {
3663       if (micromips_reloc_map[i].bfd_val == code)
3664         return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
3665     }
3666
3667   switch (code)
3668     {
3669     case BFD_RELOC_VTABLE_INHERIT:
3670       return &elf_mips_gnu_vtinherit_howto;
3671     case BFD_RELOC_VTABLE_ENTRY:
3672       return &elf_mips_gnu_vtentry_howto;
3673     case BFD_RELOC_32_PCREL:
3674       return &elf_mips_gnu_pcrel32;
3675     case BFD_RELOC_MIPS_EH:
3676       return &elf_mips_eh_howto;
3677     case BFD_RELOC_MIPS_COPY:
3678       return &elf_mips_copy_howto;
3679     case BFD_RELOC_MIPS_JUMP_SLOT:
3680       return &elf_mips_jump_slot_howto;
3681     default:
3682       bfd_set_error (bfd_error_bad_value);
3683       return NULL;
3684     }
3685 }
3686
3687 static reloc_howto_type *
3688 bfd_elf32_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3689                                  const char *r_name)
3690 {
3691   unsigned int i;
3692
3693   for (i = 0;
3694        i < (sizeof (elf_mips_howto_table_rela)
3695             / sizeof (elf_mips_howto_table_rela[0]));
3696        i++)
3697     if (elf_mips_howto_table_rela[i].name != NULL
3698         && strcasecmp (elf_mips_howto_table_rela[i].name, r_name) == 0)
3699       return &elf_mips_howto_table_rela[i];
3700
3701   for (i = 0;
3702        i < (sizeof (elf_mips16_howto_table_rela)
3703             / sizeof (elf_mips16_howto_table_rela[0]));
3704        i++)
3705     if (elf_mips16_howto_table_rela[i].name != NULL
3706         && strcasecmp (elf_mips16_howto_table_rela[i].name, r_name) == 0)
3707       return &elf_mips16_howto_table_rela[i];
3708
3709   for (i = 0;
3710        i < (sizeof (elf_micromips_howto_table_rela)
3711             / sizeof (elf_micromips_howto_table_rela[0]));
3712        i++)
3713     if (elf_micromips_howto_table_rela[i].name != NULL
3714         && strcasecmp (elf_micromips_howto_table_rela[i].name, r_name) == 0)
3715       return &elf_micromips_howto_table_rela[i];
3716
3717   if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
3718     return &elf_mips_gnu_vtinherit_howto;
3719   if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
3720     return &elf_mips_gnu_vtentry_howto;
3721   if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
3722     return &elf_mips_gnu_rel16_s2;
3723   if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
3724     return &elf_mips_gnu_rela16_s2;
3725   if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
3726     return &elf_mips_gnu_pcrel32;
3727   if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0)
3728     return &elf_mips_eh_howto;
3729   if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
3730     return &elf_mips_copy_howto;
3731   if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
3732     return &elf_mips_jump_slot_howto;
3733
3734   return NULL;
3735 }
3736
3737 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
3738
3739 static reloc_howto_type *
3740 mips_elf_n32_rtype_to_howto (bfd *abfd, unsigned int r_type, bfd_boolean rela_p)
3741 {
3742   reloc_howto_type *howto = NULL;
3743
3744   switch (r_type)
3745     {
3746     case R_MIPS_GNU_VTINHERIT:
3747       return &elf_mips_gnu_vtinherit_howto;
3748     case R_MIPS_GNU_VTENTRY:
3749       return &elf_mips_gnu_vtentry_howto;
3750     case R_MIPS_GNU_REL16_S2:
3751       if (rela_p)
3752         return &elf_mips_gnu_rela16_s2;
3753       else
3754         return &elf_mips_gnu_rel16_s2;
3755     case R_MIPS_PC32:
3756       return &elf_mips_gnu_pcrel32;
3757     case R_MIPS_EH:
3758       return &elf_mips_eh_howto;
3759     case R_MIPS_COPY:
3760       return &elf_mips_copy_howto;
3761     case R_MIPS_JUMP_SLOT:
3762       return &elf_mips_jump_slot_howto;
3763     default:
3764       if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
3765         {
3766           if (rela_p)
3767             howto = &elf_micromips_howto_table_rela[r_type - R_MICROMIPS_min];
3768           else
3769             howto = &elf_micromips_howto_table_rel[r_type - R_MICROMIPS_min];
3770         }
3771       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
3772         {
3773           if (rela_p)
3774             howto = &elf_mips16_howto_table_rela[r_type - R_MIPS16_min];
3775           else
3776             howto = &elf_mips16_howto_table_rel[r_type - R_MIPS16_min];
3777         }
3778       if (r_type < R_MIPS_max)
3779         {
3780           if (rela_p)
3781             howto = &elf_mips_howto_table_rela[r_type];
3782           else
3783             howto = &elf_mips_howto_table_rel[r_type];
3784         }
3785       if (howto != NULL && howto->name != NULL)
3786         return howto;
3787
3788       _bfd_error_handler (_("%pB: unsupported relocation type %#x"),
3789                           abfd, r_type);
3790       bfd_set_error (bfd_error_bad_value);
3791       return NULL;
3792     }
3793 }
3794
3795 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
3796
3797 static bfd_boolean
3798 mips_info_to_howto_rel (bfd *abfd, arelent *cache_ptr, Elf_Internal_Rela *dst)
3799 {
3800   unsigned int r_type;
3801
3802   r_type = ELF32_R_TYPE (dst->r_info);
3803   cache_ptr->howto = mips_elf_n32_rtype_to_howto (abfd, r_type, FALSE);
3804
3805   if (cache_ptr->howto == NULL)
3806     return FALSE;
3807
3808   /* The addend for a GPREL16 or LITERAL relocation comes from the GP
3809      value for the object file.  We get the addend now, rather than
3810      when we do the relocation, because the symbol manipulations done
3811      by the linker may cause us to lose track of the input BFD.  */
3812   if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
3813       && (gprel16_reloc_p (r_type) || r_type == (unsigned int) R_MIPS_LITERAL))
3814     cache_ptr->addend = elf_gp (abfd);
3815
3816   return TRUE;
3817 }
3818
3819 /* Given a MIPS Elf_Internal_Rela, fill in an arelent structure.  */
3820
3821 static bfd_boolean
3822 mips_info_to_howto_rela (bfd *abfd,
3823                          arelent *cache_ptr, Elf_Internal_Rela *dst)
3824 {
3825   unsigned int r_type;
3826
3827   r_type = ELF32_R_TYPE (dst->r_info);
3828   cache_ptr->howto = mips_elf_n32_rtype_to_howto (abfd, r_type, TRUE);
3829   cache_ptr->addend = dst->r_addend;
3830   return cache_ptr->howto != NULL;
3831 }
3832 \f
3833 /* Determine whether a symbol is global for the purposes of splitting
3834    the symbol table into global symbols and local symbols.  At least
3835    on Irix 5, this split must be between section symbols and all other
3836    symbols.  On most ELF targets the split is between static symbols
3837    and externally visible symbols.  */
3838
3839 static bfd_boolean
3840 mips_elf_sym_is_global (bfd *abfd ATTRIBUTE_UNUSED, asymbol *sym)
3841 {
3842   if (SGI_COMPAT (abfd))
3843     return (sym->flags & BSF_SECTION_SYM) == 0;
3844   else
3845     return ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0
3846             || bfd_is_und_section (bfd_asymbol_section (sym))
3847             || bfd_is_com_section (bfd_asymbol_section (sym)));
3848 }
3849
3850 /* Likewise, return TRUE if the symbol table split overall must be
3851    between section symbols and all other symbols.  */
3852 static bfd_boolean
3853 mips_elf_n32_elfsym_local_is_section (bfd *abfd)
3854 {
3855   return SGI_COMPAT (abfd);
3856 }
3857 \f
3858 /* Set the right machine number for a MIPS ELF file.  */
3859
3860 static bfd_boolean
3861 mips_elf_n32_object_p (bfd *abfd)
3862 {
3863   unsigned long mach;
3864
3865   if (!ABI_N32_P (abfd))
3866     return FALSE;
3867
3868   /* Irix 5 and 6 are broken.  Object file symbol tables are not always
3869      sorted correctly such that local symbols precede global symbols,
3870      and the sh_info field in the symbol table is not always right.  */
3871   if (SGI_COMPAT (abfd))
3872     elf_bad_symtab (abfd) = TRUE;
3873
3874   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
3875   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
3876   return TRUE;
3877 }
3878 \f
3879 /* Support for core dump NOTE sections.  */
3880 static bfd_boolean
3881 elf32_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
3882 {
3883   int offset;
3884   unsigned int size;
3885
3886   switch (note->descsz)
3887     {
3888       default:
3889         return FALSE;
3890
3891       case 440:         /* Linux/MIPS N32 */
3892         /* pr_cursig */
3893         elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
3894
3895         /* pr_pid */
3896         elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 24);
3897
3898         /* pr_reg */
3899         offset = 72;
3900         size = 360;
3901
3902         break;
3903     }
3904
3905   /* Make a ".reg/999" section.  */
3906   return _bfd_elfcore_make_pseudosection (abfd, ".reg", size,
3907                                           note->descpos + offset);
3908 }
3909
3910 static bfd_boolean
3911 elf32_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
3912 {
3913   switch (note->descsz)
3914     {
3915       default:
3916         return FALSE;
3917
3918       case 128:         /* Linux/MIPS elf_prpsinfo */
3919         elf_tdata (abfd)->core->pid
3920          = bfd_get_32 (abfd, note->descdata + 16);
3921         elf_tdata (abfd)->core->program
3922          = _bfd_elfcore_strndup (abfd, note->descdata + 32, 16);
3923         elf_tdata (abfd)->core->command
3924          = _bfd_elfcore_strndup (abfd, note->descdata + 48, 80);
3925     }
3926
3927   /* Note that for some reason, a spurious space is tacked
3928      onto the end of the args in some (at least one anyway)
3929      implementations, so strip it off if it exists.  */
3930
3931   {
3932     char *command = elf_tdata (abfd)->core->command;
3933     int n = strlen (command);
3934
3935     if (0 < n && command[n - 1] == ' ')
3936       command[n - 1] = '\0';
3937   }
3938
3939   return TRUE;
3940 }
3941
3942 static bfd_boolean
3943 elf_n32_mips_grok_freebsd_prstatus (bfd *abfd, Elf_Internal_Note *note)
3944 {
3945   size_t offset;
3946   size_t size;
3947   size_t min_size;
3948
3949   /* Compute offset of pr_getregsz, skipping over pr_statussz.
3950      Also compute minimum size of this note.  */
3951   offset = 4 + 4;
3952   min_size = offset + 4 * 2 + 4 + 4 + 4;
3953
3954   if (note->descsz < min_size)
3955     return FALSE;
3956
3957   /* Check for version 1 in pr_version.  */
3958   if (bfd_h_get_32 (abfd, (bfd_byte *) note->descdata) != 1)
3959     return FALSE;
3960
3961   /* Extract size of pr_reg from pr_gregsetsz.  */
3962   /* Skip over pr_gregsetsz and pr_fpregsetsz.  */
3963   size = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
3964   offset += 4 * 2;
3965
3966   /* Skip over pr_osreldate.  */
3967   offset += 4;
3968
3969   /* Read signal from pr_cursig.  */
3970   if (elf_tdata (abfd)->core->signal == 0)
3971     elf_tdata (abfd)->core->signal
3972       = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
3973   offset += 4;
3974
3975   /* Read TID from pr_pid.  */
3976   elf_tdata (abfd)->core->lwpid
3977       = bfd_h_get_32 (abfd, (bfd_byte *) note->descdata + offset);
3978   offset += 4;
3979
3980   /* Padding before pr_reg.  */
3981   offset += 4;
3982
3983   /* Make sure that there is enough data remaining in the note.  */
3984   if (note->descsz - offset < size)
3985     return FALSE;
3986
3987   /* Make a ".reg/999" section and a ".reg" section.  */
3988   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
3989                                           size, note->descpos + offset);
3990 }
3991
3992 /* Write Linux core PRSTATUS note into core file.  */
3993
3994 static char *
3995 elf32_mips_write_core_note (bfd *abfd, char *buf, int *bufsiz, int note_type,
3996                              ...)
3997 {
3998   switch (note_type)
3999     {
4000     default:
4001       return NULL;
4002
4003     case NT_PRPSINFO:
4004       BFD_FAIL ();
4005       return NULL;
4006
4007     case NT_PRSTATUS:
4008       {
4009         char data[440];
4010         va_list ap;
4011         long pid;
4012         int cursig;
4013         const void *greg;
4014
4015         va_start (ap, note_type);
4016         memset (data, 0, 72);
4017         pid = va_arg (ap, long);
4018         bfd_put_32 (abfd, pid, data + 24);
4019         cursig = va_arg (ap, int);
4020         bfd_put_16 (abfd, cursig, data + 12);
4021         greg = va_arg (ap, const void *);
4022         memcpy (data + 72, greg, 360);
4023         memset (data + 432, 0, 8);
4024         va_end (ap);
4025         return elfcore_write_note (abfd, buf, bufsiz,
4026                                    "CORE", note_type, data, sizeof (data));
4027       }
4028     }
4029 }
4030 \f
4031 /* Depending on the target vector we generate some version of Irix
4032    executables or "normal" MIPS ELF ABI executables.  */
4033 static irix_compat_t
4034 elf_n32_mips_irix_compat (bfd *abfd)
4035 {
4036   if ((abfd->xvec == &mips_elf32_n_be_vec)
4037       || (abfd->xvec == &mips_elf32_n_le_vec))
4038     return ict_irix6;
4039   else
4040     return ict_none;
4041 }
4042 \f
4043 /* Make an n32 MIPS object.  We need to set the n32 ABI flag in
4044    `e_flags' to tell the object apart from an o32 object.  */
4045
4046 static bfd_boolean
4047 mips_elf_n32_mkobject (bfd *abfd)
4048 {
4049   bfd_boolean ret;
4050
4051   ret = _bfd_mips_elf_mkobject (abfd);
4052   if (ret)
4053     elf_elfheader (abfd)->e_flags |= EF_MIPS_ABI2;
4054
4055   return ret;
4056 }
4057 \f
4058 /* ECOFF swapping routines.  These are used when dealing with the
4059    .mdebug section, which is in the ECOFF debugging format.  */
4060 static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap = {
4061   /* Symbol table magic number.  */
4062   magicSym,
4063   /* Alignment of debugging information.  E.g., 4.  */
4064   4,
4065   /* Sizes of external symbolic information.  */
4066   sizeof (struct hdr_ext),
4067   sizeof (struct dnr_ext),
4068   sizeof (struct pdr_ext),
4069   sizeof (struct sym_ext),
4070   sizeof (struct opt_ext),
4071   sizeof (struct fdr_ext),
4072   sizeof (struct rfd_ext),
4073   sizeof (struct ext_ext),
4074   /* Functions to swap in external symbolic data.  */
4075   ecoff_swap_hdr_in,
4076   ecoff_swap_dnr_in,
4077   ecoff_swap_pdr_in,
4078   ecoff_swap_sym_in,
4079   ecoff_swap_opt_in,
4080   ecoff_swap_fdr_in,
4081   ecoff_swap_rfd_in,
4082   ecoff_swap_ext_in,
4083   _bfd_ecoff_swap_tir_in,
4084   _bfd_ecoff_swap_rndx_in,
4085   /* Functions to swap out external symbolic data.  */
4086   ecoff_swap_hdr_out,
4087   ecoff_swap_dnr_out,
4088   ecoff_swap_pdr_out,
4089   ecoff_swap_sym_out,
4090   ecoff_swap_opt_out,
4091   ecoff_swap_fdr_out,
4092   ecoff_swap_rfd_out,
4093   ecoff_swap_ext_out,
4094   _bfd_ecoff_swap_tir_out,
4095   _bfd_ecoff_swap_rndx_out,
4096   /* Function to read in symbolic data.  */
4097   _bfd_mips_elf_read_ecoff_info
4098 };
4099 \f
4100 #define ELF_ARCH                        bfd_arch_mips
4101 #define ELF_TARGET_ID                   MIPS_ELF_DATA
4102 #define ELF_MACHINE_CODE                EM_MIPS
4103
4104 #define elf_backend_collect             TRUE
4105 #define elf_backend_type_change_ok      TRUE
4106 #define elf_backend_can_gc_sections     TRUE
4107 #define elf_backend_gc_mark_extra_sections \
4108                                         _bfd_mips_elf_gc_mark_extra_sections
4109 #define elf_info_to_howto               mips_info_to_howto_rela
4110 #define elf_info_to_howto_rel           mips_info_to_howto_rel
4111 #define elf_backend_sym_is_global       mips_elf_sym_is_global
4112 #define elf_backend_object_p            mips_elf_n32_object_p
4113 #define elf_backend_symbol_processing   _bfd_mips_elf_symbol_processing
4114 #define elf_backend_section_processing  _bfd_mips_elf_section_processing
4115 #define elf_backend_section_from_shdr   _bfd_mips_elf_section_from_shdr
4116 #define elf_backend_fake_sections       _bfd_mips_elf_fake_sections
4117 #define elf_backend_section_from_bfd_section \
4118                                         _bfd_mips_elf_section_from_bfd_section
4119 #define elf_backend_add_symbol_hook     _bfd_mips_elf_add_symbol_hook
4120 #define elf_backend_link_output_symbol_hook \
4121                                         _bfd_mips_elf_link_output_symbol_hook
4122 #define elf_backend_create_dynamic_sections \
4123                                         _bfd_mips_elf_create_dynamic_sections
4124 #define elf_backend_check_relocs        _bfd_mips_elf_check_relocs
4125 #define elf_backend_merge_symbol_attribute \
4126                                         _bfd_mips_elf_merge_symbol_attribute
4127 #define elf_backend_get_target_dtag     _bfd_mips_elf_get_target_dtag
4128 #define elf_backend_adjust_dynamic_symbol \
4129                                         _bfd_mips_elf_adjust_dynamic_symbol
4130 #define elf_backend_always_size_sections \
4131                                         _bfd_mips_elf_always_size_sections
4132 #define elf_backend_size_dynamic_sections \
4133                                         _bfd_mips_elf_size_dynamic_sections
4134 #define elf_backend_init_index_section  _bfd_elf_init_1_index_section
4135 #define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
4136 #define elf_backend_finish_dynamic_symbol \
4137                                         _bfd_mips_elf_finish_dynamic_symbol
4138 #define elf_backend_finish_dynamic_sections \
4139                                         _bfd_mips_elf_finish_dynamic_sections
4140 #define elf_backend_final_write_processing \
4141                                         _bfd_mips_elf_final_write_processing
4142 #define elf_backend_additional_program_headers \
4143                                         _bfd_mips_elf_additional_program_headers
4144 #define elf_backend_modify_segment_map  _bfd_mips_elf_modify_segment_map
4145 #define elf_backend_gc_mark_hook        _bfd_mips_elf_gc_mark_hook
4146 #define elf_backend_gc_sweep_hook       _bfd_mips_elf_gc_sweep_hook
4147 #define elf_backend_copy_indirect_symbol \
4148                                         _bfd_mips_elf_copy_indirect_symbol
4149 #define elf_backend_hide_symbol         _bfd_mips_elf_hide_symbol
4150 #define elf_backend_grok_prstatus       elf32_mips_grok_prstatus
4151 #define elf_backend_grok_psinfo         elf32_mips_grok_psinfo
4152 #define elf_backend_grok_freebsd_prstatus \
4153                                         elf_n32_mips_grok_freebsd_prstatus
4154 #define elf_backend_ecoff_debug_swap    &mips_elf32_ecoff_debug_swap
4155
4156 #define elf_backend_got_header_size     (4 * MIPS_RESERVED_GOTNO)
4157 #define elf_backend_want_dynrelro       1
4158
4159 /* MIPS n32 ELF can use a mixture of REL and RELA, but some Relocations
4160    work better/work only in RELA, so we default to this.  */
4161 #define elf_backend_may_use_rel_p       1
4162 #define elf_backend_may_use_rela_p      1
4163 #define elf_backend_default_use_rela_p  1
4164 #define elf_backend_rela_plts_and_copies_p 0
4165 #define elf_backend_sign_extend_vma     TRUE
4166 #define elf_backend_plt_readonly        1
4167 #define elf_backend_plt_sym_val         _bfd_mips_elf_plt_sym_val
4168
4169 #define elf_backend_discard_info        _bfd_mips_elf_discard_info
4170 #define elf_backend_ignore_discarded_relocs \
4171                                         _bfd_mips_elf_ignore_discarded_relocs
4172 #define elf_backend_write_section       _bfd_mips_elf_write_section
4173 #define elf_backend_elfsym_local_is_section \
4174                                         mips_elf_n32_elfsym_local_is_section
4175 #define elf_backend_mips_irix_compat    elf_n32_mips_irix_compat
4176 #define elf_backend_mips_rtype_to_howto mips_elf_n32_rtype_to_howto
4177 #define bfd_elf32_bfd_is_target_special_symbol \
4178                                         _bfd_mips_elf_is_target_special_symbol
4179 #define bfd_elf32_find_nearest_line     _bfd_mips_elf_find_nearest_line
4180 #define bfd_elf32_find_inliner_info     _bfd_mips_elf_find_inliner_info
4181 #define bfd_elf32_new_section_hook      _bfd_mips_elf_new_section_hook
4182 #define bfd_elf32_set_section_contents  _bfd_mips_elf_set_section_contents
4183 #define bfd_elf32_bfd_get_relocated_section_contents \
4184                                 _bfd_elf_mips_get_relocated_section_contents
4185 #define bfd_elf32_bfd_link_hash_table_create \
4186                                         _bfd_mips_elf_link_hash_table_create
4187 #define bfd_elf32_bfd_final_link        _bfd_mips_elf_final_link
4188 #define bfd_elf32_bfd_merge_private_bfd_data \
4189                                         _bfd_mips_elf_merge_private_bfd_data
4190 #define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
4191 #define bfd_elf32_bfd_print_private_bfd_data \
4192                                         _bfd_mips_elf_print_private_bfd_data
4193 #define bfd_elf32_mkobject              mips_elf_n32_mkobject
4194
4195 /* Support for SGI-ish mips targets using n32 ABI.  */
4196
4197 #define TARGET_LITTLE_SYM               mips_elf32_n_le_vec
4198 #define TARGET_LITTLE_NAME              "elf32-nlittlemips"
4199 #define TARGET_BIG_SYM                  mips_elf32_n_be_vec
4200 #define TARGET_BIG_NAME                 "elf32-nbigmips"
4201
4202 #define ELF_MAXPAGESIZE                 0x10000
4203 #define ELF_COMMONPAGESIZE              0x1000
4204
4205 #include "elf32-target.h"
4206
4207 /* Support for traditional mips targets using n32 ABI.  */
4208 #undef TARGET_LITTLE_SYM
4209 #undef TARGET_LITTLE_NAME
4210 #undef TARGET_BIG_SYM
4211 #undef TARGET_BIG_NAME
4212
4213 #undef ELF_MAXPAGESIZE
4214 #undef ELF_COMMONPAGESIZE
4215
4216 #define TARGET_LITTLE_SYM               mips_elf32_ntrad_le_vec
4217 #define TARGET_LITTLE_NAME              "elf32-ntradlittlemips"
4218 #define TARGET_BIG_SYM                  mips_elf32_ntrad_be_vec
4219 #define TARGET_BIG_NAME                 "elf32-ntradbigmips"
4220
4221 #define ELF_MAXPAGESIZE                 0x10000
4222 #define ELF_COMMONPAGESIZE              0x1000
4223 #define elf32_bed                       elf32_tradbed
4224
4225 #undef elf_backend_write_core_note
4226 #define elf_backend_write_core_note     elf32_mips_write_core_note
4227
4228 /* Include the target file again for this target.  */
4229 #include "elf32-target.h"
4230
4231
4232 /* FreeBSD support.  */
4233
4234 #undef TARGET_LITTLE_SYM
4235 #undef TARGET_LITTLE_NAME
4236 #undef TARGET_BIG_SYM
4237 #undef TARGET_BIG_NAME
4238
4239 #define TARGET_LITTLE_SYM               mips_elf32_ntradfbsd_le_vec
4240 #define TARGET_LITTLE_NAME              "elf32-ntradlittlemips-freebsd"
4241 #define TARGET_BIG_SYM                  mips_elf32_ntradfbsd_be_vec
4242 #define TARGET_BIG_NAME                 "elf32-ntradbigmips-freebsd"
4243
4244 #undef  ELF_OSABI
4245 #define ELF_OSABI                       ELFOSABI_FREEBSD
4246
4247 #undef  elf32_bed
4248 #define elf32_bed                               elf32_fbsd_tradbed
4249
4250 #undef elf_backend_write_core_note
4251
4252 #include "elf32-target.h"
This page took 0.274007 seconds and 4 git commands to generate.