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