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