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