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