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