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