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