This commit was generated by cvs2svn to track changes on a CVS vendor
[external/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    Free Software Foundation, Inc.
4    Ian Lance Taylor, Cygnus Support
5    Linker support added by Mark Mitchell, CodeSourcery, LLC.
6    <mark@codesourcery.com>
7
8 This file is part of BFD, the Binary File Descriptor library.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
23
24 /* This file supports the 64-bit MIPS ELF ABI.
25
26    The MIPS 64-bit ELF ABI uses an unusual reloc format.  This file
27    overrides the usual ELF reloc handling, and handles reading and
28    writing the relocations here.  */
29
30 /* TODO: Many things are unsupported, even if there is some code for it
31  .       (which was mostly stolen from elf32-mips.c and slightly adapted).
32  .
33  .   - Relocation handling for REL relocs is wrong in many cases and
34  .     generally untested.
35  .   - Relocation handling for RELA relocs related to GOT support are
36  .     also likely to be wrong.
37  .   - Support for MIPS16 is untested.
38  .   - Combined relocs with RSS_* entries are unsupported.
39  .   - The whole GOT handling for NewABI is missing, some parts of
40  .     the OldABI version is still lying around and should be removed.
41  */
42
43 #include "bfd.h"
44 #include "sysdep.h"
45 #include "libbfd.h"
46 #include "aout/ar.h"
47 #include "bfdlink.h"
48 #include "genlink.h"
49 #include "elf-bfd.h"
50 #include "elfxx-mips.h"
51 #include "elf/mips.h"
52
53 /* Get the ECOFF swapping routines.  The 64-bit ABI is not supposed to
54    use ECOFF.  However, we support it anyhow for an easier changeover.  */
55 #include "coff/sym.h"
56 #include "coff/symconst.h"
57 #include "coff/internal.h"
58 #include "coff/ecoff.h"
59 /* The 64 bit versions of the mdebug data structures are in alpha.h.  */
60 #include "coff/alpha.h"
61 #define ECOFF_SIGNED_64
62 #include "ecoffswap.h"
63
64 static void mips_elf64_swap_reloc_in
65   (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
66 static void mips_elf64_swap_reloca_in
67   (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
68 static void mips_elf64_swap_reloc_out
69   (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
70 static void mips_elf64_swap_reloca_out
71   (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
72 static void mips_elf64_be_swap_reloc_in
73   (bfd *, const bfd_byte *, Elf_Internal_Rela *);
74 static void mips_elf64_be_swap_reloc_out
75   (bfd *, const Elf_Internal_Rela *, bfd_byte *);
76 static void mips_elf64_be_swap_reloca_in
77   (bfd *, const bfd_byte *, Elf_Internal_Rela *);
78 static void mips_elf64_be_swap_reloca_out
79   (bfd *, const Elf_Internal_Rela *, bfd_byte *);
80 static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
81   (bfd *, bfd_reloc_code_real_type);
82 static reloc_howto_type *mips_elf64_rtype_to_howto
83   (unsigned int, bfd_boolean);
84 static void mips_elf64_info_to_howto_rel
85   (bfd *, arelent *, Elf_Internal_Rela *);
86 static void mips_elf64_info_to_howto_rela
87   (bfd *, arelent *, Elf_Internal_Rela *);
88 static long mips_elf64_get_reloc_upper_bound
89   (bfd *, asection *);
90 static long mips_elf64_canonicalize_reloc
91   (bfd *, asection *, arelent **, asymbol **);
92 static long mips_elf64_get_dynamic_reloc_upper_bound
93   (bfd *);
94 static long mips_elf64_canonicalize_dynamic_reloc
95   (bfd *, arelent **, asymbol **);
96 static bfd_boolean mips_elf64_slurp_one_reloc_table
97   (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
98    asymbol **, bfd_boolean);
99 static bfd_boolean mips_elf64_slurp_reloc_table
100   (bfd *, asection *, asymbol **, bfd_boolean);
101 static void mips_elf64_write_relocs
102   (bfd *, asection *, void *);
103 static void mips_elf64_write_rel
104   (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
105 static void mips_elf64_write_rela
106   (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
107 static bfd_reloc_status_type mips_elf64_gprel16_reloc
108   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
109 static bfd_reloc_status_type mips_elf64_literal_reloc
110   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
111 static bfd_reloc_status_type mips_elf64_gprel32_reloc
112   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
113 static bfd_reloc_status_type mips_elf64_shift6_reloc
114   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
115 static bfd_reloc_status_type mips16_jump_reloc
116   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
117 static bfd_reloc_status_type mips16_gprel_reloc
118   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
119 static bfd_boolean mips_elf64_assign_gp
120   (bfd *, bfd_vma *);
121 static bfd_reloc_status_type mips_elf64_final_gp
122   (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
123 static bfd_boolean mips_elf64_object_p
124   (bfd *);
125 static irix_compat_t elf64_mips_irix_compat
126   (bfd *);
127 static bfd_boolean elf64_mips_grok_prstatus
128   (bfd *, Elf_Internal_Note *);
129 static bfd_boolean elf64_mips_grok_psinfo
130   (bfd *, Elf_Internal_Note *);
131
132 extern const bfd_target bfd_elf64_bigmips_vec;
133 extern const bfd_target bfd_elf64_littlemips_vec;
134
135 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
136    from smaller values.  Start with zero, widen, *then* decrement.  */
137 #define MINUS_ONE       (((bfd_vma)0) - 1)
138
139 /* The number of local .got entries we reserve.  */
140 #define MIPS_RESERVED_GOTNO (2)
141 \f
142 /* The relocation table used for SHT_REL sections.  */
143
144 static reloc_howto_type mips_elf64_howto_table_rel[] =
145 {
146   /* No relocation.  */
147   HOWTO (R_MIPS_NONE,           /* type */
148          0,                     /* rightshift */
149          0,                     /* size (0 = byte, 1 = short, 2 = long) */
150          0,                     /* bitsize */
151          FALSE,                 /* pc_relative */
152          0,                     /* bitpos */
153          complain_overflow_dont, /* complain_on_overflow */
154          _bfd_mips_elf_generic_reloc,   /* special_function */
155          "R_MIPS_NONE",         /* name */
156          FALSE,                 /* partial_inplace */
157          0,                     /* src_mask */
158          0,                     /* dst_mask */
159          FALSE),                /* pcrel_offset */
160
161   /* 16 bit relocation.  */
162   HOWTO (R_MIPS_16,             /* type */
163          0,                     /* rightshift */
164          2,                     /* size (0 = byte, 1 = short, 2 = long) */
165          16,                    /* bitsize */
166          FALSE,                 /* pc_relative */
167          0,                     /* bitpos */
168          complain_overflow_signed, /* complain_on_overflow */
169          _bfd_mips_elf_generic_reloc,   /* special_function */
170          "R_MIPS_16",           /* name */
171          TRUE,                  /* partial_inplace */
172          0x0000ffff,            /* src_mask */
173          0x0000ffff,            /* dst_mask */
174          FALSE),                /* pcrel_offset */
175
176   /* 32 bit relocation.  */
177   HOWTO (R_MIPS_32,             /* type */
178          0,                     /* rightshift */
179          2,                     /* size (0 = byte, 1 = short, 2 = long) */
180          32,                    /* bitsize */
181          FALSE,                 /* pc_relative */
182          0,                     /* bitpos */
183          complain_overflow_dont, /* complain_on_overflow */
184          _bfd_mips_elf_generic_reloc,   /* special_function */
185          "R_MIPS_32",           /* name */
186          TRUE,                  /* partial_inplace */
187          0xffffffff,            /* src_mask */
188          0xffffffff,            /* dst_mask */
189          FALSE),                /* pcrel_offset */
190
191   /* 32 bit symbol relative relocation.  */
192   HOWTO (R_MIPS_REL32,          /* type */
193          0,                     /* rightshift */
194          2,                     /* size (0 = byte, 1 = short, 2 = long) */
195          32,                    /* bitsize */
196          FALSE,                 /* pc_relative */
197          0,                     /* bitpos */
198          complain_overflow_dont, /* complain_on_overflow */
199          _bfd_mips_elf_generic_reloc,   /* special_function */
200          "R_MIPS_REL32",        /* name */
201          TRUE,                  /* partial_inplace */
202          0xffffffff,            /* src_mask */
203          0xffffffff,            /* dst_mask */
204          FALSE),                /* pcrel_offset */
205
206   /* 26 bit jump address.  */
207   HOWTO (R_MIPS_26,             /* type */
208          2,                     /* rightshift */
209          2,                     /* size (0 = byte, 1 = short, 2 = long) */
210          26,                    /* bitsize */
211          FALSE,                 /* pc_relative */
212          0,                     /* bitpos */
213          complain_overflow_dont, /* complain_on_overflow */
214                                 /* This needs complex overflow
215                                    detection, because the upper 36
216                                    bits must match the PC + 4.  */
217          _bfd_mips_elf_generic_reloc,   /* special_function */
218          "R_MIPS_26",           /* name */
219          TRUE,                  /* partial_inplace */
220          0x03ffffff,            /* src_mask */
221          0x03ffffff,            /* dst_mask */
222          FALSE),                /* pcrel_offset */
223
224   /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
225      However, the native IRIX6 tools use them, so we try our best. */
226
227   /* High 16 bits of symbol value.  */
228   HOWTO (R_MIPS_HI16,           /* type */
229          16,                    /* rightshift */
230          2,                     /* size (0 = byte, 1 = short, 2 = long) */
231          16,                    /* bitsize */
232          FALSE,                 /* pc_relative */
233          0,                     /* bitpos */
234          complain_overflow_dont, /* complain_on_overflow */
235          _bfd_mips_elf_hi16_reloc, /* special_function */
236          "R_MIPS_HI16",         /* name */
237          TRUE,                  /* partial_inplace */
238          0x0000ffff,            /* src_mask */
239          0x0000ffff,            /* dst_mask */
240          FALSE),                /* pcrel_offset */
241
242   /* Low 16 bits of symbol value.  */
243   HOWTO (R_MIPS_LO16,           /* type */
244          0,                     /* rightshift */
245          2,                     /* size (0 = byte, 1 = short, 2 = long) */
246          16,                    /* bitsize */
247          FALSE,                 /* pc_relative */
248          0,                     /* bitpos */
249          complain_overflow_dont, /* complain_on_overflow */
250          _bfd_mips_elf_lo16_reloc, /* special_function */
251          "R_MIPS_LO16",         /* name */
252          TRUE,                  /* partial_inplace */
253          0x0000ffff,            /* src_mask */
254          0x0000ffff,            /* dst_mask */
255          FALSE),                /* pcrel_offset */
256
257   /* GP relative reference.  */
258   HOWTO (R_MIPS_GPREL16,        /* type */
259          0,                     /* rightshift */
260          2,                     /* size (0 = byte, 1 = short, 2 = long) */
261          16,                    /* bitsize */
262          FALSE,                 /* pc_relative */
263          0,                     /* bitpos */
264          complain_overflow_signed, /* complain_on_overflow */
265          mips_elf64_gprel16_reloc, /* special_function */
266          "R_MIPS_GPREL16",      /* name */
267          TRUE,                  /* partial_inplace */
268          0x0000ffff,            /* src_mask */
269          0x0000ffff,            /* dst_mask */
270          FALSE),                /* pcrel_offset */
271
272   /* Reference to literal section.  */
273   HOWTO (R_MIPS_LITERAL,        /* type */
274          0,                     /* rightshift */
275          2,                     /* size (0 = byte, 1 = short, 2 = long) */
276          16,                    /* bitsize */
277          FALSE,                 /* pc_relative */
278          0,                     /* bitpos */
279          complain_overflow_signed, /* complain_on_overflow */
280          mips_elf64_literal_reloc, /* special_function */
281          "R_MIPS_LITERAL",      /* name */
282          TRUE,                  /* partial_inplace */
283          0x0000ffff,            /* src_mask */
284          0x0000ffff,            /* dst_mask */
285          FALSE),                /* pcrel_offset */
286
287   /* Reference to global offset table.  */
288   HOWTO (R_MIPS_GOT16,          /* type */
289          0,                     /* rightshift */
290          2,                     /* size (0 = byte, 1 = short, 2 = long) */
291          16,                    /* bitsize */
292          FALSE,                 /* pc_relative */
293          0,                     /* bitpos */
294          complain_overflow_signed, /* complain_on_overflow */
295          _bfd_mips_elf_got16_reloc, /* special_function */
296          "R_MIPS_GOT16",        /* name */
297          TRUE,                  /* partial_inplace */
298          0x0000ffff,            /* src_mask */
299          0x0000ffff,            /* dst_mask */
300          FALSE),                /* pcrel_offset */
301
302   /* 16 bit PC relative reference.  Note that the ABI document has a typo
303      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
304      We do the right thing here.  */
305   HOWTO (R_MIPS_PC16,           /* type */
306          2,                     /* rightshift */
307          2,                     /* size (0 = byte, 1 = short, 2 = long) */
308          16,                    /* bitsize */
309          TRUE,                  /* pc_relative */
310          0,                     /* bitpos */
311          complain_overflow_signed, /* complain_on_overflow */
312          _bfd_mips_elf_generic_reloc,   /* special_function */
313          "R_MIPS_PC16",         /* name */
314          TRUE,                  /* partial_inplace */
315          0x0000ffff,            /* src_mask */
316          0x0000ffff,            /* dst_mask */
317          TRUE),                 /* pcrel_offset */
318
319   /* 16 bit call through global offset table.  */
320   HOWTO (R_MIPS_CALL16,         /* type */
321          0,                     /* rightshift */
322          2,                     /* size (0 = byte, 1 = short, 2 = long) */
323          16,                    /* bitsize */
324          FALSE,                 /* pc_relative */
325          0,                     /* bitpos */
326          complain_overflow_signed, /* complain_on_overflow */
327          _bfd_mips_elf_generic_reloc,   /* special_function */
328          "R_MIPS_CALL16",       /* name */
329          TRUE,                  /* partial_inplace */
330          0x0000ffff,            /* src_mask */
331          0x0000ffff,            /* dst_mask */
332          FALSE),                /* pcrel_offset */
333
334   /* 32 bit GP relative reference.  */
335   HOWTO (R_MIPS_GPREL32,        /* type */
336          0,                     /* rightshift */
337          2,                     /* size (0 = byte, 1 = short, 2 = long) */
338          32,                    /* bitsize */
339          FALSE,                 /* pc_relative */
340          0,                     /* bitpos */
341          complain_overflow_dont, /* complain_on_overflow */
342          mips_elf64_gprel32_reloc, /* special_function */
343          "R_MIPS_GPREL32",      /* name */
344          TRUE,                  /* partial_inplace */
345          0xffffffff,            /* src_mask */
346          0xffffffff,            /* dst_mask */
347          FALSE),                /* pcrel_offset */
348
349   EMPTY_HOWTO (13),
350   EMPTY_HOWTO (14),
351   EMPTY_HOWTO (15),
352
353   /* A 5 bit shift field.  */
354   HOWTO (R_MIPS_SHIFT5,         /* type */
355          0,                     /* rightshift */
356          2,                     /* size (0 = byte, 1 = short, 2 = long) */
357          5,                     /* bitsize */
358          FALSE,                 /* pc_relative */
359          6,                     /* bitpos */
360          complain_overflow_bitfield, /* complain_on_overflow */
361          _bfd_mips_elf_generic_reloc,   /* special_function */
362          "R_MIPS_SHIFT5",       /* name */
363          TRUE,                  /* partial_inplace */
364          0x000007c0,            /* src_mask */
365          0x000007c0,            /* dst_mask */
366          FALSE),                /* pcrel_offset */
367
368   /* A 6 bit shift field.  */
369   HOWTO (R_MIPS_SHIFT6,         /* type */
370          0,                     /* rightshift */
371          2,                     /* size (0 = byte, 1 = short, 2 = long) */
372          6,                     /* bitsize */
373          FALSE,                 /* pc_relative */
374          6,                     /* bitpos */
375          complain_overflow_bitfield, /* complain_on_overflow */
376          mips_elf64_shift6_reloc, /* special_function */
377          "R_MIPS_SHIFT6",       /* name */
378          TRUE,                  /* partial_inplace */
379          0x000007c4,            /* src_mask */
380          0x000007c4,            /* dst_mask */
381          FALSE),                /* pcrel_offset */
382
383   /* 64 bit relocation.  */
384   HOWTO (R_MIPS_64,             /* type */
385          0,                     /* rightshift */
386          4,                     /* size (0 = byte, 1 = short, 2 = long) */
387          64,                    /* bitsize */
388          FALSE,                 /* pc_relative */
389          0,                     /* bitpos */
390          complain_overflow_dont, /* complain_on_overflow */
391          _bfd_mips_elf_generic_reloc,   /* special_function */
392          "R_MIPS_64",           /* name */
393          TRUE,                  /* partial_inplace */
394          MINUS_ONE,             /* src_mask */
395          MINUS_ONE,             /* dst_mask */
396          FALSE),                /* pcrel_offset */
397
398   /* Displacement in the global offset table.  */
399   HOWTO (R_MIPS_GOT_DISP,       /* type */
400          0,                     /* rightshift */
401          2,                     /* size (0 = byte, 1 = short, 2 = long) */
402          16,                    /* bitsize */
403          FALSE,                 /* pc_relative */
404          0,                     /* bitpos */
405          complain_overflow_signed, /* complain_on_overflow */
406          _bfd_mips_elf_generic_reloc,   /* special_function */
407          "R_MIPS_GOT_DISP",     /* name */
408          TRUE,                  /* partial_inplace */
409          0x0000ffff,            /* src_mask */
410          0x0000ffff,            /* dst_mask */
411          FALSE),                /* pcrel_offset */
412
413   /* Displacement to page pointer in the global offset table.  */
414   HOWTO (R_MIPS_GOT_PAGE,       /* type */
415          0,                     /* rightshift */
416          2,                     /* size (0 = byte, 1 = short, 2 = long) */
417          16,                    /* bitsize */
418          FALSE,                 /* pc_relative */
419          0,                     /* bitpos */
420          complain_overflow_signed, /* complain_on_overflow */
421          _bfd_mips_elf_generic_reloc,   /* special_function */
422          "R_MIPS_GOT_PAGE",     /* name */
423          TRUE,                  /* partial_inplace */
424          0x0000ffff,            /* src_mask */
425          0x0000ffff,            /* dst_mask */
426          FALSE),                /* pcrel_offset */
427
428   /* Offset from page pointer in the global offset table.  */
429   HOWTO (R_MIPS_GOT_OFST,       /* type */
430          0,                     /* rightshift */
431          2,                     /* size (0 = byte, 1 = short, 2 = long) */
432          16,                    /* bitsize */
433          FALSE,                 /* pc_relative */
434          0,                     /* bitpos */
435          complain_overflow_signed, /* complain_on_overflow */
436          _bfd_mips_elf_generic_reloc,   /* special_function */
437          "R_MIPS_GOT_OFST",     /* name */
438          TRUE,                  /* partial_inplace */
439          0x0000ffff,            /* src_mask */
440          0x0000ffff,            /* dst_mask */
441          FALSE),                /* pcrel_offset */
442
443   /* High 16 bits of displacement in global offset table.  */
444   HOWTO (R_MIPS_GOT_HI16,       /* type */
445          0,                     /* rightshift */
446          2,                     /* size (0 = byte, 1 = short, 2 = long) */
447          16,                    /* bitsize */
448          FALSE,                 /* pc_relative */
449          0,                     /* bitpos */
450          complain_overflow_dont, /* complain_on_overflow */
451          _bfd_mips_elf_generic_reloc,   /* special_function */
452          "R_MIPS_GOT_HI16",     /* name */
453          TRUE,                  /* partial_inplace */
454          0x0000ffff,            /* src_mask */
455          0x0000ffff,            /* dst_mask */
456          FALSE),                /* pcrel_offset */
457
458   /* Low 16 bits of displacement in global offset table.  */
459   HOWTO (R_MIPS_GOT_LO16,       /* type */
460          0,                     /* rightshift */
461          2,                     /* size (0 = byte, 1 = short, 2 = long) */
462          16,                    /* bitsize */
463          FALSE,                 /* pc_relative */
464          0,                     /* bitpos */
465          complain_overflow_dont, /* complain_on_overflow */
466          _bfd_mips_elf_generic_reloc,   /* special_function */
467          "R_MIPS_GOT_LO16",     /* name */
468          TRUE,                  /* partial_inplace */
469          0x0000ffff,            /* src_mask */
470          0x0000ffff,            /* dst_mask */
471          FALSE),                /* pcrel_offset */
472
473   /* 64 bit subtraction.  */
474   HOWTO (R_MIPS_SUB,            /* type */
475          0,                     /* rightshift */
476          4,                     /* size (0 = byte, 1 = short, 2 = long) */
477          64,                    /* bitsize */
478          FALSE,                 /* pc_relative */
479          0,                     /* bitpos */
480          complain_overflow_dont, /* complain_on_overflow */
481          _bfd_mips_elf_generic_reloc,   /* special_function */
482          "R_MIPS_SUB",          /* name */
483          TRUE,                  /* partial_inplace */
484          MINUS_ONE,             /* src_mask */
485          MINUS_ONE,             /* dst_mask */
486          FALSE),                /* pcrel_offset */
487
488   /* Insert the addend as an instruction.  */
489   /* FIXME: Not handled correctly.  */
490   HOWTO (R_MIPS_INSERT_A,       /* type */
491          0,                     /* rightshift */
492          2,                     /* size (0 = byte, 1 = short, 2 = long) */
493          32,                    /* bitsize */
494          FALSE,                 /* pc_relative */
495          0,                     /* bitpos */
496          complain_overflow_dont, /* complain_on_overflow */
497          _bfd_mips_elf_generic_reloc,   /* special_function */
498          "R_MIPS_INSERT_A",     /* name */
499          TRUE,                  /* partial_inplace */
500          0xffffffff,            /* src_mask */
501          0xffffffff,            /* dst_mask */
502          FALSE),                /* pcrel_offset */
503
504   /* Insert the addend as an instruction, and change all relocations
505      to refer to the old instruction at the address.  */
506   /* FIXME: Not handled correctly.  */
507   HOWTO (R_MIPS_INSERT_B,       /* type */
508          0,                     /* rightshift */
509          2,                     /* size (0 = byte, 1 = short, 2 = long) */
510          32,                    /* bitsize */
511          FALSE,                 /* pc_relative */
512          0,                     /* bitpos */
513          complain_overflow_dont, /* complain_on_overflow */
514          _bfd_mips_elf_generic_reloc,   /* special_function */
515          "R_MIPS_INSERT_B",     /* name */
516          TRUE,                  /* partial_inplace */
517          0xffffffff,            /* src_mask */
518          0xffffffff,            /* dst_mask */
519          FALSE),                /* pcrel_offset */
520
521   /* Delete a 32 bit instruction.  */
522   /* FIXME: Not handled correctly.  */
523   HOWTO (R_MIPS_DELETE,         /* type */
524          0,                     /* rightshift */
525          2,                     /* size (0 = byte, 1 = short, 2 = long) */
526          32,                    /* bitsize */
527          FALSE,                 /* pc_relative */
528          0,                     /* bitpos */
529          complain_overflow_dont, /* complain_on_overflow */
530          _bfd_mips_elf_generic_reloc,   /* special_function */
531          "R_MIPS_DELETE",       /* name */
532          TRUE,                  /* partial_inplace */
533          0xffffffff,            /* src_mask */
534          0xffffffff,            /* dst_mask */
535          FALSE),                /* pcrel_offset */
536
537   /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
538      We don't, because
539        a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
540           R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
541           fallable heuristics.
542        b) No other NewABI toolchain actually emits such relocations.  */
543   EMPTY_HOWTO (R_MIPS_HIGHER),
544   EMPTY_HOWTO (R_MIPS_HIGHEST),
545
546   /* High 16 bits of displacement in global offset table.  */
547   HOWTO (R_MIPS_CALL_HI16,      /* type */
548          0,                     /* rightshift */
549          2,                     /* size (0 = byte, 1 = short, 2 = long) */
550          16,                    /* bitsize */
551          FALSE,                 /* pc_relative */
552          0,                     /* bitpos */
553          complain_overflow_dont, /* complain_on_overflow */
554          _bfd_mips_elf_generic_reloc,   /* special_function */
555          "R_MIPS_CALL_HI16",    /* name */
556          TRUE,                  /* partial_inplace */
557          0x0000ffff,            /* src_mask */
558          0x0000ffff,            /* dst_mask */
559          FALSE),                /* pcrel_offset */
560
561   /* Low 16 bits of displacement in global offset table.  */
562   HOWTO (R_MIPS_CALL_LO16,      /* type */
563          0,                     /* rightshift */
564          2,                     /* size (0 = byte, 1 = short, 2 = long) */
565          16,                    /* bitsize */
566          FALSE,                 /* pc_relative */
567          0,                     /* bitpos */
568          complain_overflow_dont, /* complain_on_overflow */
569          _bfd_mips_elf_generic_reloc,   /* special_function */
570          "R_MIPS_CALL_LO16",    /* name */
571          TRUE,                  /* partial_inplace */
572          0x0000ffff,            /* src_mask */
573          0x0000ffff,            /* dst_mask */
574          FALSE),                /* pcrel_offset */
575
576   /* Section displacement, used by an associated event location section.  */
577   HOWTO (R_MIPS_SCN_DISP,       /* type */
578          0,                     /* rightshift */
579          2,                     /* size (0 = byte, 1 = short, 2 = long) */
580          32,                    /* bitsize */
581          FALSE,                 /* pc_relative */
582          0,                     /* bitpos */
583          complain_overflow_dont, /* complain_on_overflow */
584          _bfd_mips_elf_generic_reloc,   /* special_function */
585          "R_MIPS_SCN_DISP",     /* name */
586          TRUE,                  /* partial_inplace */
587          0xffffffff,            /* src_mask */
588          0xffffffff,            /* dst_mask */
589          FALSE),                /* pcrel_offset */
590
591   HOWTO (R_MIPS_REL16,          /* type */
592          0,                     /* rightshift */
593          1,                     /* size (0 = byte, 1 = short, 2 = long) */
594          16,                    /* bitsize */
595          FALSE,                 /* pc_relative */
596          0,                     /* bitpos */
597          complain_overflow_signed, /* complain_on_overflow */
598          _bfd_mips_elf_generic_reloc,   /* special_function */
599          "R_MIPS_REL16",        /* name */
600          TRUE,                  /* partial_inplace */
601          0xffff,                /* src_mask */
602          0xffff,                /* dst_mask */
603          FALSE),                /* pcrel_offset */
604
605   /* These two are obsolete.  */
606   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
607   EMPTY_HOWTO (R_MIPS_PJUMP),
608
609   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
610      It must be used for multigot GOT's (and only there).  */
611   HOWTO (R_MIPS_RELGOT,         /* type */
612          0,                     /* rightshift */
613          2,                     /* size (0 = byte, 1 = short, 2 = long) */
614          32,                    /* bitsize */
615          FALSE,                 /* pc_relative */
616          0,                     /* bitpos */
617          complain_overflow_dont, /* complain_on_overflow */
618          _bfd_mips_elf_generic_reloc,   /* special_function */
619          "R_MIPS_RELGOT",       /* name */
620          TRUE,                  /* partial_inplace */
621          0xffffffff,            /* src_mask */
622          0xffffffff,            /* dst_mask */
623          FALSE),                /* pcrel_offset */
624
625   /* Protected jump conversion.  This is an optimization hint.  No
626      relocation is required for correctness.  */
627   HOWTO (R_MIPS_JALR,           /* type */
628          0,                     /* rightshift */
629          2,                     /* size (0 = byte, 1 = short, 2 = long) */
630          32,                    /* bitsize */
631          FALSE,                 /* pc_relative */
632          0,                     /* bitpos */
633          complain_overflow_dont, /* complain_on_overflow */
634          _bfd_mips_elf_generic_reloc,   /* special_function */
635          "R_MIPS_JALR",         /* name */
636          FALSE,                 /* partial_inplace */
637          0,                     /* src_mask */
638          0x00000000,            /* dst_mask */
639          FALSE),                /* pcrel_offset */
640
641   /* TLS relocations.  */
642   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
643   EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
644
645   HOWTO (R_MIPS_TLS_DTPMOD64,   /* type */
646          0,                     /* rightshift */
647          4,                     /* size (0 = byte, 1 = short, 2 = long) */
648          64,                    /* bitsize */
649          FALSE,                 /* pc_relative */
650          0,                     /* bitpos */
651          complain_overflow_dont, /* complain_on_overflow */
652          _bfd_mips_elf_generic_reloc, /* special_function */
653          "R_MIPS_TLS_DTPMOD64", /* name */
654          TRUE,                  /* partial_inplace */
655          MINUS_ONE,             /* src_mask */
656          MINUS_ONE,             /* dst_mask */
657          FALSE),                /* pcrel_offset */
658
659   HOWTO (R_MIPS_TLS_DTPREL64,   /* type */
660          0,                     /* rightshift */
661          4,                     /* size (0 = byte, 1 = short, 2 = long) */
662          64,                    /* bitsize */
663          FALSE,                 /* pc_relative */
664          0,                     /* bitpos */
665          complain_overflow_dont, /* complain_on_overflow */
666          _bfd_mips_elf_generic_reloc, /* special_function */
667          "R_MIPS_TLS_DTPREL64", /* name */
668          TRUE,                  /* partial_inplace */
669          MINUS_ONE,             /* src_mask */
670          MINUS_ONE,             /* dst_mask */
671          FALSE),                /* pcrel_offset */
672
673   /* TLS general dynamic variable reference.  */
674   HOWTO (R_MIPS_TLS_GD,         /* type */
675          0,                     /* rightshift */
676          2,                     /* size (0 = byte, 1 = short, 2 = long) */
677          16,                    /* bitsize */
678          FALSE,                 /* pc_relative */
679          0,                     /* bitpos */
680          complain_overflow_signed, /* complain_on_overflow */
681          _bfd_mips_elf_generic_reloc, /* special_function */
682          "R_MIPS_TLS_GD",       /* name */
683          TRUE,                  /* partial_inplace */
684          0x0000ffff,            /* src_mask */
685          0x0000ffff,            /* dst_mask */
686          FALSE),                /* pcrel_offset */
687
688   /* TLS local dynamic variable reference.  */
689   HOWTO (R_MIPS_TLS_LDM,        /* type */
690          0,                     /* rightshift */
691          2,                     /* size (0 = byte, 1 = short, 2 = long) */
692          16,                    /* bitsize */
693          FALSE,                 /* pc_relative */
694          0,                     /* bitpos */
695          complain_overflow_signed, /* complain_on_overflow */
696          _bfd_mips_elf_generic_reloc, /* special_function */
697          "R_MIPS_TLS_LDM",      /* name */
698          TRUE,                  /* partial_inplace */
699          0x0000ffff,            /* src_mask */
700          0x0000ffff,            /* dst_mask */
701          FALSE),                /* pcrel_offset */
702
703   /* TLS local dynamic offset.  */
704   HOWTO (R_MIPS_TLS_DTPREL_HI16,        /* type */
705          0,                     /* rightshift */
706          2,                     /* size (0 = byte, 1 = short, 2 = long) */
707          16,                    /* bitsize */
708          FALSE,                 /* pc_relative */
709          0,                     /* bitpos */
710          complain_overflow_signed, /* complain_on_overflow */
711          _bfd_mips_elf_generic_reloc, /* special_function */
712          "R_MIPS_TLS_DTPREL_HI16",      /* name */
713          TRUE,                  /* partial_inplace */
714          0x0000ffff,            /* src_mask */
715          0x0000ffff,            /* dst_mask */
716          FALSE),                /* pcrel_offset */
717
718   /* TLS local dynamic offset.  */
719   HOWTO (R_MIPS_TLS_DTPREL_LO16,        /* type */
720          0,                     /* rightshift */
721          2,                     /* size (0 = byte, 1 = short, 2 = long) */
722          16,                    /* bitsize */
723          FALSE,                 /* pc_relative */
724          0,                     /* bitpos */
725          complain_overflow_signed, /* complain_on_overflow */
726          _bfd_mips_elf_generic_reloc, /* special_function */
727          "R_MIPS_TLS_DTPREL_LO16",      /* name */
728          TRUE,                  /* partial_inplace */
729          0x0000ffff,            /* src_mask */
730          0x0000ffff,            /* dst_mask */
731          FALSE),                /* pcrel_offset */
732
733   /* TLS thread pointer offset.  */
734   HOWTO (R_MIPS_TLS_GOTTPREL,   /* type */
735          0,                     /* rightshift */
736          2,                     /* size (0 = byte, 1 = short, 2 = long) */
737          16,                    /* bitsize */
738          FALSE,                 /* pc_relative */
739          0,                     /* bitpos */
740          complain_overflow_signed, /* complain_on_overflow */
741          _bfd_mips_elf_generic_reloc, /* special_function */
742          "R_MIPS_TLS_GOTTPREL", /* name */
743          TRUE,                  /* partial_inplace */
744          0x0000ffff,            /* src_mask */
745          0x0000ffff,            /* dst_mask */
746          FALSE),                /* pcrel_offset */
747
748   /* TLS IE dynamic relocations.  */
749   EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
750
751   HOWTO (R_MIPS_TLS_TPREL64,    /* type */
752          0,                     /* rightshift */
753          4,                     /* size (0 = byte, 1 = short, 2 = long) */
754          64,                    /* bitsize */
755          FALSE,                 /* pc_relative */
756          0,                     /* bitpos */
757          complain_overflow_dont, /* complain_on_overflow */
758          _bfd_mips_elf_generic_reloc, /* special_function */
759          "R_MIPS_TLS_TPREL64",  /* name */
760          TRUE,                  /* partial_inplace */
761          MINUS_ONE,             /* src_mask */
762          MINUS_ONE,             /* dst_mask */
763          FALSE),                /* pcrel_offset */
764
765   /* TLS thread pointer offset.  */
766   HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
767          0,                     /* rightshift */
768          2,                     /* size (0 = byte, 1 = short, 2 = long) */
769          16,                    /* bitsize */
770          FALSE,                 /* pc_relative */
771          0,                     /* bitpos */
772          complain_overflow_signed, /* complain_on_overflow */
773          _bfd_mips_elf_generic_reloc, /* special_function */
774          "R_MIPS_TLS_TPREL_HI16", /* name */
775          TRUE,                  /* partial_inplace */
776          0x0000ffff,            /* src_mask */
777          0x0000ffff,            /* dst_mask */
778          FALSE),                /* pcrel_offset */
779
780   /* TLS thread pointer offset.  */
781   HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
782          0,                     /* rightshift */
783          2,                     /* size (0 = byte, 1 = short, 2 = long) */
784          16,                    /* bitsize */
785          FALSE,                 /* pc_relative */
786          0,                     /* bitpos */
787          complain_overflow_signed, /* complain_on_overflow */
788          _bfd_mips_elf_generic_reloc, /* special_function */
789          "R_MIPS_TLS_TPREL_LO16", /* name */
790          TRUE,                  /* partial_inplace */
791          0x0000ffff,            /* src_mask */
792          0x0000ffff,            /* dst_mask */
793          FALSE),                /* pcrel_offset */
794 };
795
796 /* The relocation table used for SHT_RELA sections.  */
797
798 static reloc_howto_type mips_elf64_howto_table_rela[] =
799 {
800   /* No relocation.  */
801   HOWTO (R_MIPS_NONE,           /* type */
802          0,                     /* rightshift */
803          0,                     /* size (0 = byte, 1 = short, 2 = long) */
804          0,                     /* bitsize */
805          FALSE,                 /* pc_relative */
806          0,                     /* bitpos */
807          complain_overflow_dont, /* complain_on_overflow */
808          _bfd_mips_elf_generic_reloc,   /* special_function */
809          "R_MIPS_NONE",         /* name */
810          FALSE,                 /* partial_inplace */
811          0,                     /* src_mask */
812          0,                     /* dst_mask */
813          FALSE),                /* pcrel_offset */
814
815   /* 16 bit relocation.  */
816   HOWTO (R_MIPS_16,             /* type */
817          0,                     /* rightshift */
818          2,                     /* size (0 = byte, 1 = short, 2 = long) */
819          16,                    /* bitsize */
820          FALSE,                 /* pc_relative */
821          0,                     /* bitpos */
822          complain_overflow_signed, /* complain_on_overflow */
823          _bfd_mips_elf_generic_reloc,   /* special_function */
824          "R_MIPS_16",           /* name */
825          FALSE,                 /* partial_inplace */
826          0,                     /* src_mask */
827          0x0000ffff,            /* dst_mask */
828          FALSE),                /* pcrel_offset */
829
830   /* 32 bit relocation.  */
831   HOWTO (R_MIPS_32,             /* type */
832          0,                     /* rightshift */
833          2,                     /* size (0 = byte, 1 = short, 2 = long) */
834          32,                    /* bitsize */
835          FALSE,                 /* pc_relative */
836          0,                     /* bitpos */
837          complain_overflow_dont, /* complain_on_overflow */
838          _bfd_mips_elf_generic_reloc,   /* special_function */
839          "R_MIPS_32",           /* name */
840          FALSE,                 /* partial_inplace */
841          0,                     /* src_mask */
842          0xffffffff,            /* dst_mask */
843          FALSE),                /* pcrel_offset */
844
845   /* 32 bit symbol relative relocation.  */
846   HOWTO (R_MIPS_REL32,          /* type */
847          0,                     /* rightshift */
848          2,                     /* size (0 = byte, 1 = short, 2 = long) */
849          32,                    /* bitsize */
850          FALSE,                 /* pc_relative */
851          0,                     /* bitpos */
852          complain_overflow_dont, /* complain_on_overflow */
853          _bfd_mips_elf_generic_reloc,   /* special_function */
854          "R_MIPS_REL32",        /* name */
855          FALSE,                 /* partial_inplace */
856          0,                     /* src_mask */
857          0xffffffff,            /* dst_mask */
858          FALSE),                /* pcrel_offset */
859
860   /* 26 bit jump address.  */
861   HOWTO (R_MIPS_26,             /* type */
862          2,                     /* rightshift */
863          2,                     /* size (0 = byte, 1 = short, 2 = long) */
864          26,                    /* bitsize */
865          FALSE,                 /* pc_relative */
866          0,                     /* bitpos */
867          complain_overflow_dont, /* complain_on_overflow */
868                                 /* This needs complex overflow
869                                    detection, because the upper 36
870                                    bits must match the PC + 4.  */
871          _bfd_mips_elf_generic_reloc,   /* special_function */
872          "R_MIPS_26",           /* name */
873          FALSE,                 /* partial_inplace */
874          0,                     /* src_mask */
875          0x03ffffff,            /* dst_mask */
876          FALSE),                /* pcrel_offset */
877
878   /* High 16 bits of symbol value.  */
879   HOWTO (R_MIPS_HI16,           /* type */
880          0,                     /* rightshift */
881          2,                     /* size (0 = byte, 1 = short, 2 = long) */
882          16,                    /* bitsize */
883          FALSE,                 /* pc_relative */
884          0,                     /* bitpos */
885          complain_overflow_dont, /* complain_on_overflow */
886          _bfd_mips_elf_generic_reloc,   /* special_function */
887          "R_MIPS_HI16",         /* name */
888          FALSE,                 /* partial_inplace */
889          0,                     /* src_mask */
890          0x0000ffff,            /* dst_mask */
891          FALSE),                /* pcrel_offset */
892
893   /* Low 16 bits of symbol value.  */
894   HOWTO (R_MIPS_LO16,           /* type */
895          0,                     /* rightshift */
896          2,                     /* size (0 = byte, 1 = short, 2 = long) */
897          16,                    /* bitsize */
898          FALSE,                 /* pc_relative */
899          0,                     /* bitpos */
900          complain_overflow_dont, /* complain_on_overflow */
901          _bfd_mips_elf_generic_reloc,   /* special_function */
902          "R_MIPS_LO16",         /* name */
903          FALSE,                 /* partial_inplace */
904          0,                     /* src_mask */
905          0x0000ffff,            /* dst_mask */
906          FALSE),                /* pcrel_offset */
907
908   /* GP relative reference.  */
909   HOWTO (R_MIPS_GPREL16,        /* type */
910          0,                     /* rightshift */
911          2,                     /* size (0 = byte, 1 = short, 2 = long) */
912          16,                    /* bitsize */
913          FALSE,                 /* pc_relative */
914          0,                     /* bitpos */
915          complain_overflow_signed, /* complain_on_overflow */
916          mips_elf64_gprel16_reloc, /* special_function */
917          "R_MIPS_GPREL16",      /* name */
918          FALSE,                 /* partial_inplace */
919          0,                     /* src_mask */
920          0x0000ffff,            /* dst_mask */
921          FALSE),                /* pcrel_offset */
922
923   /* Reference to literal section.  */
924   HOWTO (R_MIPS_LITERAL,        /* type */
925          0,                     /* rightshift */
926          2,                     /* size (0 = byte, 1 = short, 2 = long) */
927          16,                    /* bitsize */
928          FALSE,                 /* pc_relative */
929          0,                     /* bitpos */
930          complain_overflow_signed, /* complain_on_overflow */
931          mips_elf64_literal_reloc, /* special_function */
932          "R_MIPS_LITERAL",      /* name */
933          FALSE,                 /* partial_inplace */
934          0,                     /* src_mask */
935          0x0000ffff,            /* dst_mask */
936          FALSE),                /* pcrel_offset */
937
938   /* Reference to global offset table.  */
939   HOWTO (R_MIPS_GOT16,          /* type */
940          0,                     /* rightshift */
941          2,                     /* size (0 = byte, 1 = short, 2 = long) */
942          16,                    /* bitsize */
943          FALSE,                 /* pc_relative */
944          0,                     /* bitpos */
945          complain_overflow_signed, /* complain_on_overflow */
946          _bfd_mips_elf_generic_reloc, /* special_function */
947          "R_MIPS_GOT16",        /* name */
948          FALSE,                 /* partial_inplace */
949          0,                     /* src_mask */
950          0x0000ffff,            /* dst_mask */
951          FALSE),                /* pcrel_offset */
952
953   /* 16 bit PC relative reference.  Note that the ABI document has a typo
954      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
955      We do the right thing here.  */
956   HOWTO (R_MIPS_PC16,           /* type */
957          2,                     /* rightshift */
958          2,                     /* size (0 = byte, 1 = short, 2 = long) */
959          16,                    /* bitsize */
960          TRUE,                  /* pc_relative */
961          0,                     /* bitpos */
962          complain_overflow_signed, /* complain_on_overflow */
963          _bfd_mips_elf_generic_reloc,   /* special_function */
964          "R_MIPS_PC16",         /* name */
965          FALSE,                 /* partial_inplace */
966          0,                     /* src_mask */
967          0x0000ffff,            /* dst_mask */
968          TRUE),                 /* pcrel_offset */
969
970   /* 16 bit call through global offset table.  */
971   HOWTO (R_MIPS_CALL16,         /* type */
972          0,                     /* rightshift */
973          2,                     /* size (0 = byte, 1 = short, 2 = long) */
974          16,                    /* bitsize */
975          FALSE,                 /* pc_relative */
976          0,                     /* bitpos */
977          complain_overflow_signed, /* complain_on_overflow */
978          _bfd_mips_elf_generic_reloc,   /* special_function */
979          "R_MIPS_CALL16",       /* name */
980          FALSE,                 /* partial_inplace */
981          0,                     /* src_mask */
982          0x0000ffff,            /* dst_mask */
983          FALSE),                /* pcrel_offset */
984
985   /* 32 bit GP relative reference.  */
986   HOWTO (R_MIPS_GPREL32,        /* type */
987          0,                     /* rightshift */
988          2,                     /* size (0 = byte, 1 = short, 2 = long) */
989          32,                    /* bitsize */
990          FALSE,                 /* pc_relative */
991          0,                     /* bitpos */
992          complain_overflow_dont, /* complain_on_overflow */
993          mips_elf64_gprel32_reloc, /* special_function */
994          "R_MIPS_GPREL32",      /* name */
995          FALSE,                 /* partial_inplace */
996          0,                     /* src_mask */
997          0xffffffff,            /* dst_mask */
998          FALSE),                /* pcrel_offset */
999
1000   EMPTY_HOWTO (13),
1001   EMPTY_HOWTO (14),
1002   EMPTY_HOWTO (15),
1003
1004   /* A 5 bit shift field.  */
1005   HOWTO (R_MIPS_SHIFT5,         /* type */
1006          0,                     /* rightshift */
1007          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1008          5,                     /* bitsize */
1009          FALSE,                 /* pc_relative */
1010          6,                     /* bitpos */
1011          complain_overflow_bitfield, /* complain_on_overflow */
1012          _bfd_mips_elf_generic_reloc,   /* special_function */
1013          "R_MIPS_SHIFT5",       /* name */
1014          FALSE,                 /* partial_inplace */
1015          0,                     /* src_mask */
1016          0x000007c0,            /* dst_mask */
1017          FALSE),                /* pcrel_offset */
1018
1019   /* A 6 bit shift field.  */
1020   HOWTO (R_MIPS_SHIFT6,         /* type */
1021          0,                     /* rightshift */
1022          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1023          6,                     /* bitsize */
1024          FALSE,                 /* pc_relative */
1025          6,                     /* bitpos */
1026          complain_overflow_bitfield, /* complain_on_overflow */
1027          mips_elf64_shift6_reloc, /* special_function */
1028          "R_MIPS_SHIFT6",       /* name */
1029          FALSE,                 /* partial_inplace */
1030          0,                     /* src_mask */
1031          0x000007c4,            /* dst_mask */
1032          FALSE),                /* pcrel_offset */
1033
1034   /* 64 bit relocation.  */
1035   HOWTO (R_MIPS_64,             /* type */
1036          0,                     /* rightshift */
1037          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1038          64,                    /* bitsize */
1039          FALSE,                 /* pc_relative */
1040          0,                     /* bitpos */
1041          complain_overflow_dont, /* complain_on_overflow */
1042          _bfd_mips_elf_generic_reloc,   /* special_function */
1043          "R_MIPS_64",           /* name */
1044          FALSE,                 /* partial_inplace */
1045          0,                     /* src_mask */
1046          MINUS_ONE,             /* dst_mask */
1047          FALSE),                /* pcrel_offset */
1048
1049   /* Displacement in the global offset table.  */
1050   HOWTO (R_MIPS_GOT_DISP,       /* type */
1051          0,                     /* rightshift */
1052          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1053          16,                    /* bitsize */
1054          FALSE,                 /* pc_relative */
1055          0,                     /* bitpos */
1056          complain_overflow_signed, /* complain_on_overflow */
1057          _bfd_mips_elf_generic_reloc,   /* special_function */
1058          "R_MIPS_GOT_DISP",     /* name */
1059          FALSE,                 /* partial_inplace */
1060          0,                     /* src_mask */
1061          0x0000ffff,            /* dst_mask */
1062          FALSE),                /* pcrel_offset */
1063
1064   /* Displacement to page pointer in the global offset table.  */
1065   HOWTO (R_MIPS_GOT_PAGE,       /* type */
1066          0,                     /* rightshift */
1067          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1068          16,                    /* bitsize */
1069          FALSE,                 /* pc_relative */
1070          0,                     /* bitpos */
1071          complain_overflow_signed, /* complain_on_overflow */
1072          _bfd_mips_elf_generic_reloc,   /* special_function */
1073          "R_MIPS_GOT_PAGE",     /* name */
1074          FALSE,                 /* partial_inplace */
1075          0,                     /* src_mask */
1076          0x0000ffff,            /* dst_mask */
1077          FALSE),                /* pcrel_offset */
1078
1079   /* Offset from page pointer in the global offset table.  */
1080   HOWTO (R_MIPS_GOT_OFST,       /* type */
1081          0,                     /* rightshift */
1082          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1083          16,                    /* bitsize */
1084          FALSE,                 /* pc_relative */
1085          0,                     /* bitpos */
1086          complain_overflow_signed, /* complain_on_overflow */
1087          _bfd_mips_elf_generic_reloc,   /* special_function */
1088          "R_MIPS_GOT_OFST",     /* name */
1089          FALSE,                 /* partial_inplace */
1090          0,                     /* src_mask */
1091          0x0000ffff,            /* dst_mask */
1092          FALSE),                /* pcrel_offset */
1093
1094   /* High 16 bits of displacement in global offset table.  */
1095   HOWTO (R_MIPS_GOT_HI16,       /* type */
1096          0,                     /* rightshift */
1097          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1098          16,                    /* bitsize */
1099          FALSE,                 /* pc_relative */
1100          0,                     /* bitpos */
1101          complain_overflow_dont, /* complain_on_overflow */
1102          _bfd_mips_elf_generic_reloc,   /* special_function */
1103          "R_MIPS_GOT_HI16",     /* name */
1104          FALSE,                 /* partial_inplace */
1105          0,                     /* src_mask */
1106          0x0000ffff,            /* dst_mask */
1107          FALSE),                /* pcrel_offset */
1108
1109   /* Low 16 bits of displacement in global offset table.  */
1110   HOWTO (R_MIPS_GOT_LO16,       /* type */
1111          0,                     /* rightshift */
1112          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1113          16,                    /* bitsize */
1114          FALSE,                 /* pc_relative */
1115          0,                     /* bitpos */
1116          complain_overflow_dont, /* complain_on_overflow */
1117          _bfd_mips_elf_generic_reloc,   /* special_function */
1118          "R_MIPS_GOT_LO16",     /* name */
1119          FALSE,                 /* partial_inplace */
1120          0,                     /* src_mask */
1121          0x0000ffff,            /* dst_mask */
1122          FALSE),                /* pcrel_offset */
1123
1124   /* 64 bit subtraction.  */
1125   HOWTO (R_MIPS_SUB,            /* type */
1126          0,                     /* rightshift */
1127          4,                     /* size (0 = byte, 1 = short, 2 = long) */
1128          64,                    /* bitsize */
1129          FALSE,                 /* pc_relative */
1130          0,                     /* bitpos */
1131          complain_overflow_dont, /* complain_on_overflow */
1132          _bfd_mips_elf_generic_reloc,   /* special_function */
1133          "R_MIPS_SUB",          /* name */
1134          FALSE,                 /* partial_inplace */
1135          0,                     /* src_mask */
1136          MINUS_ONE,             /* dst_mask */
1137          FALSE),                /* pcrel_offset */
1138
1139   /* Insert the addend as an instruction.  */
1140   /* FIXME: Not handled correctly.  */
1141   HOWTO (R_MIPS_INSERT_A,       /* type */
1142          0,                     /* rightshift */
1143          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1144          32,                    /* 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_INSERT_A",     /* name */
1150          FALSE,                 /* partial_inplace */
1151          0,                     /* src_mask */
1152          0xffffffff,            /* dst_mask */
1153          FALSE),                /* pcrel_offset */
1154
1155   /* Insert the addend as an instruction, and change all relocations
1156      to refer to the old instruction at the address.  */
1157   /* FIXME: Not handled correctly.  */
1158   HOWTO (R_MIPS_INSERT_B,       /* type */
1159          0,                     /* rightshift */
1160          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1161          32,                    /* bitsize */
1162          FALSE,                 /* pc_relative */
1163          0,                     /* bitpos */
1164          complain_overflow_dont, /* complain_on_overflow */
1165          _bfd_mips_elf_generic_reloc,   /* special_function */
1166          "R_MIPS_INSERT_B",     /* name */
1167          FALSE,                 /* partial_inplace */
1168          0,                     /* src_mask */
1169          0xffffffff,            /* dst_mask */
1170          FALSE),                /* pcrel_offset */
1171
1172   /* Delete a 32 bit instruction.  */
1173   /* FIXME: Not handled correctly.  */
1174   HOWTO (R_MIPS_DELETE,         /* 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_DELETE",       /* name */
1183          FALSE,                 /* partial_inplace */
1184          0,                     /* src_mask */
1185          0xffffffff,            /* dst_mask */
1186          FALSE),                /* pcrel_offset */
1187
1188   /* Get the higher value of a 64 bit addend.  */
1189   HOWTO (R_MIPS_HIGHER,         /* type */
1190          0,                     /* rightshift */
1191          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1192          16,                    /* bitsize */
1193          FALSE,                 /* pc_relative */
1194          0,                     /* bitpos */
1195          complain_overflow_dont, /* complain_on_overflow */
1196          _bfd_mips_elf_generic_reloc, /* special_function */
1197          "R_MIPS_HIGHER",       /* name */
1198          FALSE,                 /* partial_inplace */
1199          0,                     /* src_mask */
1200          0x0000ffff,            /* dst_mask */
1201          FALSE),                /* pcrel_offset */
1202
1203   /* Get the highest value of a 64 bit addend.  */
1204   HOWTO (R_MIPS_HIGHEST,        /* type */
1205          0,                     /* rightshift */
1206          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1207          16,                    /* bitsize */
1208          FALSE,                 /* pc_relative */
1209          0,                     /* bitpos */
1210          complain_overflow_dont, /* complain_on_overflow */
1211          _bfd_mips_elf_generic_reloc, /* special_function */
1212          "R_MIPS_HIGHEST",      /* name */
1213          FALSE,                 /* partial_inplace */
1214          0,                     /* src_mask */
1215          0x0000ffff,            /* dst_mask */
1216          FALSE),                /* pcrel_offset */
1217
1218   /* High 16 bits of displacement in global offset table.  */
1219   HOWTO (R_MIPS_CALL_HI16,      /* type */
1220          0,                     /* rightshift */
1221          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1222          16,                    /* bitsize */
1223          FALSE,                 /* pc_relative */
1224          0,                     /* bitpos */
1225          complain_overflow_dont, /* complain_on_overflow */
1226          _bfd_mips_elf_generic_reloc,   /* special_function */
1227          "R_MIPS_CALL_HI16",    /* name */
1228          FALSE,                 /* partial_inplace */
1229          0,                     /* src_mask */
1230          0x0000ffff,            /* dst_mask */
1231          FALSE),                /* pcrel_offset */
1232
1233   /* Low 16 bits of displacement in global offset table.  */
1234   HOWTO (R_MIPS_CALL_LO16,      /* type */
1235          0,                     /* rightshift */
1236          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1237          16,                    /* bitsize */
1238          FALSE,                 /* pc_relative */
1239          0,                     /* bitpos */
1240          complain_overflow_dont, /* complain_on_overflow */
1241          _bfd_mips_elf_generic_reloc,   /* special_function */
1242          "R_MIPS_CALL_LO16",    /* name */
1243          FALSE,                 /* partial_inplace */
1244          0,                     /* src_mask */
1245          0x0000ffff,            /* dst_mask */
1246          FALSE),                /* pcrel_offset */
1247
1248   /* Section displacement, used by an associated event location section.  */
1249   HOWTO (R_MIPS_SCN_DISP,       /* type */
1250          0,                     /* rightshift */
1251          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1252          32,                    /* bitsize */
1253          FALSE,                 /* pc_relative */
1254          0,                     /* bitpos */
1255          complain_overflow_dont, /* complain_on_overflow */
1256          _bfd_mips_elf_generic_reloc,   /* special_function */
1257          "R_MIPS_SCN_DISP",     /* name */
1258          FALSE,                 /* partial_inplace */
1259          0,                     /* src_mask */
1260          0xffffffff,            /* dst_mask */
1261          FALSE),                /* pcrel_offset */
1262
1263   HOWTO (R_MIPS_REL16,          /* type */
1264          0,                     /* rightshift */
1265          1,                     /* size (0 = byte, 1 = short, 2 = long) */
1266          16,                    /* bitsize */
1267          FALSE,                 /* pc_relative */
1268          0,                     /* bitpos */
1269          complain_overflow_signed, /* complain_on_overflow */
1270          _bfd_mips_elf_generic_reloc,   /* special_function */
1271          "R_MIPS_REL16",        /* name */
1272          FALSE,                 /* partial_inplace */
1273          0,                     /* src_mask */
1274          0xffff,                /* dst_mask */
1275          FALSE),                /* pcrel_offset */
1276
1277   /* These two are obsolete.  */
1278   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1279   EMPTY_HOWTO (R_MIPS_PJUMP),
1280
1281   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
1282      It must be used for multigot GOT's (and only there).  */
1283   HOWTO (R_MIPS_RELGOT,         /* type */
1284          0,                     /* rightshift */
1285          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1286          32,                    /* bitsize */
1287          FALSE,                 /* pc_relative */
1288          0,                     /* bitpos */
1289          complain_overflow_dont, /* complain_on_overflow */
1290          _bfd_mips_elf_generic_reloc,   /* special_function */
1291          "R_MIPS_RELGOT",       /* name */
1292          FALSE,                 /* partial_inplace */
1293          0,                     /* src_mask */
1294          0xffffffff,            /* dst_mask */
1295          FALSE),                /* pcrel_offset */
1296
1297   /* Protected jump conversion.  This is an optimization hint.  No
1298      relocation is required for correctness.  */
1299   HOWTO (R_MIPS_JALR,           /* 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_JALR",         /* name */
1308          FALSE,                 /* partial_inplace */
1309          0,                     /* src_mask */
1310          0x00000000,            /* dst_mask */
1311          FALSE),                /* pcrel_offset */
1312
1313   /* TLS relocations.  */
1314   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
1315   EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
1316   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
1317   EMPTY_HOWTO (R_MIPS_TLS_DTPREL64),
1318
1319   /* TLS general dynamic variable reference.  */
1320   HOWTO (R_MIPS_TLS_GD,         /* type */
1321          0,                     /* rightshift */
1322          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1323          16,                    /* bitsize */
1324          FALSE,                 /* pc_relative */
1325          0,                     /* bitpos */
1326          complain_overflow_signed, /* complain_on_overflow */
1327          _bfd_mips_elf_generic_reloc, /* special_function */
1328          "R_MIPS_TLS_GD",       /* name */
1329          TRUE,                  /* partial_inplace */
1330          0x0000ffff,            /* src_mask */
1331          0x0000ffff,            /* dst_mask */
1332          FALSE),                /* pcrel_offset */
1333
1334   /* TLS local dynamic variable reference.  */
1335   HOWTO (R_MIPS_TLS_LDM,        /* type */
1336          0,                     /* rightshift */
1337          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1338          16,                    /* bitsize */
1339          FALSE,                 /* pc_relative */
1340          0,                     /* bitpos */
1341          complain_overflow_signed, /* complain_on_overflow */
1342          _bfd_mips_elf_generic_reloc, /* special_function */
1343          "R_MIPS_TLS_LDM",      /* name */
1344          TRUE,                  /* partial_inplace */
1345          0x0000ffff,            /* src_mask */
1346          0x0000ffff,            /* dst_mask */
1347          FALSE),                /* pcrel_offset */
1348
1349   /* TLS local dynamic offset.  */
1350   HOWTO (R_MIPS_TLS_DTPREL_HI16,        /* type */
1351          0,                     /* rightshift */
1352          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1353          16,                    /* bitsize */
1354          FALSE,                 /* pc_relative */
1355          0,                     /* bitpos */
1356          complain_overflow_signed, /* complain_on_overflow */
1357          _bfd_mips_elf_generic_reloc, /* special_function */
1358          "R_MIPS_TLS_DTPREL_HI16",      /* name */
1359          TRUE,                  /* partial_inplace */
1360          0x0000ffff,            /* src_mask */
1361          0x0000ffff,            /* dst_mask */
1362          FALSE),                /* pcrel_offset */
1363
1364   /* TLS local dynamic offset.  */
1365   HOWTO (R_MIPS_TLS_DTPREL_LO16,        /* type */
1366          0,                     /* rightshift */
1367          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1368          16,                    /* bitsize */
1369          FALSE,                 /* pc_relative */
1370          0,                     /* bitpos */
1371          complain_overflow_signed, /* complain_on_overflow */
1372          _bfd_mips_elf_generic_reloc, /* special_function */
1373          "R_MIPS_TLS_DTPREL_LO16",      /* name */
1374          TRUE,                  /* partial_inplace */
1375          0x0000ffff,            /* src_mask */
1376          0x0000ffff,            /* dst_mask */
1377          FALSE),                /* pcrel_offset */
1378
1379   /* TLS thread pointer offset.  */
1380   HOWTO (R_MIPS_TLS_GOTTPREL,   /* type */
1381          0,                     /* rightshift */
1382          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1383          16,                    /* bitsize */
1384          FALSE,                 /* pc_relative */
1385          0,                     /* bitpos */
1386          complain_overflow_signed, /* complain_on_overflow */
1387          _bfd_mips_elf_generic_reloc, /* special_function */
1388          "R_MIPS_TLS_GOTTPREL", /* name */
1389          TRUE,                  /* partial_inplace */
1390          0x0000ffff,            /* src_mask */
1391          0x0000ffff,            /* dst_mask */
1392          FALSE),                /* pcrel_offset */
1393
1394   EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
1395   EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
1396
1397   /* TLS thread pointer offset.  */
1398   HOWTO (R_MIPS_TLS_TPREL_HI16, /* type */
1399          0,                     /* rightshift */
1400          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1401          16,                    /* bitsize */
1402          FALSE,                 /* pc_relative */
1403          0,                     /* bitpos */
1404          complain_overflow_signed, /* complain_on_overflow */
1405          _bfd_mips_elf_generic_reloc, /* special_function */
1406          "R_MIPS_TLS_TPREL_HI16", /* name */
1407          TRUE,                  /* partial_inplace */
1408          0x0000ffff,            /* src_mask */
1409          0x0000ffff,            /* dst_mask */
1410          FALSE),                /* pcrel_offset */
1411
1412   /* TLS thread pointer offset.  */
1413   HOWTO (R_MIPS_TLS_TPREL_LO16, /* type */
1414          0,                     /* rightshift */
1415          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1416          16,                    /* bitsize */
1417          FALSE,                 /* pc_relative */
1418          0,                     /* bitpos */
1419          complain_overflow_signed, /* complain_on_overflow */
1420          _bfd_mips_elf_generic_reloc, /* special_function */
1421          "R_MIPS_TLS_TPREL_LO16", /* name */
1422          TRUE,                  /* partial_inplace */
1423          0x0000ffff,            /* src_mask */
1424          0x0000ffff,            /* dst_mask */
1425          FALSE),                /* pcrel_offset */
1426 };
1427
1428 static reloc_howto_type mips16_elf64_howto_table_rel[] =
1429 {
1430   /* The reloc used for the mips16 jump instruction.  */
1431   HOWTO (R_MIPS16_26,           /* type */
1432          2,                     /* rightshift */
1433          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1434          26,                    /* bitsize */
1435          FALSE,                 /* pc_relative */
1436          0,                     /* bitpos */
1437          complain_overflow_dont, /* complain_on_overflow */
1438                                 /* This needs complex overflow
1439                                    detection, because the upper four
1440                                    bits must match the PC.  */
1441          mips16_jump_reloc,     /* special_function */
1442          "R_MIPS16_26",         /* name */
1443          TRUE,                  /* partial_inplace */
1444          0x3ffffff,             /* src_mask */
1445          0x3ffffff,             /* dst_mask */
1446          FALSE),                /* pcrel_offset */
1447
1448   /* The reloc used for the mips16 gprel instruction.  */
1449   HOWTO (R_MIPS16_GPREL,        /* type */
1450          0,                     /* rightshift */
1451          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1452          16,                    /* bitsize */
1453          FALSE,                 /* pc_relative */
1454          0,                     /* bitpos */
1455          complain_overflow_signed, /* complain_on_overflow */
1456          mips16_gprel_reloc,    /* special_function */
1457          "R_MIPS16_GPREL",      /* name */
1458          TRUE,                  /* partial_inplace */
1459          0x0000ffff,            /* src_mask */
1460          0x0000ffff,            /* dst_mask */
1461          FALSE),                /* pcrel_offset */
1462
1463   /* A placeholder for MIPS16 reference to global offset table.  */
1464   EMPTY_HOWTO (R_MIPS16_GOT16),
1465
1466   /* A placeholder for MIPS16 16 bit call through global offset table.  */
1467   EMPTY_HOWTO (R_MIPS16_CALL16),
1468
1469   /* MIPS16 high 16 bits of symbol value.  */
1470   HOWTO (R_MIPS16_HI16,         /* type */
1471          16,                    /* rightshift */
1472          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1473          16,                    /* bitsize */
1474          FALSE,                 /* pc_relative */
1475          0,                     /* bitpos */
1476          complain_overflow_dont, /* complain_on_overflow */
1477          _bfd_mips_elf_hi16_reloc, /* special_function */
1478          "R_MIPS16_HI16",       /* name */
1479          TRUE,                  /* partial_inplace */
1480          0x0000ffff,            /* src_mask */
1481          0x0000ffff,            /* dst_mask */
1482          FALSE),                /* pcrel_offset */
1483
1484   /* MIPS16 low 16 bits of symbol value.  */
1485   HOWTO (R_MIPS16_LO16,         /* type */
1486          0,                     /* rightshift */
1487          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1488          16,                    /* bitsize */
1489          FALSE,                 /* pc_relative */
1490          0,                     /* bitpos */
1491          complain_overflow_dont, /* complain_on_overflow */
1492          _bfd_mips_elf_lo16_reloc, /* special_function */
1493          "R_MIPS16_LO16",       /* name */
1494          TRUE,                  /* partial_inplace */
1495          0x0000ffff,            /* src_mask */
1496          0x0000ffff,            /* dst_mask */
1497          FALSE),                /* pcrel_offset */
1498 };
1499
1500 static reloc_howto_type mips16_elf64_howto_table_rela[] =
1501 {
1502   /* The reloc used for the mips16 jump instruction.  */
1503   HOWTO (R_MIPS16_26,           /* type */
1504          2,                     /* rightshift */
1505          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1506          26,                    /* bitsize */
1507          FALSE,                 /* pc_relative */
1508          0,                     /* bitpos */
1509          complain_overflow_dont, /* complain_on_overflow */
1510                                 /* This needs complex overflow
1511                                    detection, because the upper four
1512                                    bits must match the PC.  */
1513          mips16_jump_reloc,     /* special_function */
1514          "R_MIPS16_26",         /* name */
1515          FALSE,                 /* partial_inplace */
1516          0x3ffffff,             /* src_mask */
1517          0x3ffffff,             /* dst_mask */
1518          FALSE),                /* pcrel_offset */
1519
1520   /* The reloc used for the mips16 gprel instruction.  */
1521   HOWTO (R_MIPS16_GPREL,        /* type */
1522          0,                     /* rightshift */
1523          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1524          16,                    /* bitsize */
1525          FALSE,                 /* pc_relative */
1526          0,                     /* bitpos */
1527          complain_overflow_signed, /* complain_on_overflow */
1528          mips16_gprel_reloc,    /* special_function */
1529          "R_MIPS16_GPREL",      /* name */
1530          FALSE,                 /* partial_inplace */
1531          0x0000ffff,            /* src_mask */
1532          0x0000ffff,            /* dst_mask */
1533          FALSE),                /* pcrel_offset */
1534
1535   /* A placeholder for MIPS16 reference to global offset table.  */
1536   EMPTY_HOWTO (R_MIPS16_GOT16),
1537
1538   /* A placeholder for MIPS16 16 bit call through global offset table.  */
1539   EMPTY_HOWTO (R_MIPS16_CALL16),
1540
1541   /* MIPS16 high 16 bits of symbol value.  */
1542   HOWTO (R_MIPS16_HI16,         /* type */
1543          16,                    /* rightshift */
1544          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1545          16,                    /* bitsize */
1546          FALSE,                 /* pc_relative */
1547          0,                     /* bitpos */
1548          complain_overflow_dont, /* complain_on_overflow */
1549          _bfd_mips_elf_hi16_reloc, /* special_function */
1550          "R_MIPS16_HI16",       /* name */
1551          FALSE,                 /* partial_inplace */
1552          0x0000ffff,            /* src_mask */
1553          0x0000ffff,            /* dst_mask */
1554          FALSE),                /* pcrel_offset */
1555
1556   /* MIPS16 low 16 bits of symbol value.  */
1557   HOWTO (R_MIPS16_LO16,         /* type */
1558          0,                     /* rightshift */
1559          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1560          16,                    /* bitsize */
1561          FALSE,                 /* pc_relative */
1562          0,                     /* bitpos */
1563          complain_overflow_dont, /* complain_on_overflow */
1564          _bfd_mips_elf_lo16_reloc, /* special_function */
1565          "R_MIPS16_LO16",       /* name */
1566          FALSE,                 /* partial_inplace */
1567          0x0000ffff,            /* src_mask */
1568          0x0000ffff,            /* dst_mask */
1569          FALSE),                /* pcrel_offset */
1570 };
1571
1572 /* GNU extension to record C++ vtable hierarchy */
1573 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
1574   HOWTO (R_MIPS_GNU_VTINHERIT,  /* type */
1575          0,                     /* rightshift */
1576          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1577          0,                     /* bitsize */
1578          FALSE,                 /* pc_relative */
1579          0,                     /* bitpos */
1580          complain_overflow_dont, /* complain_on_overflow */
1581          NULL,                  /* special_function */
1582          "R_MIPS_GNU_VTINHERIT", /* name */
1583          FALSE,                 /* partial_inplace */
1584          0,                     /* src_mask */
1585          0,                     /* dst_mask */
1586          FALSE);                /* pcrel_offset */
1587
1588 /* GNU extension to record C++ vtable member usage */
1589 static reloc_howto_type elf_mips_gnu_vtentry_howto =
1590   HOWTO (R_MIPS_GNU_VTENTRY,    /* type */
1591          0,                     /* rightshift */
1592          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1593          0,                     /* bitsize */
1594          FALSE,                 /* pc_relative */
1595          0,                     /* bitpos */
1596          complain_overflow_dont, /* complain_on_overflow */
1597          _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1598          "R_MIPS_GNU_VTENTRY",  /* name */
1599          FALSE,                 /* partial_inplace */
1600          0,                     /* src_mask */
1601          0,                     /* dst_mask */
1602          FALSE);                /* pcrel_offset */
1603 \f
1604 /* 16 bit offset for pc-relative branches.  */
1605 static reloc_howto_type elf_mips_gnu_rel16_s2 =
1606   HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
1607          2,                     /* rightshift */
1608          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1609          16,                    /* bitsize */
1610          TRUE,                  /* pc_relative */
1611          0,                     /* bitpos */
1612          complain_overflow_signed, /* complain_on_overflow */
1613          _bfd_mips_elf_generic_reloc,   /* special_function */
1614          "R_MIPS_GNU_REL16_S2", /* name */
1615          TRUE,                  /* partial_inplace */
1616          0x0000ffff,            /* src_mask */
1617          0x0000ffff,            /* dst_mask */
1618          TRUE);                 /* pcrel_offset */
1619
1620 /* 16 bit offset for pc-relative branches.  */
1621 static reloc_howto_type elf_mips_gnu_rela16_s2 =
1622   HOWTO (R_MIPS_GNU_REL16_S2,   /* type */
1623          2,                     /* rightshift */
1624          2,                     /* size (0 = byte, 1 = short, 2 = long) */
1625          16,                    /* bitsize */
1626          TRUE,                  /* pc_relative */
1627          0,                     /* bitpos */
1628          complain_overflow_signed, /* complain_on_overflow */
1629          _bfd_mips_elf_generic_reloc,   /* special_function */
1630          "R_MIPS_GNU_REL16_S2", /* name */
1631          FALSE,                 /* partial_inplace */
1632          0,                     /* src_mask */
1633          0x0000ffff,            /* dst_mask */
1634          TRUE);                 /* pcrel_offset */
1635 \f
1636 /* Swap in a MIPS 64-bit Rel reloc.  */
1637
1638 static void
1639 mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
1640                           Elf64_Mips_Internal_Rela *dst)
1641 {
1642   dst->r_offset = H_GET_64 (abfd, src->r_offset);
1643   dst->r_sym = H_GET_32 (abfd, src->r_sym);
1644   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
1645   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
1646   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
1647   dst->r_type = H_GET_8 (abfd, src->r_type);
1648   dst->r_addend = 0;
1649 }
1650
1651 /* Swap in a MIPS 64-bit Rela reloc.  */
1652
1653 static void
1654 mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
1655                            Elf64_Mips_Internal_Rela *dst)
1656 {
1657   dst->r_offset = H_GET_64 (abfd, src->r_offset);
1658   dst->r_sym = H_GET_32 (abfd, src->r_sym);
1659   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
1660   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
1661   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
1662   dst->r_type = H_GET_8 (abfd, src->r_type);
1663   dst->r_addend = H_GET_S64 (abfd, src->r_addend);
1664 }
1665
1666 /* Swap out a MIPS 64-bit Rel reloc.  */
1667
1668 static void
1669 mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
1670                            Elf64_Mips_External_Rel *dst)
1671 {
1672   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
1673   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
1674   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
1675   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
1676   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
1677   H_PUT_8 (abfd, src->r_type, dst->r_type);
1678 }
1679
1680 /* Swap out a MIPS 64-bit Rela reloc.  */
1681
1682 static void
1683 mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
1684                             Elf64_Mips_External_Rela *dst)
1685 {
1686   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
1687   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
1688   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
1689   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
1690   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
1691   H_PUT_8 (abfd, src->r_type, dst->r_type);
1692   H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
1693 }
1694
1695 /* Swap in a MIPS 64-bit Rel reloc.  */
1696
1697 static void
1698 mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
1699                              Elf_Internal_Rela *dst)
1700 {
1701   Elf64_Mips_Internal_Rela mirel;
1702
1703   mips_elf64_swap_reloc_in (abfd,
1704                             (const Elf64_Mips_External_Rel *) src,
1705                             &mirel);
1706
1707   dst[0].r_offset = mirel.r_offset;
1708   dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
1709   dst[0].r_addend = 0;
1710   dst[1].r_offset = mirel.r_offset;
1711   dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
1712   dst[1].r_addend = 0;
1713   dst[2].r_offset = mirel.r_offset;
1714   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
1715   dst[2].r_addend = 0;
1716 }
1717
1718 /* Swap in a MIPS 64-bit Rela reloc.  */
1719
1720 static void
1721 mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
1722                               Elf_Internal_Rela *dst)
1723 {
1724   Elf64_Mips_Internal_Rela mirela;
1725
1726   mips_elf64_swap_reloca_in (abfd,
1727                              (const Elf64_Mips_External_Rela *) src,
1728                              &mirela);
1729
1730   dst[0].r_offset = mirela.r_offset;
1731   dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
1732   dst[0].r_addend = mirela.r_addend;
1733   dst[1].r_offset = mirela.r_offset;
1734   dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
1735   dst[1].r_addend = 0;
1736   dst[2].r_offset = mirela.r_offset;
1737   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
1738   dst[2].r_addend = 0;
1739 }
1740
1741 /* Swap out a MIPS 64-bit Rel reloc.  */
1742
1743 static void
1744 mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
1745                               bfd_byte *dst)
1746 {
1747   Elf64_Mips_Internal_Rela mirel;
1748
1749   mirel.r_offset = src[0].r_offset;
1750   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
1751
1752   mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
1753   mirel.r_sym = ELF64_R_SYM (src[0].r_info);
1754   mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
1755   mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
1756   mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
1757
1758   mips_elf64_swap_reloc_out (abfd, &mirel,
1759                              (Elf64_Mips_External_Rel *) dst);
1760 }
1761
1762 /* Swap out a MIPS 64-bit Rela reloc.  */
1763
1764 static void
1765 mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
1766                                bfd_byte *dst)
1767 {
1768   Elf64_Mips_Internal_Rela mirela;
1769
1770   mirela.r_offset = src[0].r_offset;
1771   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
1772   BFD_ASSERT(src[0].r_offset == src[2].r_offset);
1773
1774   mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
1775   mirela.r_sym = ELF64_R_SYM (src[0].r_info);
1776   mirela.r_addend = src[0].r_addend;
1777   BFD_ASSERT(src[1].r_addend == 0);
1778   BFD_ASSERT(src[2].r_addend == 0);
1779
1780   mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
1781   mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
1782   mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
1783
1784   mips_elf64_swap_reloca_out (abfd, &mirela,
1785                               (Elf64_Mips_External_Rela *) dst);
1786 }
1787 \f
1788 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
1789    dangerous relocation.  */
1790
1791 static bfd_boolean
1792 mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
1793 {
1794   unsigned int count;
1795   asymbol **sym;
1796   unsigned int i;
1797
1798   /* If we've already figured out what GP will be, just return it.  */
1799   *pgp = _bfd_get_gp_value (output_bfd);
1800   if (*pgp)
1801     return TRUE;
1802
1803   count = bfd_get_symcount (output_bfd);
1804   sym = bfd_get_outsymbols (output_bfd);
1805
1806   /* The linker script will have created a symbol named `_gp' with the
1807      appropriate value.  */
1808   if (sym == NULL)
1809     i = count;
1810   else
1811     {
1812       for (i = 0; i < count; i++, sym++)
1813         {
1814           register const char *name;
1815
1816           name = bfd_asymbol_name (*sym);
1817           if (*name == '_' && strcmp (name, "_gp") == 0)
1818             {
1819               *pgp = bfd_asymbol_value (*sym);
1820               _bfd_set_gp_value (output_bfd, *pgp);
1821               break;
1822             }
1823         }
1824     }
1825
1826   if (i >= count)
1827     {
1828       /* Only get the error once.  */
1829       *pgp = 4;
1830       _bfd_set_gp_value (output_bfd, *pgp);
1831       return FALSE;
1832     }
1833
1834   return TRUE;
1835 }
1836
1837 /* We have to figure out the gp value, so that we can adjust the
1838    symbol value correctly.  We look up the symbol _gp in the output
1839    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
1840    target data.  We don't need to adjust the symbol value for an
1841    external symbol if we are producing relocatable output.  */
1842
1843 static bfd_reloc_status_type
1844 mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
1845                      char **error_message, bfd_vma *pgp)
1846 {
1847   if (bfd_is_und_section (symbol->section)
1848       && ! relocatable)
1849     {
1850       *pgp = 0;
1851       return bfd_reloc_undefined;
1852     }
1853
1854   *pgp = _bfd_get_gp_value (output_bfd);
1855   if (*pgp == 0
1856       && (! relocatable
1857           || (symbol->flags & BSF_SECTION_SYM) != 0))
1858     {
1859       if (relocatable)
1860         {
1861           /* Make up a value.  */
1862           *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
1863           _bfd_set_gp_value (output_bfd, *pgp);
1864         }
1865       else if (!mips_elf64_assign_gp (output_bfd, pgp))
1866         {
1867           *error_message =
1868             (char *) _("GP relative relocation when _gp not defined");
1869           return bfd_reloc_dangerous;
1870         }
1871     }
1872
1873   return bfd_reloc_ok;
1874 }
1875
1876 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
1877    become the offset from the gp register.  */
1878
1879 static bfd_reloc_status_type
1880 mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1881                           void *data, asection *input_section, bfd *output_bfd,
1882                           char **error_message)
1883 {
1884   bfd_boolean relocatable;
1885   bfd_reloc_status_type ret;
1886   bfd_vma gp;
1887
1888   /* If we're relocating, and this is an external symbol, we don't want
1889      to change anything.  */
1890   if (output_bfd != NULL
1891       && (symbol->flags & BSF_SECTION_SYM) == 0
1892       && (symbol->flags & BSF_LOCAL) != 0)
1893     {
1894       reloc_entry->address += input_section->output_offset;
1895       return bfd_reloc_ok;
1896     }
1897
1898   if (output_bfd != NULL)
1899     relocatable = TRUE;
1900   else
1901     {
1902       relocatable = FALSE;
1903       output_bfd = symbol->section->output_section->owner;
1904     }
1905
1906   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
1907                              &gp);
1908   if (ret != bfd_reloc_ok)
1909     return ret;
1910
1911   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1912                                         input_section, relocatable,
1913                                         data, gp);
1914 }
1915
1916 /* Do a R_MIPS_LITERAL relocation.  */
1917
1918 static bfd_reloc_status_type
1919 mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1920                           void *data, asection *input_section, bfd *output_bfd,
1921                           char **error_message)
1922 {
1923   bfd_boolean relocatable;
1924   bfd_reloc_status_type ret;
1925   bfd_vma gp;
1926
1927   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
1928   if (output_bfd != NULL
1929       && (symbol->flags & BSF_SECTION_SYM) == 0
1930       && (symbol->flags & BSF_LOCAL) != 0)
1931     {
1932       *error_message = (char *)
1933         _("literal relocation occurs for an external symbol");
1934       return bfd_reloc_outofrange;
1935     }
1936
1937   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
1938   if (output_bfd != NULL)
1939     relocatable = TRUE;
1940   else
1941     {
1942       relocatable = FALSE;
1943       output_bfd = symbol->section->output_section->owner;
1944     }
1945
1946   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
1947                              &gp);
1948   if (ret != bfd_reloc_ok)
1949     return ret;
1950
1951   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1952                                         input_section, relocatable,
1953                                         data, gp);
1954 }
1955
1956 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
1957    become the offset from the gp register.  */
1958
1959 static bfd_reloc_status_type
1960 mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1961                           void *data, asection *input_section, bfd *output_bfd,
1962                           char **error_message)
1963 {
1964   bfd_boolean relocatable;
1965   bfd_reloc_status_type ret;
1966   bfd_vma gp;
1967   bfd_vma relocation;
1968   bfd_vma val;
1969
1970   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
1971   if (output_bfd != NULL
1972       && (symbol->flags & BSF_SECTION_SYM) == 0
1973       && (symbol->flags & BSF_LOCAL) != 0)
1974     {
1975       *error_message = (char *)
1976         _("32bits gp relative relocation occurs for an external symbol");
1977       return bfd_reloc_outofrange;
1978     }
1979
1980   if (output_bfd != NULL)
1981     relocatable = TRUE;
1982   else
1983     {
1984       relocatable = FALSE;
1985       output_bfd = symbol->section->output_section->owner;
1986     }
1987
1988   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
1989                              error_message, &gp);
1990   if (ret != bfd_reloc_ok)
1991     return ret;
1992
1993   if (bfd_is_com_section (symbol->section))
1994     relocation = 0;
1995   else
1996     relocation = symbol->value;
1997
1998   relocation += symbol->section->output_section->vma;
1999   relocation += symbol->section->output_offset;
2000
2001   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2002     return bfd_reloc_outofrange;
2003
2004   /* Set val to the offset into the section or symbol.  */
2005   val = reloc_entry->addend;
2006
2007   if (reloc_entry->howto->partial_inplace)
2008     val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
2009
2010   /* Adjust val for the final section location and GP value.  If we
2011      are producing relocatable output, we don't want to do this for
2012      an external symbol.  */
2013   if (! relocatable
2014       || (symbol->flags & BSF_SECTION_SYM) != 0)
2015     val += relocation - gp;
2016
2017   if (reloc_entry->howto->partial_inplace)
2018     bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
2019   else
2020     reloc_entry->addend = val;
2021
2022   if (relocatable)
2023     reloc_entry->address += input_section->output_offset;
2024
2025   return bfd_reloc_ok;
2026 }
2027
2028 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
2029    the rest is at bits 6-10. The bitpos already got right by the howto.  */
2030
2031 static bfd_reloc_status_type
2032 mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2033                          void *data, asection *input_section, bfd *output_bfd,
2034                          char **error_message)
2035 {
2036   if (reloc_entry->howto->partial_inplace)
2037     {
2038       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
2039                              | (reloc_entry->addend & 0x00000800) >> 9);
2040     }
2041
2042   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2043                                       input_section, output_bfd,
2044                                       error_message);
2045 }
2046
2047 /* Handle a mips16 jump.  */
2048
2049 static bfd_reloc_status_type
2050 mips16_jump_reloc (bfd *abfd ATTRIBUTE_UNUSED, arelent *reloc_entry,
2051                    asymbol *symbol, void *data ATTRIBUTE_UNUSED,
2052                    asection *input_section, bfd *output_bfd,
2053                    char **error_message ATTRIBUTE_UNUSED)
2054 {
2055   if (output_bfd != NULL
2056       && (symbol->flags & BSF_SECTION_SYM) == 0
2057       && (! reloc_entry->howto->partial_inplace
2058           || reloc_entry->addend == 0))
2059     {
2060       reloc_entry->address += input_section->output_offset;
2061       return bfd_reloc_ok;
2062     }
2063
2064   /* FIXME.  */
2065   {
2066     static bfd_boolean warned;
2067
2068     if (! warned)
2069       (*_bfd_error_handler)
2070         (_("Linking mips16 objects into %s format is not supported"),
2071          bfd_get_target (input_section->output_section->owner));
2072     warned = TRUE;
2073   }
2074
2075   return bfd_reloc_undefined;
2076 }
2077
2078 /* Handle a mips16 GP relative reloc.  */
2079
2080 static bfd_reloc_status_type
2081 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2082                     void *data, asection *input_section, bfd *output_bfd,
2083                     char **error_message)
2084 {
2085   bfd_boolean relocatable;
2086   bfd_reloc_status_type ret;
2087   bfd_byte *location;
2088   bfd_vma gp;
2089
2090   /* If we're relocating, and this is an external symbol, we don't want
2091      to change anything.  */
2092   if (output_bfd != NULL
2093       && (symbol->flags & BSF_SECTION_SYM) == 0
2094       && (symbol->flags & BSF_LOCAL) != 0)
2095     {
2096       reloc_entry->address += input_section->output_offset;
2097       return bfd_reloc_ok;
2098     }
2099
2100   if (output_bfd != NULL)
2101     relocatable = TRUE;
2102   else
2103     {
2104       relocatable = FALSE;
2105       output_bfd = symbol->section->output_section->owner;
2106     }
2107
2108   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2109                              &gp);
2110   if (ret != bfd_reloc_ok)
2111     return ret;
2112
2113   location = (bfd_byte *) data + reloc_entry->address;
2114   _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
2115                                    location);
2116   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2117                                        input_section, relocatable,
2118                                        data, gp);
2119   _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
2120                                  location);
2121
2122   return ret;
2123 }
2124 \f
2125 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
2126
2127 struct elf_reloc_map {
2128   bfd_reloc_code_real_type bfd_val;
2129   enum elf_mips_reloc_type elf_val;
2130 };
2131
2132 static const struct elf_reloc_map mips_reloc_map[] =
2133 {
2134   { BFD_RELOC_NONE, R_MIPS_NONE },
2135   { BFD_RELOC_16, R_MIPS_16 },
2136   { BFD_RELOC_32, R_MIPS_32 },
2137   /* There is no BFD reloc for R_MIPS_REL32.  */
2138   { BFD_RELOC_64, R_MIPS_64 },
2139   { BFD_RELOC_CTOR, R_MIPS_64 },
2140   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
2141   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
2142   { BFD_RELOC_LO16, R_MIPS_LO16 },
2143   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
2144   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
2145   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
2146   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
2147   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
2148   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
2149   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
2150   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
2151   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
2152   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
2153   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
2154   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
2155   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
2156   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
2157   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
2158   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
2159   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
2160   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
2161   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
2162   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
2163   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
2164   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
2165   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
2166   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
2167   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
2168   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
2169   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
2170   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
2171   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
2172   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
2173   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
2174   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
2175   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
2176   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
2177   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
2178   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
2179   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
2180   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
2181   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
2182 };
2183
2184 static const struct elf_reloc_map mips16_reloc_map[] =
2185 {
2186   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
2187   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
2188   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
2189   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
2190 };
2191
2192 /* Given a BFD reloc type, return a howto structure.  */
2193
2194 static reloc_howto_type *
2195 bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2196                                  bfd_reloc_code_real_type code)
2197 {
2198   unsigned int i;
2199   /* FIXME: We default to RELA here instead of choosing the right
2200      relocation variant.  */
2201   reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
2202   reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
2203
2204   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
2205        i++)
2206     {
2207       if (mips_reloc_map[i].bfd_val == code)
2208         return &howto_table[(int) mips_reloc_map[i].elf_val];
2209     }
2210
2211   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
2212        i++)
2213     {
2214       if (mips16_reloc_map[i].bfd_val == code)
2215         return &howto16_table[(int) mips16_reloc_map[i].elf_val];
2216     }
2217
2218   switch (code)
2219     {
2220     case BFD_RELOC_VTABLE_INHERIT:
2221       return &elf_mips_gnu_vtinherit_howto;
2222     case BFD_RELOC_VTABLE_ENTRY:
2223       return &elf_mips_gnu_vtentry_howto;
2224     default:
2225       bfd_set_error (bfd_error_bad_value);
2226       return NULL;
2227     }
2228 }
2229
2230 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
2231
2232 static reloc_howto_type *
2233 mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
2234 {
2235   switch (r_type)
2236     {
2237     case R_MIPS_GNU_VTINHERIT:
2238       return &elf_mips_gnu_vtinherit_howto;
2239     case R_MIPS_GNU_VTENTRY:
2240       return &elf_mips_gnu_vtentry_howto;
2241     case R_MIPS_GNU_REL16_S2:
2242       if (rela_p)
2243         return &elf_mips_gnu_rela16_s2;
2244       else
2245         return &elf_mips_gnu_rel16_s2;
2246     default:
2247       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
2248         {
2249           if (rela_p)
2250             return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
2251           else
2252             return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
2253         }
2254       BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
2255       if (rela_p)
2256         return &mips_elf64_howto_table_rela[r_type];
2257       else
2258         return &mips_elf64_howto_table_rel[r_type];
2259       break;
2260     }
2261 }
2262
2263 /* Prevent relocation handling by bfd for MIPS ELF64.  */
2264
2265 static void
2266 mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
2267                               arelent *cache_ptr ATTRIBUTE_UNUSED,
2268                               Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
2269 {
2270   BFD_ASSERT (0);
2271 }
2272
2273 static void
2274 mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
2275                                arelent *cache_ptr ATTRIBUTE_UNUSED,
2276                                Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
2277 {
2278   BFD_ASSERT (0);
2279 }
2280
2281 /* Since each entry in an SHT_REL or SHT_RELA section can represent up
2282    to three relocs, we must tell the user to allocate more space.  */
2283
2284 static long
2285 mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
2286 {
2287   return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
2288 }
2289
2290 static long
2291 mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
2292 {
2293   return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
2294 }
2295
2296 /* We must also copy more relocations than the corresponding functions
2297    in elf.c would, so the two following functions are slightly
2298    modified from elf.c, that multiply the external relocation count by
2299    3 to obtain the internal relocation count.  */
2300
2301 static long
2302 mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section,
2303                                arelent **relptr, asymbol **symbols)
2304 {
2305   arelent *tblptr;
2306   unsigned int i;
2307   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2308
2309   if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
2310     return -1;
2311
2312   tblptr = section->relocation;
2313   for (i = 0; i < section->reloc_count * 3; i++)
2314     *relptr++ = tblptr++;
2315
2316   *relptr = NULL;
2317
2318   return section->reloc_count * 3;
2319 }
2320
2321 static long
2322 mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
2323                                        asymbol **syms)
2324 {
2325   bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2326   asection *s;
2327   long ret;
2328
2329   if (elf_dynsymtab (abfd) == 0)
2330     {
2331       bfd_set_error (bfd_error_invalid_operation);
2332       return -1;
2333     }
2334
2335   slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
2336   ret = 0;
2337   for (s = abfd->sections; s != NULL; s = s->next)
2338     {
2339       if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
2340           && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
2341               || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
2342         {
2343           arelent *p;
2344           long count, i;
2345
2346           if (! (*slurp_relocs) (abfd, s, syms, TRUE))
2347             return -1;
2348           count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3;
2349           p = s->relocation;
2350           for (i = 0; i < count; i++)
2351             *storage++ = p++;
2352           ret += count;
2353         }
2354     }
2355
2356   *storage = NULL;
2357
2358   return ret;
2359 }
2360
2361 /* Read the relocations from one reloc section.  This is mostly copied
2362    from elfcode.h, except for the changes to expand one external
2363    relocation to 3 internal ones.  We must unfortunately set
2364    reloc_count to the number of external relocations, because a lot of
2365    generic code seems to depend on this.  */
2366
2367 static bfd_boolean
2368 mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
2369                                   Elf_Internal_Shdr *rel_hdr,
2370                                   bfd_size_type reloc_count,
2371                                   arelent *relents, asymbol **symbols,
2372                                   bfd_boolean dynamic)
2373 {
2374   void *allocated;
2375   bfd_byte *native_relocs;
2376   arelent *relent;
2377   bfd_vma i;
2378   int entsize;
2379   bfd_boolean rela_p;
2380
2381   allocated = bfd_malloc (rel_hdr->sh_size);
2382   if (allocated == NULL)
2383     return FALSE;
2384
2385   if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
2386       || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
2387           != rel_hdr->sh_size))
2388     goto error_return;
2389
2390   native_relocs = allocated;
2391
2392   entsize = rel_hdr->sh_entsize;
2393   BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
2394               || entsize == sizeof (Elf64_Mips_External_Rela));
2395
2396   if (entsize == sizeof (Elf64_Mips_External_Rel))
2397     rela_p = FALSE;
2398   else
2399     rela_p = TRUE;
2400
2401   for (i = 0, relent = relents;
2402        i < reloc_count;
2403        i++, native_relocs += entsize)
2404     {
2405       Elf64_Mips_Internal_Rela rela;
2406       bfd_boolean used_sym, used_ssym;
2407       int ir;
2408
2409       if (entsize == sizeof (Elf64_Mips_External_Rela))
2410         mips_elf64_swap_reloca_in (abfd,
2411                                    (Elf64_Mips_External_Rela *) native_relocs,
2412                                    &rela);
2413       else
2414         mips_elf64_swap_reloc_in (abfd,
2415                                   (Elf64_Mips_External_Rel *) native_relocs,
2416                                   &rela);
2417
2418       /* Each entry represents exactly three actual relocations.  */
2419
2420       used_sym = FALSE;
2421       used_ssym = FALSE;
2422       for (ir = 0; ir < 3; ir++)
2423         {
2424           enum elf_mips_reloc_type type;
2425
2426           switch (ir)
2427             {
2428             default:
2429               abort ();
2430             case 0:
2431               type = (enum elf_mips_reloc_type) rela.r_type;
2432               break;
2433             case 1:
2434               type = (enum elf_mips_reloc_type) rela.r_type2;
2435               break;
2436             case 2:
2437               type = (enum elf_mips_reloc_type) rela.r_type3;
2438               break;
2439             }
2440
2441           /* Some types require symbols, whereas some do not.  */
2442           switch (type)
2443             {
2444             case R_MIPS_NONE:
2445             case R_MIPS_LITERAL:
2446             case R_MIPS_INSERT_A:
2447             case R_MIPS_INSERT_B:
2448             case R_MIPS_DELETE:
2449               relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
2450               break;
2451
2452             default:
2453               if (! used_sym)
2454                 {
2455                   if (rela.r_sym == 0)
2456                     relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
2457                   else
2458                     {
2459                       asymbol **ps, *s;
2460
2461                       ps = symbols + rela.r_sym - 1;
2462                       s = *ps;
2463                       if ((s->flags & BSF_SECTION_SYM) == 0)
2464                         relent->sym_ptr_ptr = ps;
2465                       else
2466                         relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
2467                     }
2468
2469                   used_sym = TRUE;
2470                 }
2471               else if (! used_ssym)
2472                 {
2473                   switch (rela.r_ssym)
2474                     {
2475                     case RSS_UNDEF:
2476                       relent->sym_ptr_ptr =
2477                         bfd_abs_section_ptr->symbol_ptr_ptr;
2478                       break;
2479
2480                     case RSS_GP:
2481                     case RSS_GP0:
2482                     case RSS_LOC:
2483                       /* FIXME: I think these need to be handled using
2484                          special howto structures.  */
2485                       BFD_ASSERT (0);
2486                       break;
2487
2488                     default:
2489                       BFD_ASSERT (0);
2490                       break;
2491                     }
2492
2493                   used_ssym = TRUE;
2494                 }
2495               else
2496                 relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
2497
2498               break;
2499             }
2500
2501           /* The address of an ELF reloc is section relative for an
2502              object file, and absolute for an executable file or
2503              shared library.  The address of a BFD reloc is always
2504              section relative.  */
2505           if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
2506             relent->address = rela.r_offset;
2507           else
2508             relent->address = rela.r_offset - asect->vma;
2509
2510           relent->addend = rela.r_addend;
2511
2512           relent->howto = mips_elf64_rtype_to_howto (type, rela_p);
2513
2514           ++relent;
2515         }
2516     }
2517
2518   asect->reloc_count += (relent - relents) / 3;
2519
2520   if (allocated != NULL)
2521     free (allocated);
2522
2523   return TRUE;
2524
2525  error_return:
2526   if (allocated != NULL)
2527     free (allocated);
2528   return FALSE;
2529 }
2530
2531 /* Read the relocations.  On Irix 6, there can be two reloc sections
2532    associated with a single data section.  This is copied from
2533    elfcode.h as well, with changes as small as accounting for 3
2534    internal relocs per external reloc and resetting reloc_count to
2535    zero before processing the relocs of a section.  */
2536
2537 static bfd_boolean
2538 mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
2539                               asymbol **symbols, bfd_boolean dynamic)
2540 {
2541   struct bfd_elf_section_data * const d = elf_section_data (asect);
2542   Elf_Internal_Shdr *rel_hdr;
2543   Elf_Internal_Shdr *rel_hdr2;
2544   bfd_size_type reloc_count;
2545   bfd_size_type reloc_count2;
2546   arelent *relents;
2547   bfd_size_type amt;
2548
2549   if (asect->relocation != NULL)
2550     return TRUE;
2551
2552   if (! dynamic)
2553     {
2554       if ((asect->flags & SEC_RELOC) == 0
2555           || asect->reloc_count == 0)
2556         return TRUE;
2557
2558       rel_hdr = &d->rel_hdr;
2559       reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
2560       rel_hdr2 = d->rel_hdr2;
2561       reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
2562
2563       BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
2564       BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
2565                   || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
2566
2567     }
2568   else
2569     {
2570       /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
2571          case because relocations against this section may use the
2572          dynamic symbol table, and in that case bfd_section_from_shdr
2573          in elf.c does not update the RELOC_COUNT.  */
2574       if (asect->size == 0)
2575         return TRUE;
2576
2577       rel_hdr = &d->this_hdr;
2578       reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
2579       rel_hdr2 = NULL;
2580       reloc_count2 = 0;
2581     }
2582
2583   /* Allocate space for 3 arelent structures for each Rel structure.  */
2584   amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
2585   relents = bfd_alloc (abfd, amt);
2586   if (relents == NULL)
2587     return FALSE;
2588
2589   /* The slurp_one_reloc_table routine increments reloc_count.  */
2590   asect->reloc_count = 0;
2591
2592   if (! mips_elf64_slurp_one_reloc_table (abfd, asect,
2593                                           rel_hdr, reloc_count,
2594                                           relents,
2595                                           symbols, dynamic))
2596     return FALSE;
2597   if (d->rel_hdr2 != NULL)
2598     {
2599       if (! mips_elf64_slurp_one_reloc_table (abfd, asect,
2600                                               rel_hdr2, reloc_count2,
2601                                               relents + reloc_count * 3,
2602                                               symbols, dynamic))
2603         return FALSE;
2604     }
2605
2606   asect->relocation = relents;
2607   return TRUE;
2608 }
2609
2610 /* Write out the relocations.  */
2611
2612 static void
2613 mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
2614 {
2615   bfd_boolean *failedp = data;
2616   int count;
2617   Elf_Internal_Shdr *rel_hdr;
2618   unsigned int idx;
2619
2620   /* If we have already failed, don't do anything.  */
2621   if (*failedp)
2622     return;
2623
2624   if ((sec->flags & SEC_RELOC) == 0)
2625     return;
2626
2627   /* The linker backend writes the relocs out itself, and sets the
2628      reloc_count field to zero to inhibit writing them here.  Also,
2629      sometimes the SEC_RELOC flag gets set even when there aren't any
2630      relocs.  */
2631   if (sec->reloc_count == 0)
2632     return;
2633
2634   /* We can combine up to three relocs that refer to the same address
2635      if the latter relocs have no associated symbol.  */
2636   count = 0;
2637   for (idx = 0; idx < sec->reloc_count; idx++)
2638     {
2639       bfd_vma addr;
2640       unsigned int i;
2641
2642       ++count;
2643
2644       addr = sec->orelocation[idx]->address;
2645       for (i = 0; i < 2; i++)
2646         {
2647           arelent *r;
2648
2649           if (idx + 1 >= sec->reloc_count)
2650             break;
2651           r = sec->orelocation[idx + 1];
2652           if (r->address != addr
2653               || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
2654               || (*r->sym_ptr_ptr)->value != 0)
2655             break;
2656
2657           /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
2658
2659           ++idx;
2660         }
2661     }
2662
2663   rel_hdr = &elf_section_data (sec)->rel_hdr;
2664
2665   /* Do the actual relocation.  */
2666
2667   if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
2668     mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
2669   else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
2670     mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
2671   else
2672     BFD_ASSERT (0);
2673 }
2674
2675 static void
2676 mips_elf64_write_rel (bfd *abfd, asection *sec,
2677                       Elf_Internal_Shdr *rel_hdr,
2678                       int *count, void *data)
2679 {
2680   bfd_boolean *failedp = data;
2681   Elf64_Mips_External_Rel *ext_rel;
2682   unsigned int idx;
2683   asymbol *last_sym = 0;
2684   int last_sym_idx = 0;
2685
2686   rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
2687   rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
2688   if (rel_hdr->contents == NULL)
2689     {
2690       *failedp = TRUE;
2691       return;
2692     }
2693
2694   ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
2695   for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
2696     {
2697       arelent *ptr;
2698       Elf64_Mips_Internal_Rela int_rel;
2699       asymbol *sym;
2700       int n;
2701       unsigned int i;
2702
2703       ptr = sec->orelocation[idx];
2704
2705       /* The address of an ELF reloc is section relative for an object
2706          file, and absolute for an executable file or shared library.
2707          The address of a BFD reloc is always section relative.  */
2708       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
2709         int_rel.r_offset = ptr->address;
2710       else
2711         int_rel.r_offset = ptr->address + sec->vma;
2712
2713       sym = *ptr->sym_ptr_ptr;
2714       if (sym == last_sym)
2715         n = last_sym_idx;
2716       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
2717         n = STN_UNDEF;
2718       else
2719         {
2720           last_sym = sym;
2721           n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
2722           if (n < 0)
2723             {
2724               *failedp = TRUE;
2725               return;
2726             }
2727           last_sym_idx = n;
2728         }
2729
2730       int_rel.r_sym = n;
2731       int_rel.r_ssym = RSS_UNDEF;
2732
2733       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
2734           && ! _bfd_elf_validate_reloc (abfd, ptr))
2735         {
2736           *failedp = TRUE;
2737           return;
2738         }
2739
2740       int_rel.r_type = ptr->howto->type;
2741       int_rel.r_type2 = (int) R_MIPS_NONE;
2742       int_rel.r_type3 = (int) R_MIPS_NONE;
2743
2744       for (i = 0; i < 2; i++)
2745         {
2746           arelent *r;
2747
2748           if (idx + 1 >= sec->reloc_count)
2749             break;
2750           r = sec->orelocation[idx + 1];
2751           if (r->address != ptr->address
2752               || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
2753               || (*r->sym_ptr_ptr)->value != 0)
2754             break;
2755
2756           /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
2757
2758           if (i == 0)
2759             int_rel.r_type2 = r->howto->type;
2760           else
2761             int_rel.r_type3 = r->howto->type;
2762
2763           ++idx;
2764         }
2765
2766       mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
2767     }
2768
2769   BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
2770               == *count);
2771 }
2772
2773 static void
2774 mips_elf64_write_rela (bfd *abfd, asection *sec,
2775                        Elf_Internal_Shdr *rela_hdr,
2776                        int *count, void *data)
2777 {
2778   bfd_boolean *failedp = data;
2779   Elf64_Mips_External_Rela *ext_rela;
2780   unsigned int idx;
2781   asymbol *last_sym = 0;
2782   int last_sym_idx = 0;
2783
2784   rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
2785   rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
2786   if (rela_hdr->contents == NULL)
2787     {
2788       *failedp = TRUE;
2789       return;
2790     }
2791
2792   ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
2793   for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
2794     {
2795       arelent *ptr;
2796       Elf64_Mips_Internal_Rela int_rela;
2797       asymbol *sym;
2798       int n;
2799       unsigned int i;
2800
2801       ptr = sec->orelocation[idx];
2802
2803       /* The address of an ELF reloc is section relative for an object
2804          file, and absolute for an executable file or shared library.
2805          The address of a BFD reloc is always section relative.  */
2806       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
2807         int_rela.r_offset = ptr->address;
2808       else
2809         int_rela.r_offset = ptr->address + sec->vma;
2810
2811       sym = *ptr->sym_ptr_ptr;
2812       if (sym == last_sym)
2813         n = last_sym_idx;
2814       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
2815         n = STN_UNDEF;
2816       else
2817         {
2818           last_sym = sym;
2819           n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
2820           if (n < 0)
2821             {
2822               *failedp = TRUE;
2823               return;
2824             }
2825           last_sym_idx = n;
2826         }
2827
2828       int_rela.r_sym = n;
2829       int_rela.r_addend = ptr->addend;
2830       int_rela.r_ssym = RSS_UNDEF;
2831
2832       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
2833           && ! _bfd_elf_validate_reloc (abfd, ptr))
2834         {
2835           *failedp = TRUE;
2836           return;
2837         }
2838
2839       int_rela.r_type = ptr->howto->type;
2840       int_rela.r_type2 = (int) R_MIPS_NONE;
2841       int_rela.r_type3 = (int) R_MIPS_NONE;
2842
2843       for (i = 0; i < 2; i++)
2844         {
2845           arelent *r;
2846
2847           if (idx + 1 >= sec->reloc_count)
2848             break;
2849           r = sec->orelocation[idx + 1];
2850           if (r->address != ptr->address
2851               || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
2852               || (*r->sym_ptr_ptr)->value != 0)
2853             break;
2854
2855           /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
2856
2857           if (i == 0)
2858             int_rela.r_type2 = r->howto->type;
2859           else
2860             int_rela.r_type3 = r->howto->type;
2861
2862           ++idx;
2863         }
2864
2865       mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
2866     }
2867
2868   BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
2869               == *count);
2870 }
2871 \f
2872 /* Set the right machine number for a MIPS ELF file.  */
2873
2874 static bfd_boolean
2875 mips_elf64_object_p (bfd *abfd)
2876 {
2877   unsigned long mach;
2878
2879   /* Irix 6 is broken.  Object file symbol tables are not always
2880      sorted correctly such that local symbols precede global symbols,
2881      and the sh_info field in the symbol table is not always right.  */
2882   if (elf64_mips_irix_compat (abfd) != ict_none)
2883     elf_bad_symtab (abfd) = TRUE;
2884
2885   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
2886   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
2887   return TRUE;
2888 }
2889
2890 /* Depending on the target vector we generate some version of Irix
2891    executables or "normal" MIPS ELF ABI executables.  */
2892 static irix_compat_t
2893 elf64_mips_irix_compat (bfd *abfd)
2894 {
2895   if ((abfd->xvec == &bfd_elf64_bigmips_vec)
2896       || (abfd->xvec == &bfd_elf64_littlemips_vec))
2897     return ict_irix6;
2898   else
2899     return ict_none;
2900 }
2901 \f
2902 /* Support for core dump NOTE sections.  */
2903 static bfd_boolean
2904 elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2905 {
2906   int offset;
2907   unsigned int size;
2908
2909   switch (note->descsz)
2910     {
2911       default:
2912         return FALSE;
2913
2914       case 480:         /* Linux/MIPS - N64 kernel */
2915         /* pr_cursig */
2916         elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2917
2918         /* pr_pid */
2919         elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32);
2920
2921         /* pr_reg */
2922         offset = 112;
2923         size = 360;
2924
2925         break;
2926     }
2927
2928   /* Make a ".reg/999" section.  */
2929   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2930                                           size, note->descpos + offset);
2931 }
2932
2933 static bfd_boolean
2934 elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2935 {
2936   switch (note->descsz)
2937     {
2938       default:
2939         return FALSE;
2940
2941       case 136:         /* Linux/MIPS - N64 kernel elf_prpsinfo */
2942         elf_tdata (abfd)->core_program
2943          = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2944         elf_tdata (abfd)->core_command
2945          = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2946     }
2947
2948   /* Note that for some reason, a spurious space is tacked
2949      onto the end of the args in some (at least one anyway)
2950      implementations, so strip it off if it exists.  */
2951
2952   {
2953     char *command = elf_tdata (abfd)->core_command;
2954     int n = strlen (command);
2955
2956     if (0 < n && command[n - 1] == ' ')
2957       command[n - 1] = '\0';
2958   }
2959
2960   return TRUE;
2961 }
2962 \f
2963 /* ECOFF swapping routines.  These are used when dealing with the
2964    .mdebug section, which is in the ECOFF debugging format.  */
2965 static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
2966 {
2967   /* Symbol table magic number.  */
2968   magicSym2,
2969   /* Alignment of debugging information.  E.g., 4.  */
2970   8,
2971   /* Sizes of external symbolic information.  */
2972   sizeof (struct hdr_ext),
2973   sizeof (struct dnr_ext),
2974   sizeof (struct pdr_ext),
2975   sizeof (struct sym_ext),
2976   sizeof (struct opt_ext),
2977   sizeof (struct fdr_ext),
2978   sizeof (struct rfd_ext),
2979   sizeof (struct ext_ext),
2980   /* Functions to swap in external symbolic data.  */
2981   ecoff_swap_hdr_in,
2982   ecoff_swap_dnr_in,
2983   ecoff_swap_pdr_in,
2984   ecoff_swap_sym_in,
2985   ecoff_swap_opt_in,
2986   ecoff_swap_fdr_in,
2987   ecoff_swap_rfd_in,
2988   ecoff_swap_ext_in,
2989   _bfd_ecoff_swap_tir_in,
2990   _bfd_ecoff_swap_rndx_in,
2991   /* Functions to swap out external symbolic data.  */
2992   ecoff_swap_hdr_out,
2993   ecoff_swap_dnr_out,
2994   ecoff_swap_pdr_out,
2995   ecoff_swap_sym_out,
2996   ecoff_swap_opt_out,
2997   ecoff_swap_fdr_out,
2998   ecoff_swap_rfd_out,
2999   ecoff_swap_ext_out,
3000   _bfd_ecoff_swap_tir_out,
3001   _bfd_ecoff_swap_rndx_out,
3002   /* Function to read in symbolic data.  */
3003   _bfd_mips_elf_read_ecoff_info
3004 };
3005 \f
3006 /* Relocations in the 64 bit MIPS ELF ABI are more complex than in
3007    standard ELF.  This structure is used to redirect the relocation
3008    handling routines.  */
3009
3010 const struct elf_size_info mips_elf64_size_info =
3011 {
3012   sizeof (Elf64_External_Ehdr),
3013   sizeof (Elf64_External_Phdr),
3014   sizeof (Elf64_External_Shdr),
3015   sizeof (Elf64_Mips_External_Rel),
3016   sizeof (Elf64_Mips_External_Rela),
3017   sizeof (Elf64_External_Sym),
3018   sizeof (Elf64_External_Dyn),
3019   sizeof (Elf_External_Note),
3020   4,            /* hash-table entry size */
3021   3,            /* internal relocations per external relocations */
3022   64,           /* arch_size */
3023   3,            /* log_file_align */
3024   ELFCLASS64,
3025   EV_CURRENT,
3026   bfd_elf64_write_out_phdrs,
3027   bfd_elf64_write_shdrs_and_ehdr,
3028   mips_elf64_write_relocs,
3029   bfd_elf64_swap_symbol_in,
3030   bfd_elf64_swap_symbol_out,
3031   mips_elf64_slurp_reloc_table,
3032   bfd_elf64_slurp_symbol_table,
3033   bfd_elf64_swap_dyn_in,
3034   bfd_elf64_swap_dyn_out,
3035   mips_elf64_be_swap_reloc_in,
3036   mips_elf64_be_swap_reloc_out,
3037   mips_elf64_be_swap_reloca_in,
3038   mips_elf64_be_swap_reloca_out
3039 };
3040
3041 #define ELF_ARCH                        bfd_arch_mips
3042 #define ELF_MACHINE_CODE                EM_MIPS
3043
3044 #define elf_backend_collect             TRUE
3045 #define elf_backend_type_change_ok      TRUE
3046 #define elf_backend_can_gc_sections     TRUE
3047 #define elf_info_to_howto               mips_elf64_info_to_howto_rela
3048 #define elf_info_to_howto_rel           mips_elf64_info_to_howto_rel
3049 #define elf_backend_object_p            mips_elf64_object_p
3050 #define elf_backend_symbol_processing   _bfd_mips_elf_symbol_processing
3051 #define elf_backend_section_processing  _bfd_mips_elf_section_processing
3052 #define elf_backend_section_from_shdr   _bfd_mips_elf_section_from_shdr
3053 #define elf_backend_fake_sections       _bfd_mips_elf_fake_sections
3054 #define elf_backend_section_from_bfd_section \
3055                                 _bfd_mips_elf_section_from_bfd_section
3056 #define elf_backend_add_symbol_hook     _bfd_mips_elf_add_symbol_hook
3057 #define elf_backend_link_output_symbol_hook \
3058                                 _bfd_mips_elf_link_output_symbol_hook
3059 #define elf_backend_create_dynamic_sections \
3060                                 _bfd_mips_elf_create_dynamic_sections
3061 #define elf_backend_check_relocs        _bfd_mips_elf_check_relocs
3062 #define elf_backend_adjust_dynamic_symbol \
3063                                 _bfd_mips_elf_adjust_dynamic_symbol
3064 #define elf_backend_always_size_sections \
3065                                 _bfd_mips_elf_always_size_sections
3066 #define elf_backend_size_dynamic_sections \
3067                                 _bfd_mips_elf_size_dynamic_sections
3068 #define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
3069 #define elf_backend_finish_dynamic_symbol \
3070                                 _bfd_mips_elf_finish_dynamic_symbol
3071 #define elf_backend_finish_dynamic_sections \
3072                                 _bfd_mips_elf_finish_dynamic_sections
3073 #define elf_backend_final_write_processing \
3074                                 _bfd_mips_elf_final_write_processing
3075 #define elf_backend_additional_program_headers \
3076                                 _bfd_mips_elf_additional_program_headers
3077 #define elf_backend_modify_segment_map  _bfd_mips_elf_modify_segment_map
3078 #define elf_backend_gc_mark_hook        _bfd_mips_elf_gc_mark_hook
3079 #define elf_backend_gc_sweep_hook       _bfd_mips_elf_gc_sweep_hook
3080 #define elf_backend_copy_indirect_symbol \
3081                                         _bfd_mips_elf_copy_indirect_symbol
3082 #define elf_backend_hide_symbol         _bfd_mips_elf_hide_symbol
3083 #define elf_backend_ignore_discarded_relocs \
3084                                         _bfd_mips_elf_ignore_discarded_relocs
3085 #define elf_backend_mips_irix_compat    elf64_mips_irix_compat
3086 #define elf_backend_mips_rtype_to_howto mips_elf64_rtype_to_howto
3087 #define elf_backend_ecoff_debug_swap    &mips_elf64_ecoff_debug_swap
3088 #define elf_backend_size_info           mips_elf64_size_info
3089
3090 #define elf_backend_grok_prstatus       elf64_mips_grok_prstatus
3091 #define elf_backend_grok_psinfo         elf64_mips_grok_psinfo
3092
3093 #define elf_backend_got_header_size     (4 * MIPS_RESERVED_GOTNO)
3094
3095 /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
3096    work better/work only in RELA, so we default to this.  */
3097 #define elf_backend_may_use_rel_p       1
3098 #define elf_backend_may_use_rela_p      1
3099 #define elf_backend_default_use_rela_p  1
3100
3101 #define elf_backend_write_section       _bfd_mips_elf_write_section
3102
3103 /* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit
3104    MIPS-specific function only applies to IRIX5, which had no 64-bit
3105    ABI.  */
3106 #define bfd_elf64_find_nearest_line     _bfd_mips_elf_find_nearest_line
3107 #define bfd_elf64_find_inliner_info     _bfd_mips_elf_find_inliner_info
3108 #define bfd_elf64_new_section_hook      _bfd_mips_elf_new_section_hook
3109 #define bfd_elf64_set_section_contents  _bfd_mips_elf_set_section_contents
3110 #define bfd_elf64_bfd_get_relocated_section_contents \
3111                                 _bfd_elf_mips_get_relocated_section_contents
3112 #define bfd_elf64_bfd_link_hash_table_create \
3113                                 _bfd_mips_elf_link_hash_table_create
3114 #define bfd_elf64_bfd_final_link        _bfd_mips_elf_final_link
3115 #define bfd_elf64_bfd_merge_private_bfd_data \
3116                                 _bfd_mips_elf_merge_private_bfd_data
3117 #define bfd_elf64_bfd_set_private_flags _bfd_mips_elf_set_private_flags
3118 #define bfd_elf64_bfd_print_private_bfd_data \
3119                                 _bfd_mips_elf_print_private_bfd_data
3120
3121 #define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound
3122 #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc
3123 #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
3124 #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc
3125 #define bfd_elf64_bfd_relax_section     _bfd_mips_relax_section
3126
3127 /* MIPS ELF64 archive functions.  */
3128 #define bfd_elf64_archive_functions
3129 extern bfd_boolean bfd_elf64_archive_slurp_armap
3130   (bfd *);
3131 extern bfd_boolean bfd_elf64_archive_write_armap
3132   (bfd *, unsigned int, struct orl *, unsigned int, int);
3133 #define bfd_elf64_archive_slurp_extended_name_table \
3134                         _bfd_archive_coff_slurp_extended_name_table
3135 #define bfd_elf64_archive_construct_extended_name_table \
3136                         _bfd_archive_coff_construct_extended_name_table
3137 #define bfd_elf64_archive_truncate_arname \
3138                         _bfd_archive_coff_truncate_arname
3139 #define bfd_elf64_archive_read_ar_hdr   _bfd_archive_coff_read_ar_hdr
3140 #define bfd_elf64_archive_openr_next_archived_file \
3141                         _bfd_archive_coff_openr_next_archived_file
3142 #define bfd_elf64_archive_get_elt_at_index \
3143                         _bfd_archive_coff_get_elt_at_index
3144 #define bfd_elf64_archive_generic_stat_arch_elt \
3145                         _bfd_archive_coff_generic_stat_arch_elt
3146 #define bfd_elf64_archive_update_armap_timestamp \
3147                         _bfd_archive_coff_update_armap_timestamp
3148
3149 /* The SGI style (n)64 NewABI.  */
3150 #define TARGET_LITTLE_SYM               bfd_elf64_littlemips_vec
3151 #define TARGET_LITTLE_NAME              "elf64-littlemips"
3152 #define TARGET_BIG_SYM                  bfd_elf64_bigmips_vec
3153 #define TARGET_BIG_NAME                 "elf64-bigmips"
3154
3155 /* The SVR4 MIPS ABI says that this should be 0x10000, but Irix 5 uses
3156    a value of 0x1000, and we are compatible.
3157    FIXME: How does this affect NewABI?  */
3158 #define ELF_MAXPAGESIZE                 0x1000
3159
3160 #include "elf64-target.h"
3161
3162 /* The SYSV-style 'traditional' (n)64 NewABI.  */
3163 #undef TARGET_LITTLE_SYM
3164 #undef TARGET_LITTLE_NAME
3165 #undef TARGET_BIG_SYM
3166 #undef TARGET_BIG_NAME
3167
3168 #undef ELF_MAXPAGESIZE
3169
3170 #define TARGET_LITTLE_SYM               bfd_elf64_tradlittlemips_vec
3171 #define TARGET_LITTLE_NAME              "elf64-tradlittlemips"
3172 #define TARGET_BIG_SYM                  bfd_elf64_tradbigmips_vec
3173 #define TARGET_BIG_NAME                 "elf64-tradbigmips"
3174
3175 /* The SVR4 MIPS ABI says that this should be 0x10000, and Linux uses
3176    page sizes of up to that limit, so we need to respect it.  */
3177 #define ELF_MAXPAGESIZE                 0x10000
3178 #define elf64_bed                       elf64_tradbed
3179
3180 /* Include the target file again for this target.  */
3181 #include "elf64-target.h"