xref: /netbsd-src/external/gpl3/gdb/dist/bfd/elf64-mips.c (revision 6a493d6bc668897c91594964a732d38505b70cbb)
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 /* Originally a VxWorks extension, but now used for other systems too.  */
2627 static reloc_howto_type elf_mips_copy_howto =
2628   HOWTO (R_MIPS_COPY,		/* type */
2629 	 0,			/* rightshift */
2630 	 0,			/* this one is variable size */
2631 	 0,			/* bitsize */
2632 	 FALSE,			/* pc_relative */
2633 	 0,			/* bitpos */
2634 	 complain_overflow_bitfield, /* complain_on_overflow */
2635 	 bfd_elf_generic_reloc,	/* special_function */
2636 	 "R_MIPS_COPY",		/* name */
2637 	 FALSE,			/* partial_inplace */
2638 	 0x0,         		/* src_mask */
2639 	 0x0,		        /* dst_mask */
2640 	 FALSE);		/* pcrel_offset */
2641 
2642 /* Originally a VxWorks extension, but now used for other systems too.  */
2643 static reloc_howto_type elf_mips_jump_slot_howto =
2644   HOWTO (R_MIPS_JUMP_SLOT,	/* type */
2645 	 0,			/* rightshift */
2646 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
2647 	 64,			/* bitsize */
2648 	 FALSE,			/* pc_relative */
2649 	 0,			/* bitpos */
2650 	 complain_overflow_bitfield, /* complain_on_overflow */
2651 	 bfd_elf_generic_reloc,	/* special_function */
2652 	 "R_MIPS_JUMP_SLOT",	/* name */
2653 	 FALSE,			/* partial_inplace */
2654 	 0x0,         		/* src_mask */
2655 	 0x0,		        /* dst_mask */
2656 	 FALSE);		/* pcrel_offset */
2657 
2658 /* Swap in a MIPS 64-bit Rel reloc.  */
2659 
2660 static void
2661 mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
2662 			  Elf64_Mips_Internal_Rela *dst)
2663 {
2664   dst->r_offset = H_GET_64 (abfd, src->r_offset);
2665   dst->r_sym = H_GET_32 (abfd, src->r_sym);
2666   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
2667   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
2668   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
2669   dst->r_type = H_GET_8 (abfd, src->r_type);
2670   dst->r_addend = 0;
2671 }
2672 
2673 /* Swap in a MIPS 64-bit Rela reloc.  */
2674 
2675 static void
2676 mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
2677 			   Elf64_Mips_Internal_Rela *dst)
2678 {
2679   dst->r_offset = H_GET_64 (abfd, src->r_offset);
2680   dst->r_sym = H_GET_32 (abfd, src->r_sym);
2681   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
2682   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
2683   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
2684   dst->r_type = H_GET_8 (abfd, src->r_type);
2685   dst->r_addend = H_GET_S64 (abfd, src->r_addend);
2686 }
2687 
2688 /* Swap out a MIPS 64-bit Rel reloc.  */
2689 
2690 static void
2691 mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
2692 			   Elf64_Mips_External_Rel *dst)
2693 {
2694   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
2695   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
2696   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
2697   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
2698   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
2699   H_PUT_8 (abfd, src->r_type, dst->r_type);
2700 }
2701 
2702 /* Swap out a MIPS 64-bit Rela reloc.  */
2703 
2704 static void
2705 mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
2706 			    Elf64_Mips_External_Rela *dst)
2707 {
2708   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
2709   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
2710   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
2711   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
2712   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
2713   H_PUT_8 (abfd, src->r_type, dst->r_type);
2714   H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
2715 }
2716 
2717 /* Swap in a MIPS 64-bit Rel reloc.  */
2718 
2719 static void
2720 mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
2721 			     Elf_Internal_Rela *dst)
2722 {
2723   Elf64_Mips_Internal_Rela mirel;
2724 
2725   mips_elf64_swap_reloc_in (abfd,
2726 			    (const Elf64_Mips_External_Rel *) src,
2727 			    &mirel);
2728 
2729   dst[0].r_offset = mirel.r_offset;
2730   dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
2731   dst[0].r_addend = 0;
2732   dst[1].r_offset = mirel.r_offset;
2733   dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
2734   dst[1].r_addend = 0;
2735   dst[2].r_offset = mirel.r_offset;
2736   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
2737   dst[2].r_addend = 0;
2738 }
2739 
2740 /* Swap in a MIPS 64-bit Rela reloc.  */
2741 
2742 static void
2743 mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
2744 			      Elf_Internal_Rela *dst)
2745 {
2746   Elf64_Mips_Internal_Rela mirela;
2747 
2748   mips_elf64_swap_reloca_in (abfd,
2749 			     (const Elf64_Mips_External_Rela *) src,
2750 			     &mirela);
2751 
2752   dst[0].r_offset = mirela.r_offset;
2753   dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
2754   dst[0].r_addend = mirela.r_addend;
2755   dst[1].r_offset = mirela.r_offset;
2756   dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
2757   dst[1].r_addend = 0;
2758   dst[2].r_offset = mirela.r_offset;
2759   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
2760   dst[2].r_addend = 0;
2761 }
2762 
2763 /* Swap out a MIPS 64-bit Rel reloc.  */
2764 
2765 static void
2766 mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
2767 			      bfd_byte *dst)
2768 {
2769   Elf64_Mips_Internal_Rela mirel;
2770 
2771   mirel.r_offset = src[0].r_offset;
2772   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
2773   BFD_ASSERT(src[0].r_offset == src[2].r_offset);
2774 
2775   mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
2776   mirel.r_sym = ELF64_R_SYM (src[0].r_info);
2777   mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
2778   mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
2779   mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
2780 
2781   mips_elf64_swap_reloc_out (abfd, &mirel,
2782 			     (Elf64_Mips_External_Rel *) dst);
2783 }
2784 
2785 /* Swap out a MIPS 64-bit Rela reloc.  */
2786 
2787 static void
2788 mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
2789 			       bfd_byte *dst)
2790 {
2791   Elf64_Mips_Internal_Rela mirela;
2792 
2793   mirela.r_offset = src[0].r_offset;
2794   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
2795   BFD_ASSERT(src[0].r_offset == src[2].r_offset);
2796 
2797   mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
2798   mirela.r_sym = ELF64_R_SYM (src[0].r_info);
2799   mirela.r_addend = src[0].r_addend;
2800   BFD_ASSERT(src[1].r_addend == 0);
2801   BFD_ASSERT(src[2].r_addend == 0);
2802 
2803   mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
2804   mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
2805   mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
2806 
2807   mips_elf64_swap_reloca_out (abfd, &mirela,
2808 			      (Elf64_Mips_External_Rela *) dst);
2809 }
2810 
2811 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
2812    dangerous relocation.  */
2813 
2814 static bfd_boolean
2815 mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
2816 {
2817   unsigned int count;
2818   asymbol **sym;
2819   unsigned int i;
2820 
2821   /* If we've already figured out what GP will be, just return it.  */
2822   *pgp = _bfd_get_gp_value (output_bfd);
2823   if (*pgp)
2824     return TRUE;
2825 
2826   count = bfd_get_symcount (output_bfd);
2827   sym = bfd_get_outsymbols (output_bfd);
2828 
2829   /* The linker script will have created a symbol named `_gp' with the
2830      appropriate value.  */
2831   if (sym == NULL)
2832     i = count;
2833   else
2834     {
2835       for (i = 0; i < count; i++, sym++)
2836 	{
2837 	  register const char *name;
2838 
2839 	  name = bfd_asymbol_name (*sym);
2840 	  if (*name == '_' && strcmp (name, "_gp") == 0)
2841 	    {
2842 	      *pgp = bfd_asymbol_value (*sym);
2843 	      _bfd_set_gp_value (output_bfd, *pgp);
2844 	      break;
2845 	    }
2846 	}
2847     }
2848 
2849   if (i >= count)
2850     {
2851       /* Only get the error once.  */
2852       *pgp = 4;
2853       _bfd_set_gp_value (output_bfd, *pgp);
2854       return FALSE;
2855     }
2856 
2857   return TRUE;
2858 }
2859 
2860 /* We have to figure out the gp value, so that we can adjust the
2861    symbol value correctly.  We look up the symbol _gp in the output
2862    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
2863    target data.  We don't need to adjust the symbol value for an
2864    external symbol if we are producing relocatable output.  */
2865 
2866 static bfd_reloc_status_type
2867 mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
2868 		     char **error_message, bfd_vma *pgp)
2869 {
2870   if (bfd_is_und_section (symbol->section)
2871       && ! relocatable)
2872     {
2873       *pgp = 0;
2874       return bfd_reloc_undefined;
2875     }
2876 
2877   *pgp = _bfd_get_gp_value (output_bfd);
2878   if (*pgp == 0
2879       && (! relocatable
2880 	  || (symbol->flags & BSF_SECTION_SYM) != 0))
2881     {
2882       if (relocatable)
2883 	{
2884 	  /* Make up a value.  */
2885 	  *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
2886 	  _bfd_set_gp_value (output_bfd, *pgp);
2887 	}
2888       else if (!mips_elf64_assign_gp (output_bfd, pgp))
2889 	{
2890 	  *error_message =
2891 	    (char *) _("GP relative relocation when _gp not defined");
2892 	  return bfd_reloc_dangerous;
2893 	}
2894     }
2895 
2896   return bfd_reloc_ok;
2897 }
2898 
2899 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
2900    become the offset from the gp register.  */
2901 
2902 static bfd_reloc_status_type
2903 mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2904 			  void *data, asection *input_section, bfd *output_bfd,
2905 			  char **error_message)
2906 {
2907   bfd_boolean relocatable;
2908   bfd_reloc_status_type ret;
2909   bfd_vma gp;
2910 
2911   /* If we're relocating, and this is an external symbol, we don't want
2912      to change anything.  */
2913   if (output_bfd != NULL
2914       && (symbol->flags & BSF_SECTION_SYM) == 0
2915       && (symbol->flags & BSF_LOCAL) != 0)
2916     {
2917       reloc_entry->address += input_section->output_offset;
2918       return bfd_reloc_ok;
2919     }
2920 
2921   if (output_bfd != NULL)
2922     relocatable = TRUE;
2923   else
2924     {
2925       relocatable = FALSE;
2926       output_bfd = symbol->section->output_section->owner;
2927     }
2928 
2929   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2930 			     &gp);
2931   if (ret != bfd_reloc_ok)
2932     return ret;
2933 
2934   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2935 					input_section, relocatable,
2936 					data, gp);
2937 }
2938 
2939 /* Do a R_MIPS_LITERAL relocation.  */
2940 
2941 static bfd_reloc_status_type
2942 mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2943 			  void *data, asection *input_section, bfd *output_bfd,
2944 			  char **error_message)
2945 {
2946   bfd_boolean relocatable;
2947   bfd_reloc_status_type ret;
2948   bfd_vma gp;
2949 
2950   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
2951   if (output_bfd != NULL
2952       && (symbol->flags & BSF_SECTION_SYM) == 0
2953       && (symbol->flags & BSF_LOCAL) != 0)
2954     {
2955       *error_message = (char *)
2956 	_("literal relocation occurs for an external symbol");
2957       return bfd_reloc_outofrange;
2958     }
2959 
2960   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
2961   if (output_bfd != NULL)
2962     relocatable = TRUE;
2963   else
2964     {
2965       relocatable = FALSE;
2966       output_bfd = symbol->section->output_section->owner;
2967     }
2968 
2969   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2970 			     &gp);
2971   if (ret != bfd_reloc_ok)
2972     return ret;
2973 
2974   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2975 					input_section, relocatable,
2976 					data, gp);
2977 }
2978 
2979 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
2980    become the offset from the gp register.  */
2981 
2982 static bfd_reloc_status_type
2983 mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2984 			  void *data, asection *input_section, bfd *output_bfd,
2985 			  char **error_message)
2986 {
2987   bfd_boolean relocatable;
2988   bfd_reloc_status_type ret;
2989   bfd_vma gp;
2990   bfd_vma relocation;
2991   bfd_vma val;
2992 
2993   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
2994   if (output_bfd != NULL
2995       && (symbol->flags & BSF_SECTION_SYM) == 0
2996       && (symbol->flags & BSF_LOCAL) != 0)
2997     {
2998       *error_message = (char *)
2999 	_("32bits gp relative relocation occurs for an external symbol");
3000       return bfd_reloc_outofrange;
3001     }
3002 
3003   if (output_bfd != NULL)
3004     relocatable = TRUE;
3005   else
3006     {
3007       relocatable = FALSE;
3008       output_bfd = symbol->section->output_section->owner;
3009     }
3010 
3011   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
3012 			     error_message, &gp);
3013   if (ret != bfd_reloc_ok)
3014     return ret;
3015 
3016   if (bfd_is_com_section (symbol->section))
3017     relocation = 0;
3018   else
3019     relocation = symbol->value;
3020 
3021   relocation += symbol->section->output_section->vma;
3022   relocation += symbol->section->output_offset;
3023 
3024   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
3025     return bfd_reloc_outofrange;
3026 
3027   /* Set val to the offset into the section or symbol.  */
3028   val = reloc_entry->addend;
3029 
3030   if (reloc_entry->howto->partial_inplace)
3031     val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
3032 
3033   /* Adjust val for the final section location and GP value.  If we
3034      are producing relocatable output, we don't want to do this for
3035      an external symbol.  */
3036   if (! relocatable
3037       || (symbol->flags & BSF_SECTION_SYM) != 0)
3038     val += relocation - gp;
3039 
3040   if (reloc_entry->howto->partial_inplace)
3041     bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
3042   else
3043     reloc_entry->addend = val;
3044 
3045   if (relocatable)
3046     reloc_entry->address += input_section->output_offset;
3047 
3048   return bfd_reloc_ok;
3049 }
3050 
3051 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
3052    the rest is at bits 6-10. The bitpos already got right by the howto.  */
3053 
3054 static bfd_reloc_status_type
3055 mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3056 			 void *data, asection *input_section, bfd *output_bfd,
3057 			 char **error_message)
3058 {
3059   if (reloc_entry->howto->partial_inplace)
3060     {
3061       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
3062 			     | (reloc_entry->addend & 0x00000800) >> 9);
3063     }
3064 
3065   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
3066 				      input_section, output_bfd,
3067 				      error_message);
3068 }
3069 
3070 /* Handle a mips16 GP relative reloc.  */
3071 
3072 static bfd_reloc_status_type
3073 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3074 		    void *data, asection *input_section, bfd *output_bfd,
3075 		    char **error_message)
3076 {
3077   bfd_boolean relocatable;
3078   bfd_reloc_status_type ret;
3079   bfd_byte *location;
3080   bfd_vma gp;
3081 
3082   /* If we're relocating, and this is an external symbol, we don't want
3083      to change anything.  */
3084   if (output_bfd != NULL
3085       && (symbol->flags & BSF_SECTION_SYM) == 0
3086       && (symbol->flags & BSF_LOCAL) != 0)
3087     {
3088       reloc_entry->address += input_section->output_offset;
3089       return bfd_reloc_ok;
3090     }
3091 
3092   if (output_bfd != NULL)
3093     relocatable = TRUE;
3094   else
3095     {
3096       relocatable = FALSE;
3097       output_bfd = symbol->section->output_section->owner;
3098     }
3099 
3100   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3101 			     &gp);
3102   if (ret != bfd_reloc_ok)
3103     return ret;
3104 
3105   location = (bfd_byte *) data + reloc_entry->address;
3106   _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
3107 				 location);
3108   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3109 				       input_section, relocatable,
3110 				       data, gp);
3111   _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
3112 			       location);
3113 
3114   return ret;
3115 }
3116 
3117 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
3118 
3119 struct elf_reloc_map {
3120   bfd_reloc_code_real_type bfd_val;
3121   enum elf_mips_reloc_type elf_val;
3122 };
3123 
3124 static const struct elf_reloc_map mips_reloc_map[] =
3125 {
3126   { BFD_RELOC_NONE, R_MIPS_NONE },
3127   { BFD_RELOC_16, R_MIPS_16 },
3128   { BFD_RELOC_32, R_MIPS_32 },
3129   /* There is no BFD reloc for R_MIPS_REL32.  */
3130   { BFD_RELOC_64, R_MIPS_64 },
3131   { BFD_RELOC_CTOR, R_MIPS_64 },
3132   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
3133   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
3134   { BFD_RELOC_LO16, R_MIPS_LO16 },
3135   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
3136   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
3137   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
3138   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
3139   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
3140   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
3141   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
3142   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
3143   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
3144   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
3145   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
3146   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
3147   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
3148   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
3149   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
3150   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
3151   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
3152   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
3153   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
3154   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
3155   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
3156   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
3157   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
3158   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
3159   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
3160   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
3161   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
3162   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
3163   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
3164   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
3165   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
3166   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
3167   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
3168   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
3169   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
3170   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
3171   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
3172   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
3173   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
3174 };
3175 
3176 static const struct elf_reloc_map mips16_reloc_map[] =
3177 {
3178   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
3179   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
3180   { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
3181   { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
3182   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
3183   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
3184   { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
3185   { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
3186   { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
3187     R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
3188   { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
3189     R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
3190   { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
3191   { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
3192   { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
3193 };
3194 
3195 static const struct elf_reloc_map micromips_reloc_map[] =
3196 {
3197   { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
3198   { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
3199   { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
3200   { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
3201   { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
3202   { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
3203   { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
3204   { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
3205   { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
3206   { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
3207   { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
3208   { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
3209   { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
3210   { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
3211   { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
3212   { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
3213   { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
3214   { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
3215   { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
3216   { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
3217   { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
3218   { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
3219 };
3220 /* Given a BFD reloc type, return a howto structure.  */
3221 
3222 static reloc_howto_type *
3223 bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3224 				 bfd_reloc_code_real_type code)
3225 {
3226   unsigned int i;
3227   /* FIXME: We default to RELA here instead of choosing the right
3228      relocation variant.  */
3229   reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
3230   reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
3231   reloc_howto_type *howto_micromips_table = micromips_elf64_howto_table_rela;
3232 
3233   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
3234        i++)
3235     {
3236       if (mips_reloc_map[i].bfd_val == code)
3237 	return &howto_table[(int) mips_reloc_map[i].elf_val];
3238     }
3239 
3240   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
3241        i++)
3242     {
3243       if (mips16_reloc_map[i].bfd_val == code)
3244 	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
3245     }
3246 
3247   for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
3248        i++)
3249     {
3250       if (micromips_reloc_map[i].bfd_val == code)
3251 	return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
3252     }
3253 
3254   switch (code)
3255     {
3256     case BFD_RELOC_VTABLE_INHERIT:
3257       return &elf_mips_gnu_vtinherit_howto;
3258     case BFD_RELOC_VTABLE_ENTRY:
3259       return &elf_mips_gnu_vtentry_howto;
3260     case BFD_RELOC_MIPS_COPY:
3261       return &elf_mips_copy_howto;
3262     case BFD_RELOC_MIPS_JUMP_SLOT:
3263       return &elf_mips_jump_slot_howto;
3264     default:
3265       bfd_set_error (bfd_error_bad_value);
3266       return NULL;
3267     }
3268 }
3269 
3270 static reloc_howto_type *
3271 bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3272 				 const char *r_name)
3273 {
3274   unsigned int i;
3275 
3276   for (i = 0;
3277        i < (sizeof (mips_elf64_howto_table_rela)
3278 	    / sizeof (mips_elf64_howto_table_rela[0])); i++)
3279     if (mips_elf64_howto_table_rela[i].name != NULL
3280 	&& strcasecmp (mips_elf64_howto_table_rela[i].name, r_name) == 0)
3281       return &mips_elf64_howto_table_rela[i];
3282 
3283   for (i = 0;
3284        i < (sizeof (mips16_elf64_howto_table_rela)
3285 	    / sizeof (mips16_elf64_howto_table_rela[0]));
3286        i++)
3287     if (mips16_elf64_howto_table_rela[i].name != NULL
3288 	&& strcasecmp (mips16_elf64_howto_table_rela[i].name, r_name) == 0)
3289       return &mips16_elf64_howto_table_rela[i];
3290 
3291   for (i = 0;
3292        i < (sizeof (micromips_elf64_howto_table_rela)
3293 	    / sizeof (micromips_elf64_howto_table_rela[0]));
3294        i++)
3295     if (micromips_elf64_howto_table_rela[i].name != NULL
3296 	&& strcasecmp (micromips_elf64_howto_table_rela[i].name, r_name) == 0)
3297       return &micromips_elf64_howto_table_rela[i];
3298 
3299   if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
3300     return &elf_mips_gnu_vtinherit_howto;
3301   if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
3302     return &elf_mips_gnu_vtentry_howto;
3303   if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
3304     return &elf_mips_gnu_rel16_s2;
3305   if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
3306     return &elf_mips_gnu_rela16_s2;
3307   if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
3308     return &elf_mips_copy_howto;
3309   if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
3310     return &elf_mips_jump_slot_howto;
3311 
3312   return NULL;
3313 }
3314 
3315 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
3316 
3317 static reloc_howto_type *
3318 mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
3319 {
3320   switch (r_type)
3321     {
3322     case R_MIPS_GNU_VTINHERIT:
3323       return &elf_mips_gnu_vtinherit_howto;
3324     case R_MIPS_GNU_VTENTRY:
3325       return &elf_mips_gnu_vtentry_howto;
3326     case R_MIPS_GNU_REL16_S2:
3327       if (rela_p)
3328 	return &elf_mips_gnu_rela16_s2;
3329       else
3330 	return &elf_mips_gnu_rel16_s2;
3331     case R_MIPS_COPY:
3332       return &elf_mips_copy_howto;
3333     case R_MIPS_JUMP_SLOT:
3334       return &elf_mips_jump_slot_howto;
3335     default:
3336       if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
3337 	{
3338 	  if (rela_p)
3339 	    return &micromips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
3340 	  else
3341 	    return &micromips_elf64_howto_table_rel[r_type - R_MICROMIPS_min];
3342 	}
3343       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
3344 	{
3345 	  if (rela_p)
3346 	    return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
3347 	  else
3348 	    return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
3349 	}
3350       BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
3351       if (rela_p)
3352 	return &mips_elf64_howto_table_rela[r_type];
3353       else
3354 	return &mips_elf64_howto_table_rel[r_type];
3355       break;
3356     }
3357 }
3358 
3359 /* Prevent relocation handling by bfd for MIPS ELF64.  */
3360 
3361 static void
3362 mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
3363 			      arelent *cache_ptr ATTRIBUTE_UNUSED,
3364 			      Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
3365 {
3366   BFD_ASSERT (0);
3367 }
3368 
3369 static void
3370 mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
3371 			       arelent *cache_ptr ATTRIBUTE_UNUSED,
3372 			       Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
3373 {
3374   BFD_ASSERT (0);
3375 }
3376 
3377 /* Since each entry in an SHT_REL or SHT_RELA section can represent up
3378    to three relocs, we must tell the user to allocate more space.  */
3379 
3380 static long
3381 mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
3382 {
3383   return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
3384 }
3385 
3386 static long
3387 mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
3388 {
3389   return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
3390 }
3391 
3392 /* We must also copy more relocations than the corresponding functions
3393    in elf.c would, so the two following functions are slightly
3394    modified from elf.c, that multiply the external relocation count by
3395    3 to obtain the internal relocation count.  */
3396 
3397 static long
3398 mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section,
3399 			       arelent **relptr, asymbol **symbols)
3400 {
3401   arelent *tblptr;
3402   unsigned int i;
3403   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3404 
3405   if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
3406     return -1;
3407 
3408   tblptr = section->relocation;
3409   for (i = 0; i < section->reloc_count * 3; i++)
3410     *relptr++ = tblptr++;
3411 
3412   *relptr = NULL;
3413 
3414   return section->reloc_count * 3;
3415 }
3416 
3417 static long
3418 mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
3419 				       asymbol **syms)
3420 {
3421   bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3422   asection *s;
3423   long ret;
3424 
3425   if (elf_dynsymtab (abfd) == 0)
3426     {
3427       bfd_set_error (bfd_error_invalid_operation);
3428       return -1;
3429     }
3430 
3431   slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3432   ret = 0;
3433   for (s = abfd->sections; s != NULL; s = s->next)
3434     {
3435       if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
3436 	  && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
3437 	      || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
3438 	{
3439 	  arelent *p;
3440 	  long count, i;
3441 
3442 	  if (! (*slurp_relocs) (abfd, s, syms, TRUE))
3443 	    return -1;
3444 	  count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3;
3445 	  p = s->relocation;
3446 	  for (i = 0; i < count; i++)
3447 	    *storage++ = p++;
3448 	  ret += count;
3449 	}
3450     }
3451 
3452   *storage = NULL;
3453 
3454   return ret;
3455 }
3456 
3457 /* Read the relocations from one reloc section.  This is mostly copied
3458    from elfcode.h, except for the changes to expand one external
3459    relocation to 3 internal ones.  We must unfortunately set
3460    reloc_count to the number of external relocations, because a lot of
3461    generic code seems to depend on this.  */
3462 
3463 static bfd_boolean
3464 mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
3465 				  Elf_Internal_Shdr *rel_hdr,
3466 				  bfd_size_type reloc_count,
3467 				  arelent *relents, asymbol **symbols,
3468 				  bfd_boolean dynamic)
3469 {
3470   void *allocated;
3471   bfd_byte *native_relocs;
3472   arelent *relent;
3473   bfd_vma i;
3474   int entsize;
3475   bfd_boolean rela_p;
3476 
3477   allocated = bfd_malloc (rel_hdr->sh_size);
3478   if (allocated == NULL)
3479     return FALSE;
3480 
3481   if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
3482       || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
3483 	  != rel_hdr->sh_size))
3484     goto error_return;
3485 
3486   native_relocs = allocated;
3487 
3488   entsize = rel_hdr->sh_entsize;
3489   BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
3490 	      || entsize == sizeof (Elf64_Mips_External_Rela));
3491 
3492   if (entsize == sizeof (Elf64_Mips_External_Rel))
3493     rela_p = FALSE;
3494   else
3495     rela_p = TRUE;
3496 
3497   for (i = 0, relent = relents;
3498        i < reloc_count;
3499        i++, native_relocs += entsize)
3500     {
3501       Elf64_Mips_Internal_Rela rela;
3502       bfd_boolean used_sym, used_ssym;
3503       int ir;
3504 
3505       if (entsize == sizeof (Elf64_Mips_External_Rela))
3506 	mips_elf64_swap_reloca_in (abfd,
3507 				   (Elf64_Mips_External_Rela *) native_relocs,
3508 				   &rela);
3509       else
3510 	mips_elf64_swap_reloc_in (abfd,
3511 				  (Elf64_Mips_External_Rel *) native_relocs,
3512 				  &rela);
3513 
3514       /* Each entry represents exactly three actual relocations.  */
3515 
3516       used_sym = FALSE;
3517       used_ssym = FALSE;
3518       for (ir = 0; ir < 3; ir++)
3519 	{
3520 	  enum elf_mips_reloc_type type;
3521 
3522 	  switch (ir)
3523 	    {
3524 	    default:
3525 	      abort ();
3526 	    case 0:
3527 	      type = (enum elf_mips_reloc_type) rela.r_type;
3528 	      break;
3529 	    case 1:
3530 	      type = (enum elf_mips_reloc_type) rela.r_type2;
3531 	      break;
3532 	    case 2:
3533 	      type = (enum elf_mips_reloc_type) rela.r_type3;
3534 	      break;
3535 	    }
3536 
3537 	  /* Some types require symbols, whereas some do not.  */
3538 	  switch (type)
3539 	    {
3540 	    case R_MIPS_NONE:
3541 	    case R_MIPS_LITERAL:
3542 	    case R_MIPS_INSERT_A:
3543 	    case R_MIPS_INSERT_B:
3544 	    case R_MIPS_DELETE:
3545 	      relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3546 	      break;
3547 
3548 	    default:
3549 	      if (! used_sym)
3550 		{
3551 		  if (rela.r_sym == STN_UNDEF)
3552 		    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3553 		  else
3554 		    {
3555 		      asymbol **ps, *s;
3556 
3557 		      ps = symbols + rela.r_sym - 1;
3558 		      s = *ps;
3559 		      if ((s->flags & BSF_SECTION_SYM) == 0)
3560 			relent->sym_ptr_ptr = ps;
3561 		      else
3562 			relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
3563 		    }
3564 
3565 		  used_sym = TRUE;
3566 		}
3567 	      else if (! used_ssym)
3568 		{
3569 		  switch (rela.r_ssym)
3570 		    {
3571 		    case RSS_UNDEF:
3572 		      relent->sym_ptr_ptr =
3573 			bfd_abs_section_ptr->symbol_ptr_ptr;
3574 		      break;
3575 
3576 		    case RSS_GP:
3577 		    case RSS_GP0:
3578 		    case RSS_LOC:
3579 		      /* FIXME: I think these need to be handled using
3580 			 special howto structures.  */
3581 		      BFD_ASSERT (0);
3582 		      break;
3583 
3584 		    default:
3585 		      BFD_ASSERT (0);
3586 		      break;
3587 		    }
3588 
3589 		  used_ssym = TRUE;
3590 		}
3591 	      else
3592 		relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3593 
3594 	      break;
3595 	    }
3596 
3597 	  /* The address of an ELF reloc is section relative for an
3598 	     object file, and absolute for an executable file or
3599 	     shared library.  The address of a BFD reloc is always
3600 	     section relative.  */
3601 	  if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
3602 	    relent->address = rela.r_offset;
3603 	  else
3604 	    relent->address = rela.r_offset - asect->vma;
3605 
3606 	  relent->addend = rela.r_addend;
3607 
3608 	  relent->howto = mips_elf64_rtype_to_howto (type, rela_p);
3609 
3610 	  ++relent;
3611 	}
3612     }
3613 
3614   asect->reloc_count += (relent - relents) / 3;
3615 
3616   if (allocated != NULL)
3617     free (allocated);
3618 
3619   return TRUE;
3620 
3621  error_return:
3622   if (allocated != NULL)
3623     free (allocated);
3624   return FALSE;
3625 }
3626 
3627 /* Read the relocations.  On Irix 6, there can be two reloc sections
3628    associated with a single data section.  This is copied from
3629    elfcode.h as well, with changes as small as accounting for 3
3630    internal relocs per external reloc and resetting reloc_count to
3631    zero before processing the relocs of a section.  */
3632 
3633 static bfd_boolean
3634 mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
3635 			      asymbol **symbols, bfd_boolean dynamic)
3636 {
3637   struct bfd_elf_section_data * const d = elf_section_data (asect);
3638   Elf_Internal_Shdr *rel_hdr;
3639   Elf_Internal_Shdr *rel_hdr2;
3640   bfd_size_type reloc_count;
3641   bfd_size_type reloc_count2;
3642   arelent *relents;
3643   bfd_size_type amt;
3644 
3645   if (asect->relocation != NULL)
3646     return TRUE;
3647 
3648   if (! dynamic)
3649     {
3650       if ((asect->flags & SEC_RELOC) == 0
3651 	  || asect->reloc_count == 0)
3652 	return TRUE;
3653 
3654       rel_hdr = d->rel.hdr;
3655       reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
3656       rel_hdr2 = d->rela.hdr;
3657       reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
3658 
3659       BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
3660       BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
3661 		  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
3662 
3663     }
3664   else
3665     {
3666       /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
3667 	 case because relocations against this section may use the
3668 	 dynamic symbol table, and in that case bfd_section_from_shdr
3669 	 in elf.c does not update the RELOC_COUNT.  */
3670       if (asect->size == 0)
3671 	return TRUE;
3672 
3673       rel_hdr = &d->this_hdr;
3674       reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
3675       rel_hdr2 = NULL;
3676       reloc_count2 = 0;
3677     }
3678 
3679   /* Allocate space for 3 arelent structures for each Rel structure.  */
3680   amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
3681   relents = bfd_alloc (abfd, amt);
3682   if (relents == NULL)
3683     return FALSE;
3684 
3685   /* The slurp_one_reloc_table routine increments reloc_count.  */
3686   asect->reloc_count = 0;
3687 
3688   if (rel_hdr != NULL
3689       && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
3690 					     rel_hdr, reloc_count,
3691 					     relents,
3692 					     symbols, dynamic))
3693     return FALSE;
3694   if (rel_hdr2 != NULL
3695       && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
3696 					     rel_hdr2, reloc_count2,
3697 					     relents + reloc_count * 3,
3698 					     symbols, dynamic))
3699     return FALSE;
3700 
3701   asect->relocation = relents;
3702   return TRUE;
3703 }
3704 
3705 /* Write out the relocations.  */
3706 
3707 static void
3708 mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
3709 {
3710   bfd_boolean *failedp = data;
3711   int count;
3712   Elf_Internal_Shdr *rel_hdr;
3713   unsigned int idx;
3714 
3715   /* If we have already failed, don't do anything.  */
3716   if (*failedp)
3717     return;
3718 
3719   if ((sec->flags & SEC_RELOC) == 0)
3720     return;
3721 
3722   /* The linker backend writes the relocs out itself, and sets the
3723      reloc_count field to zero to inhibit writing them here.  Also,
3724      sometimes the SEC_RELOC flag gets set even when there aren't any
3725      relocs.  */
3726   if (sec->reloc_count == 0)
3727     return;
3728 
3729   /* We can combine up to three relocs that refer to the same address
3730      if the latter relocs have no associated symbol.  */
3731   count = 0;
3732   for (idx = 0; idx < sec->reloc_count; idx++)
3733     {
3734       bfd_vma addr;
3735       unsigned int i;
3736 
3737       ++count;
3738 
3739       addr = sec->orelocation[idx]->address;
3740       for (i = 0; i < 2; i++)
3741 	{
3742 	  arelent *r;
3743 
3744 	  if (idx + 1 >= sec->reloc_count)
3745 	    break;
3746 	  r = sec->orelocation[idx + 1];
3747 	  if (r->address != addr
3748 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
3749 	      || (*r->sym_ptr_ptr)->value != 0)
3750 	    break;
3751 
3752 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
3753 
3754 	  ++idx;
3755 	}
3756     }
3757 
3758   rel_hdr = _bfd_elf_single_rel_hdr (sec);
3759 
3760   /* Do the actual relocation.  */
3761 
3762   if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
3763     mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
3764   else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
3765     mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
3766   else
3767     BFD_ASSERT (0);
3768 }
3769 
3770 static void
3771 mips_elf64_write_rel (bfd *abfd, asection *sec,
3772 		      Elf_Internal_Shdr *rel_hdr,
3773 		      int *count, void *data)
3774 {
3775   bfd_boolean *failedp = data;
3776   Elf64_Mips_External_Rel *ext_rel;
3777   unsigned int idx;
3778   asymbol *last_sym = 0;
3779   int last_sym_idx = 0;
3780 
3781   rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
3782   rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
3783   if (rel_hdr->contents == NULL)
3784     {
3785       *failedp = TRUE;
3786       return;
3787     }
3788 
3789   ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
3790   for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
3791     {
3792       arelent *ptr;
3793       Elf64_Mips_Internal_Rela int_rel;
3794       asymbol *sym;
3795       int n;
3796       unsigned int i;
3797 
3798       ptr = sec->orelocation[idx];
3799 
3800       /* The address of an ELF reloc is section relative for an object
3801 	 file, and absolute for an executable file or shared library.
3802 	 The address of a BFD reloc is always section relative.  */
3803       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
3804 	int_rel.r_offset = ptr->address;
3805       else
3806 	int_rel.r_offset = ptr->address + sec->vma;
3807 
3808       sym = *ptr->sym_ptr_ptr;
3809       if (sym == last_sym)
3810 	n = last_sym_idx;
3811       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
3812 	n = STN_UNDEF;
3813       else
3814 	{
3815 	  last_sym = sym;
3816 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
3817 	  if (n < 0)
3818 	    {
3819 	      *failedp = TRUE;
3820 	      return;
3821 	    }
3822 	  last_sym_idx = n;
3823 	}
3824 
3825       int_rel.r_sym = n;
3826       int_rel.r_ssym = RSS_UNDEF;
3827 
3828       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
3829 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
3830 	{
3831 	  *failedp = TRUE;
3832 	  return;
3833 	}
3834 
3835       int_rel.r_type = ptr->howto->type;
3836       int_rel.r_type2 = (int) R_MIPS_NONE;
3837       int_rel.r_type3 = (int) R_MIPS_NONE;
3838 
3839       for (i = 0; i < 2; i++)
3840 	{
3841 	  arelent *r;
3842 
3843 	  if (idx + 1 >= sec->reloc_count)
3844 	    break;
3845 	  r = sec->orelocation[idx + 1];
3846 	  if (r->address != ptr->address
3847 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
3848 	      || (*r->sym_ptr_ptr)->value != 0)
3849 	    break;
3850 
3851 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
3852 
3853 	  if (i == 0)
3854 	    int_rel.r_type2 = r->howto->type;
3855 	  else
3856 	    int_rel.r_type3 = r->howto->type;
3857 
3858 	  ++idx;
3859 	}
3860 
3861       mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
3862     }
3863 
3864   BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
3865 	      == *count);
3866 }
3867 
3868 static void
3869 mips_elf64_write_rela (bfd *abfd, asection *sec,
3870 		       Elf_Internal_Shdr *rela_hdr,
3871 		       int *count, void *data)
3872 {
3873   bfd_boolean *failedp = data;
3874   Elf64_Mips_External_Rela *ext_rela;
3875   unsigned int idx;
3876   asymbol *last_sym = 0;
3877   int last_sym_idx = 0;
3878 
3879   rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
3880   rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
3881   if (rela_hdr->contents == NULL)
3882     {
3883       *failedp = TRUE;
3884       return;
3885     }
3886 
3887   ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
3888   for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
3889     {
3890       arelent *ptr;
3891       Elf64_Mips_Internal_Rela int_rela;
3892       asymbol *sym;
3893       int n;
3894       unsigned int i;
3895 
3896       ptr = sec->orelocation[idx];
3897 
3898       /* The address of an ELF reloc is section relative for an object
3899 	 file, and absolute for an executable file or shared library.
3900 	 The address of a BFD reloc is always section relative.  */
3901       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
3902 	int_rela.r_offset = ptr->address;
3903       else
3904 	int_rela.r_offset = ptr->address + sec->vma;
3905 
3906       sym = *ptr->sym_ptr_ptr;
3907       if (sym == last_sym)
3908 	n = last_sym_idx;
3909       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
3910 	n = STN_UNDEF;
3911       else
3912 	{
3913 	  last_sym = sym;
3914 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
3915 	  if (n < 0)
3916 	    {
3917 	      *failedp = TRUE;
3918 	      return;
3919 	    }
3920 	  last_sym_idx = n;
3921 	}
3922 
3923       int_rela.r_sym = n;
3924       int_rela.r_addend = ptr->addend;
3925       int_rela.r_ssym = RSS_UNDEF;
3926 
3927       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
3928 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
3929 	{
3930 	  *failedp = TRUE;
3931 	  return;
3932 	}
3933 
3934       int_rela.r_type = ptr->howto->type;
3935       int_rela.r_type2 = (int) R_MIPS_NONE;
3936       int_rela.r_type3 = (int) R_MIPS_NONE;
3937 
3938       for (i = 0; i < 2; i++)
3939 	{
3940 	  arelent *r;
3941 
3942 	  if (idx + 1 >= sec->reloc_count)
3943 	    break;
3944 	  r = sec->orelocation[idx + 1];
3945 	  if (r->address != ptr->address
3946 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
3947 	      || (*r->sym_ptr_ptr)->value != 0)
3948 	    break;
3949 
3950 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
3951 
3952 	  if (i == 0)
3953 	    int_rela.r_type2 = r->howto->type;
3954 	  else
3955 	    int_rela.r_type3 = r->howto->type;
3956 
3957 	  ++idx;
3958 	}
3959 
3960       mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
3961     }
3962 
3963   BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
3964 	      == *count);
3965 }
3966 
3967 /* Set the right machine number for a MIPS ELF file.  */
3968 
3969 static bfd_boolean
3970 mips_elf64_object_p (bfd *abfd)
3971 {
3972   unsigned long mach;
3973 
3974   /* Irix 6 is broken.  Object file symbol tables are not always
3975      sorted correctly such that local symbols precede global symbols,
3976      and the sh_info field in the symbol table is not always right.  */
3977   if (elf64_mips_irix_compat (abfd) != ict_none)
3978     elf_bad_symtab (abfd) = TRUE;
3979 
3980   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
3981   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
3982   return TRUE;
3983 }
3984 
3985 /* Depending on the target vector we generate some version of Irix
3986    executables or "normal" MIPS ELF ABI executables.  */
3987 static irix_compat_t
3988 elf64_mips_irix_compat (bfd *abfd)
3989 {
3990   if ((abfd->xvec == &bfd_elf64_bigmips_vec)
3991       || (abfd->xvec == &bfd_elf64_littlemips_vec))
3992     return ict_irix6;
3993   else
3994     return ict_none;
3995 }
3996 
3997 /* Support for core dump NOTE sections.  */
3998 static bfd_boolean
3999 elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
4000 {
4001   int offset;
4002   unsigned int size;
4003 
4004   switch (note->descsz)
4005     {
4006       default:
4007 	return FALSE;
4008 
4009       case 480:		/* Linux/MIPS - N64 kernel */
4010 	/* pr_cursig */
4011 	elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
4012 
4013 	/* pr_pid */
4014 	elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
4015 
4016 	/* pr_reg */
4017 	offset = 112;
4018 	size = 360;
4019 
4020 	break;
4021     }
4022 
4023   /* Make a ".reg/999" section.  */
4024   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
4025 					  size, note->descpos + offset);
4026 }
4027 
4028 static bfd_boolean
4029 elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
4030 {
4031   switch (note->descsz)
4032     {
4033       default:
4034 	return FALSE;
4035 
4036       case 136:		/* Linux/MIPS - N64 kernel elf_prpsinfo */
4037 	elf_tdata (abfd)->core->program
4038 	 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
4039 	elf_tdata (abfd)->core->command
4040 	 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
4041     }
4042 
4043   /* Note that for some reason, a spurious space is tacked
4044      onto the end of the args in some (at least one anyway)
4045      implementations, so strip it off if it exists.  */
4046 
4047   {
4048     char *command = elf_tdata (abfd)->core->command;
4049     int n = strlen (command);
4050 
4051     if (0 < n && command[n - 1] == ' ')
4052       command[n - 1] = '\0';
4053   }
4054 
4055   return TRUE;
4056 }
4057 
4058 /* ECOFF swapping routines.  These are used when dealing with the
4059    .mdebug section, which is in the ECOFF debugging format.  */
4060 static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
4061 {
4062   /* Symbol table magic number.  */
4063   magicSym2,
4064   /* Alignment of debugging information.  E.g., 4.  */
4065   8,
4066   /* Sizes of external symbolic information.  */
4067   sizeof (struct hdr_ext),
4068   sizeof (struct dnr_ext),
4069   sizeof (struct pdr_ext),
4070   sizeof (struct sym_ext),
4071   sizeof (struct opt_ext),
4072   sizeof (struct fdr_ext),
4073   sizeof (struct rfd_ext),
4074   sizeof (struct ext_ext),
4075   /* Functions to swap in external symbolic data.  */
4076   ecoff_swap_hdr_in,
4077   ecoff_swap_dnr_in,
4078   ecoff_swap_pdr_in,
4079   ecoff_swap_sym_in,
4080   ecoff_swap_opt_in,
4081   ecoff_swap_fdr_in,
4082   ecoff_swap_rfd_in,
4083   ecoff_swap_ext_in,
4084   _bfd_ecoff_swap_tir_in,
4085   _bfd_ecoff_swap_rndx_in,
4086   /* Functions to swap out external symbolic data.  */
4087   ecoff_swap_hdr_out,
4088   ecoff_swap_dnr_out,
4089   ecoff_swap_pdr_out,
4090   ecoff_swap_sym_out,
4091   ecoff_swap_opt_out,
4092   ecoff_swap_fdr_out,
4093   ecoff_swap_rfd_out,
4094   ecoff_swap_ext_out,
4095   _bfd_ecoff_swap_tir_out,
4096   _bfd_ecoff_swap_rndx_out,
4097   /* Function to read in symbolic data.  */
4098   _bfd_mips_elf_read_ecoff_info
4099 };
4100 
4101 /* Relocations in the 64 bit MIPS ELF ABI are more complex than in
4102    standard ELF.  This structure is used to redirect the relocation
4103    handling routines.  */
4104 
4105 const struct elf_size_info mips_elf64_size_info =
4106 {
4107   sizeof (Elf64_External_Ehdr),
4108   sizeof (Elf64_External_Phdr),
4109   sizeof (Elf64_External_Shdr),
4110   sizeof (Elf64_Mips_External_Rel),
4111   sizeof (Elf64_Mips_External_Rela),
4112   sizeof (Elf64_External_Sym),
4113   sizeof (Elf64_External_Dyn),
4114   sizeof (Elf_External_Note),
4115   4,		/* hash-table entry size */
4116   3,		/* internal relocations per external relocations */
4117   64,		/* arch_size */
4118   3,		/* log_file_align */
4119   ELFCLASS64,
4120   EV_CURRENT,
4121   bfd_elf64_write_out_phdrs,
4122   bfd_elf64_write_shdrs_and_ehdr,
4123   bfd_elf64_checksum_contents,
4124   mips_elf64_write_relocs,
4125   bfd_elf64_swap_symbol_in,
4126   bfd_elf64_swap_symbol_out,
4127   mips_elf64_slurp_reloc_table,
4128   bfd_elf64_slurp_symbol_table,
4129   bfd_elf64_swap_dyn_in,
4130   bfd_elf64_swap_dyn_out,
4131   mips_elf64_be_swap_reloc_in,
4132   mips_elf64_be_swap_reloc_out,
4133   mips_elf64_be_swap_reloca_in,
4134   mips_elf64_be_swap_reloca_out
4135 };
4136 
4137 #define ELF_ARCH			bfd_arch_mips
4138 #define ELF_TARGET_ID			MIPS_ELF_DATA
4139 #define ELF_MACHINE_CODE		EM_MIPS
4140 
4141 #define elf_backend_collect		TRUE
4142 #define elf_backend_type_change_ok	TRUE
4143 #define elf_backend_can_gc_sections	TRUE
4144 #define elf_info_to_howto		mips_elf64_info_to_howto_rela
4145 #define elf_info_to_howto_rel		mips_elf64_info_to_howto_rel
4146 #define elf_backend_object_p		mips_elf64_object_p
4147 #define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
4148 #define elf_backend_section_processing	_bfd_mips_elf_section_processing
4149 #define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
4150 #define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
4151 #define elf_backend_section_from_bfd_section \
4152 				_bfd_mips_elf_section_from_bfd_section
4153 #define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
4154 #define elf_backend_link_output_symbol_hook \
4155 				_bfd_mips_elf_link_output_symbol_hook
4156 #define elf_backend_create_dynamic_sections \
4157 				_bfd_mips_elf_create_dynamic_sections
4158 #define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
4159 #define elf_backend_merge_symbol_attribute \
4160 				_bfd_mips_elf_merge_symbol_attribute
4161 #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
4162 #define elf_backend_adjust_dynamic_symbol \
4163 				_bfd_mips_elf_adjust_dynamic_symbol
4164 #define elf_backend_always_size_sections \
4165 				_bfd_mips_elf_always_size_sections
4166 #define elf_backend_size_dynamic_sections \
4167 				_bfd_mips_elf_size_dynamic_sections
4168 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
4169 #define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
4170 #define elf_backend_finish_dynamic_symbol \
4171 				_bfd_mips_elf_finish_dynamic_symbol
4172 #define elf_backend_finish_dynamic_sections \
4173 				_bfd_mips_elf_finish_dynamic_sections
4174 #define elf_backend_final_write_processing \
4175 				_bfd_mips_elf_final_write_processing
4176 #define elf_backend_additional_program_headers \
4177 				_bfd_mips_elf_additional_program_headers
4178 #define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
4179 #define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
4180 #define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook
4181 #define elf_backend_copy_indirect_symbol \
4182 					_bfd_mips_elf_copy_indirect_symbol
4183 #define elf_backend_ignore_discarded_relocs \
4184 					_bfd_mips_elf_ignore_discarded_relocs
4185 #define elf_backend_mips_irix_compat	elf64_mips_irix_compat
4186 #define elf_backend_mips_rtype_to_howto	mips_elf64_rtype_to_howto
4187 #define elf_backend_ecoff_debug_swap	&mips_elf64_ecoff_debug_swap
4188 #define elf_backend_size_info		mips_elf64_size_info
4189 
4190 #define elf_backend_grok_prstatus	elf64_mips_grok_prstatus
4191 #define elf_backend_grok_psinfo		elf64_mips_grok_psinfo
4192 
4193 #define elf_backend_got_header_size	(8 * MIPS_RESERVED_GOTNO)
4194 
4195 /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
4196    work better/work only in RELA, so we default to this.  */
4197 #define elf_backend_may_use_rel_p	1
4198 #define elf_backend_may_use_rela_p	1
4199 #define elf_backend_default_use_rela_p	1
4200 #define elf_backend_rela_plts_and_copies_p 0
4201 #define elf_backend_plt_readonly	1
4202 #define elf_backend_plt_sym_val		_bfd_mips_elf_plt_sym_val
4203 
4204 #define elf_backend_sign_extend_vma	TRUE
4205 
4206 #define elf_backend_write_section	_bfd_mips_elf_write_section
4207 
4208 /* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit
4209    MIPS-specific function only applies to IRIX5, which had no 64-bit
4210    ABI.  */
4211 #define bfd_elf64_bfd_is_target_special_symbol \
4212 					_bfd_mips_elf_is_target_special_symbol
4213 #define bfd_elf64_find_nearest_line	_bfd_mips_elf_find_nearest_line
4214 #define bfd_elf64_find_inliner_info	_bfd_mips_elf_find_inliner_info
4215 #define bfd_elf64_new_section_hook	_bfd_mips_elf_new_section_hook
4216 #define bfd_elf64_set_section_contents	_bfd_mips_elf_set_section_contents
4217 #define bfd_elf64_bfd_get_relocated_section_contents \
4218 				_bfd_elf_mips_get_relocated_section_contents
4219 #define bfd_elf64_bfd_link_hash_table_create \
4220 				_bfd_mips_elf_link_hash_table_create
4221 #define bfd_elf64_bfd_final_link	_bfd_mips_elf_final_link
4222 #define bfd_elf64_bfd_merge_private_bfd_data \
4223 				_bfd_mips_elf_merge_private_bfd_data
4224 #define bfd_elf64_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
4225 #define bfd_elf64_bfd_print_private_bfd_data \
4226 				_bfd_mips_elf_print_private_bfd_data
4227 
4228 #define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound
4229 #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc
4230 #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
4231 #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc
4232 #define bfd_elf64_bfd_relax_section     _bfd_mips_relax_section
4233 #define bfd_elf64_mkobject		_bfd_mips_elf_mkobject
4234 
4235 /* MIPS ELF64 archive functions.  */
4236 #define bfd_elf64_archive_functions
4237 extern bfd_boolean bfd_elf64_archive_slurp_armap
4238   (bfd *);
4239 extern bfd_boolean bfd_elf64_archive_write_armap
4240   (bfd *, unsigned int, struct orl *, unsigned int, int);
4241 #define bfd_elf64_archive_slurp_extended_name_table \
4242 			_bfd_archive_coff_slurp_extended_name_table
4243 #define bfd_elf64_archive_construct_extended_name_table \
4244 			_bfd_archive_coff_construct_extended_name_table
4245 #define bfd_elf64_archive_truncate_arname \
4246 			_bfd_archive_coff_truncate_arname
4247 #define bfd_elf64_archive_read_ar_hdr	_bfd_archive_coff_read_ar_hdr
4248 #define bfd_elf64_archive_write_ar_hdr	_bfd_archive_coff_write_ar_hdr
4249 #define bfd_elf64_archive_openr_next_archived_file \
4250 			_bfd_archive_coff_openr_next_archived_file
4251 #define bfd_elf64_archive_get_elt_at_index \
4252 			_bfd_archive_coff_get_elt_at_index
4253 #define bfd_elf64_archive_generic_stat_arch_elt \
4254 			_bfd_archive_coff_generic_stat_arch_elt
4255 #define bfd_elf64_archive_update_armap_timestamp \
4256 			_bfd_archive_coff_update_armap_timestamp
4257 
4258 /* The SGI style (n)64 NewABI.  */
4259 #define TARGET_LITTLE_SYM		bfd_elf64_littlemips_vec
4260 #define TARGET_LITTLE_NAME		"elf64-littlemips"
4261 #define TARGET_BIG_SYM			bfd_elf64_bigmips_vec
4262 #define TARGET_BIG_NAME			"elf64-bigmips"
4263 
4264 #define ELF_MAXPAGESIZE			0x10000
4265 #define ELF_COMMONPAGESIZE		0x1000
4266 
4267 #include "elf64-target.h"
4268 
4269 /* The SYSV-style 'traditional' (n)64 NewABI.  */
4270 #undef TARGET_LITTLE_SYM
4271 #undef TARGET_LITTLE_NAME
4272 #undef TARGET_BIG_SYM
4273 #undef TARGET_BIG_NAME
4274 
4275 #undef ELF_MAXPAGESIZE
4276 #undef ELF_COMMONPAGESIZE
4277 
4278 #define TARGET_LITTLE_SYM		bfd_elf64_tradlittlemips_vec
4279 #define TARGET_LITTLE_NAME		"elf64-tradlittlemips"
4280 #define TARGET_BIG_SYM			bfd_elf64_tradbigmips_vec
4281 #define TARGET_BIG_NAME			"elf64-tradbigmips"
4282 
4283 #define ELF_MAXPAGESIZE			0x10000
4284 #define ELF_COMMONPAGESIZE		0x1000
4285 #define elf64_bed			elf64_tradbed
4286 
4287 /* Include the target file again for this target.  */
4288 #include "elf64-target.h"
4289 
4290 
4291 /* FreeBSD support.  */
4292 
4293 #undef TARGET_LITTLE_SYM
4294 #undef TARGET_LITTLE_NAME
4295 #undef TARGET_BIG_SYM
4296 #undef TARGET_BIG_NAME
4297 
4298 #define	TARGET_LITTLE_SYM		bfd_elf64_tradlittlemips_freebsd_vec
4299 #define	TARGET_LITTLE_NAME		"elf64-tradlittlemips-freebsd"
4300 #define	TARGET_BIG_SYM			bfd_elf64_tradbigmips_freebsd_vec
4301 #define	TARGET_BIG_NAME			"elf64-tradbigmips-freebsd"
4302 
4303 #undef	ELF_OSABI
4304 #define	ELF_OSABI			ELFOSABI_FREEBSD
4305 
4306 /* The kernel recognizes executables as valid only if they carry a
4307    "FreeBSD" label in the ELF header.  So we put this label on all
4308    executables and (for simplicity) also all other object files.  */
4309 
4310 static void
4311 elf_fbsd_post_process_headers (bfd *abfd, struct bfd_link_info *info)
4312 {
4313   _bfd_elf_set_osabi (abfd, info);
4314 }
4315 
4316 #undef	elf_backend_post_process_headers
4317 #define	elf_backend_post_process_headers	elf_fbsd_post_process_headers
4318 #undef	elf64_bed
4319 #define elf64_bed				elf64_fbsd_tradbed
4320 
4321 #include "elf64-target.h"
4322