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