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
8This file is part of BFD, the Binary File Descriptor library.
9
10This program is free software; you can redistribute it and/or modify
11it under the terms of the GNU General Public License as published by
12the Free Software Foundation; either version 2 of the License, or
13(at your option) any later version.
14
15This program is distributed in the hope that it will be useful,
16but WITHOUT ANY WARRANTY; without even the implied warranty of
17MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18GNU General Public License for more details.
19
20You should have received a copy of the GNU General Public License
21along with this program; if not, write to the Free Software
22Foundation, 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
64static void mips_elf64_swap_reloc_in
65  (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
66static void mips_elf64_swap_reloca_in
67  (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
68static void mips_elf64_swap_reloc_out
69  (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
70static void mips_elf64_swap_reloca_out
71  (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
72static void mips_elf64_be_swap_reloc_in
73  (bfd *, const bfd_byte *, Elf_Internal_Rela *);
74static void mips_elf64_be_swap_reloc_out
75  (bfd *, const Elf_Internal_Rela *, bfd_byte *);
76static void mips_elf64_be_swap_reloca_in
77  (bfd *, const bfd_byte *, Elf_Internal_Rela *);
78static void mips_elf64_be_swap_reloca_out
79  (bfd *, const Elf_Internal_Rela *, bfd_byte *);
80static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
81  (bfd *, bfd_reloc_code_real_type);
82static reloc_howto_type *mips_elf64_rtype_to_howto
83  (unsigned int, bfd_boolean);
84static void mips_elf64_info_to_howto_rel
85  (bfd *, arelent *, Elf_Internal_Rela *);
86static void mips_elf64_info_to_howto_rela
87  (bfd *, arelent *, Elf_Internal_Rela *);
88static long mips_elf64_get_reloc_upper_bound
89  (bfd *, asection *);
90static long mips_elf64_canonicalize_reloc
91  (bfd *, asection *, arelent **, asymbol **);
92static long mips_elf64_get_dynamic_reloc_upper_bound
93  (bfd *);
94static long mips_elf64_canonicalize_dynamic_reloc
95  (bfd *, arelent **, asymbol **);
96static bfd_boolean mips_elf64_slurp_one_reloc_table
97  (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
98   asymbol **, bfd_boolean);
99static bfd_boolean mips_elf64_slurp_reloc_table
100  (bfd *, asection *, asymbol **, bfd_boolean);
101static void mips_elf64_write_relocs
102  (bfd *, asection *, void *);
103static void mips_elf64_write_rel
104  (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
105static void mips_elf64_write_rela
106  (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
107static bfd_reloc_status_type mips_elf64_gprel16_reloc
108  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
109static bfd_reloc_status_type mips_elf64_literal_reloc
110  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
111static bfd_reloc_status_type mips_elf64_gprel32_reloc
112  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
113static bfd_reloc_status_type mips_elf64_shift6_reloc
114  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
115static bfd_reloc_status_type mips16_gprel_reloc
116  (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
117static bfd_boolean mips_elf64_assign_gp
118  (bfd *, bfd_vma *);
119static bfd_reloc_status_type mips_elf64_final_gp
120  (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
121static bfd_boolean mips_elf64_object_p
122  (bfd *);
123static irix_compat_t elf64_mips_irix_compat
124  (bfd *);
125static bfd_boolean elf64_mips_grok_prstatus
126  (bfd *, Elf_Internal_Note *);
127static bfd_boolean elf64_mips_grok_psinfo
128  (bfd *, Elf_Internal_Note *);
129
130extern const bfd_target bfd_elf64_bigmips_vec;
131extern 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
140/* The relocation table used for SHT_REL sections.  */
141
142static 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
811static 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
1469static 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
1541static 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 */
1614static 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 */
1630static 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
1645/* 16 bit offset for pc-relative branches.  */
1646static 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.  */
1662static 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
1677/* Swap in a MIPS 64-bit Rel reloc.  */
1678
1679static void
1680mips_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
1694static void
1695mips_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
1709static void
1710mips_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
1723static void
1724mips_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
1738static void
1739mips_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
1761static void
1762mips_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
1784static void
1785mips_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
1805static void
1806mips_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
1829/* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
1830   dangerous relocation.  */
1831
1832static bfd_boolean
1833mips_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
1884static bfd_reloc_status_type
1885mips_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
1920static bfd_reloc_status_type
1921mips_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
1959static bfd_reloc_status_type
1960mips_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
2000static bfd_reloc_status_type
2001mips_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
2072static bfd_reloc_status_type
2073mips_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
2090static bfd_reloc_status_type
2091mips16_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
2135/* A mapping from BFD reloc types to MIPS ELF reloc types.  */
2136
2137struct elf_reloc_map {
2138  bfd_reloc_code_real_type bfd_val;
2139  enum elf_mips_reloc_type elf_val;
2140};
2141
2142static 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
2194static 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
2204static reloc_howto_type *
2205bfd_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
2240static reloc_howto_type *
2241bfd_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
2275static reloc_howto_type *
2276mips_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
2308static void
2309mips_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
2316static void
2317mips_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
2327static long
2328mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
2329{
2330  return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
2331}
2332
2333static long
2334mips_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
2344static long
2345mips_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
2364static long
2365mips_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
2410static bfd_boolean
2411mips_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
2580static bfd_boolean
2581mips_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
2655static void
2656mips_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
2718static void
2719mips_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
2816static void
2817mips_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
2915/* Set the right machine number for a MIPS ELF file.  */
2916
2917static bfd_boolean
2918mips_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.  */
2935static irix_compat_t
2936elf64_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
2945/* Support for core dump NOTE sections.  */
2946static bfd_boolean
2947elf64_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
2976static bfd_boolean
2977elf64_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
3006/* ECOFF swapping routines.  These are used when dealing with the
3007   .mdebug section, which is in the ECOFF debugging format.  */
3008static 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
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
3053const 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
3175extern bfd_boolean bfd_elf64_archive_slurp_armap
3176  (bfd *);
3177extern 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"
3226