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