1 /* MIPS-specific support for 64-bit ELF
2    Copyright (C) 1996-2014 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 	 0,			/* 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 	 0,			/* 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 
1886 static reloc_howto_type mips16_elf64_howto_table_rela[] =
1887 {
1888   /* The reloc used for the mips16 jump instruction.  */
1889   HOWTO (R_MIPS16_26,		/* type */
1890 	 2,			/* rightshift */
1891 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1892 	 26,			/* bitsize */
1893 	 FALSE,			/* pc_relative */
1894 	 0,			/* bitpos */
1895 	 complain_overflow_dont, /* complain_on_overflow */
1896 	 			/* This needs complex overflow
1897 				   detection, because the upper four
1898 				   bits must match the PC.  */
1899 	 _bfd_mips_elf_generic_reloc, /* special_function */
1900 	 "R_MIPS16_26",		/* name */
1901 	 FALSE,			/* partial_inplace */
1902 	 0,			/* src_mask */
1903 	 0x3ffffff,		/* dst_mask */
1904 	 FALSE),		/* pcrel_offset */
1905 
1906   /* The reloc used for the mips16 gprel instruction.  */
1907   HOWTO (R_MIPS16_GPREL,	/* type */
1908 	 0,			/* rightshift */
1909 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1910 	 16,			/* bitsize */
1911 	 FALSE,			/* pc_relative */
1912 	 0,			/* bitpos */
1913 	 complain_overflow_signed, /* complain_on_overflow */
1914 	 mips16_gprel_reloc,	/* special_function */
1915 	 "R_MIPS16_GPREL",	/* name */
1916 	 FALSE,			/* partial_inplace */
1917 	 0,			/* src_mask */
1918 	 0x0000ffff,	        /* dst_mask */
1919 	 FALSE),		/* pcrel_offset */
1920 
1921   /* A MIPS16 reference to the global offset table.  */
1922   HOWTO (R_MIPS16_GOT16,	/* 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_dont, /* complain_on_overflow */
1929 	 _bfd_mips_elf_got16_reloc, /* special_function */
1930 	 "R_MIPS16_GOT16",	/* name */
1931 	 FALSE,			/* partial_inplace */
1932 	 0,			/* src_mask */
1933 	 0x0000ffff,	        /* dst_mask */
1934 	 FALSE),		/* pcrel_offset */
1935 
1936   /* A MIPS16 call through the global offset table.  */
1937   HOWTO (R_MIPS16_CALL16,	/* 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_generic_reloc, /* special_function */
1945 	 "R_MIPS16_CALL16",	/* name */
1946 	 FALSE,			/* partial_inplace */
1947 	 0,			/* src_mask */
1948 	 0x0000ffff,	        /* dst_mask */
1949 	 FALSE),		/* pcrel_offset */
1950 
1951   /* MIPS16 high 16 bits of symbol value.  */
1952   HOWTO (R_MIPS16_HI16,		/* type */
1953 	 16,			/* 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_hi16_reloc, /* special_function */
1960 	 "R_MIPS16_HI16",	/* name */
1961 	 FALSE,			/* partial_inplace */
1962 	 0,			/* src_mask */
1963 	 0x0000ffff,		/* dst_mask */
1964 	 FALSE),		/* pcrel_offset */
1965 
1966   /* MIPS16 low 16 bits of symbol value.  */
1967   HOWTO (R_MIPS16_LO16,		/* type */
1968 	 0,			/* 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_lo16_reloc, /* special_function */
1975 	 "R_MIPS16_LO16",	/* name */
1976 	 FALSE,			/* partial_inplace */
1977 	 0,			/* src_mask */
1978 	 0x0000ffff,		/* dst_mask */
1979 	 FALSE),		/* pcrel_offset */
1980 
1981   /* MIPS16 TLS general dynamic variable reference.  */
1982   HOWTO (R_MIPS16_TLS_GD,	/* 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_signed, /* complain_on_overflow */
1989 	 _bfd_mips_elf_generic_reloc, /* special_function */
1990 	 "R_MIPS16_TLS_GD",	/* name */
1991 	 FALSE,			/* partial_inplace */
1992 	 0,			/* src_mask */
1993 	 0x0000ffff,		/* dst_mask */
1994 	 FALSE),		/* pcrel_offset */
1995 
1996   /* MIPS16 TLS local dynamic variable reference.  */
1997   HOWTO (R_MIPS16_TLS_LDM,	/* 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_LDM",	/* name */
2006 	 FALSE,			/* partial_inplace */
2007 	 0,			/* src_mask */
2008 	 0x0000ffff,		/* dst_mask */
2009 	 FALSE),		/* pcrel_offset */
2010 
2011   /* MIPS16 TLS local dynamic offset.  */
2012   HOWTO (R_MIPS16_TLS_DTPREL_HI16,	/* 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_DTPREL_HI16",	/* 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_LO16,	/* 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_LO16",	/* name */
2036 	 FALSE,			/* partial_inplace */
2037 	 0,			/* src_mask */
2038 	 0x0000ffff,		/* dst_mask */
2039 	 FALSE),		/* pcrel_offset */
2040 
2041   /* MIPS16 TLS thread pointer offset.  */
2042   HOWTO (R_MIPS16_TLS_GOTTPREL,	/* 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_GOTTPREL",	/* 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_TPREL_HI16,	/* 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_TPREL_HI16", /* 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_LO16,	/* 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_LO16", /* name */
2081 	 FALSE,			/* partial_inplace */
2082 	 0,			/* src_mask */
2083 	 0x0000ffff,		/* dst_mask */
2084 	 FALSE),		/* pcrel_offset */
2085 };
2086 
2087 static reloc_howto_type micromips_elf64_howto_table_rel[] =
2088 {
2089   EMPTY_HOWTO (130),
2090   EMPTY_HOWTO (131),
2091   EMPTY_HOWTO (132),
2092 
2093   /* 26 bit jump address.  */
2094   HOWTO (R_MICROMIPS_26_S1,	/* type */
2095 	 1,			/* rightshift */
2096 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2097 	 26,			/* bitsize */
2098 	 FALSE,			/* pc_relative */
2099 	 0,			/* bitpos */
2100 	 complain_overflow_dont, /* complain_on_overflow */
2101 	 			/* This needs complex overflow
2102 				   detection, because the upper four
2103 				   bits must match the PC.  */
2104 	 _bfd_mips_elf_generic_reloc, /* special_function */
2105 	 "R_MICROMIPS_26_S1",	/* name */
2106 	 TRUE,			/* partial_inplace */
2107 	 0x3ffffff,		/* src_mask */
2108 	 0x3ffffff,		/* dst_mask */
2109 	 FALSE),		/* pcrel_offset */
2110 
2111   /* High 16 bits of symbol value.  */
2112   HOWTO (R_MICROMIPS_HI16,	/* type */
2113 	 16,			/* rightshift */
2114 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2115 	 16,			/* bitsize */
2116 	 FALSE,			/* pc_relative */
2117 	 0,			/* bitpos */
2118 	 complain_overflow_dont, /* complain_on_overflow */
2119 	 _bfd_mips_elf_hi16_reloc, /* special_function */
2120 	 "R_MICROMIPS_HI16",	/* name */
2121 	 TRUE,			/* partial_inplace */
2122 	 0x0000ffff,		/* src_mask */
2123 	 0x0000ffff,		/* dst_mask */
2124 	 FALSE),		/* pcrel_offset */
2125 
2126   /* Low 16 bits of symbol value.  */
2127   HOWTO (R_MICROMIPS_LO16,	/* type */
2128 	 0,			/* rightshift */
2129 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2130 	 16,			/* bitsize */
2131 	 FALSE,			/* pc_relative */
2132 	 0,			/* bitpos */
2133 	 complain_overflow_dont, /* complain_on_overflow */
2134 	 _bfd_mips_elf_lo16_reloc, /* special_function */
2135 	 "R_MICROMIPS_LO16",	/* name */
2136 	 TRUE,			/* partial_inplace */
2137 	 0x0000ffff,		/* src_mask */
2138 	 0x0000ffff,		/* dst_mask */
2139 	 FALSE),		/* pcrel_offset */
2140 
2141   /* GP relative reference.  */
2142   HOWTO (R_MICROMIPS_GPREL16,	/* type */
2143 	 0,			/* rightshift */
2144 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2145 	 16,			/* bitsize */
2146 	 FALSE,			/* pc_relative */
2147 	 0,			/* bitpos */
2148 	 complain_overflow_signed, /* complain_on_overflow */
2149 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2150 	 "R_MICROMIPS_GPREL16",	/* name */
2151 	 TRUE,			/* partial_inplace */
2152 	 0x0000ffff,		/* src_mask */
2153 	 0x0000ffff,		/* dst_mask */
2154 	 FALSE),		/* pcrel_offset */
2155 
2156   /* Reference to literal section.  */
2157   HOWTO (R_MICROMIPS_LITERAL,	/* 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_signed, /* complain_on_overflow */
2164 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2165 	 "R_MICROMIPS_LITERAL",	/* name */
2166 	 TRUE,			/* partial_inplace */
2167 	 0x0000ffff,		/* src_mask */
2168 	 0x0000ffff,		/* dst_mask */
2169 	 FALSE),		/* pcrel_offset */
2170 
2171   /* Reference to global offset table.  */
2172   HOWTO (R_MICROMIPS_GOT16,	/* 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_elf_got16_reloc, /* special_function */
2180 	 "R_MICROMIPS_GOT16",	/* name */
2181 	 TRUE,			/* partial_inplace */
2182 	 0x0000ffff,		/* src_mask */
2183 	 0x0000ffff,		/* dst_mask */
2184 	 FALSE),		/* pcrel_offset */
2185 
2186   /* This is for microMIPS branches.  */
2187   HOWTO (R_MICROMIPS_PC7_S1,	/* type */
2188 	 1,			/* rightshift */
2189 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
2190 	 7,			/* bitsize */
2191 	 TRUE,			/* pc_relative */
2192 	 0,			/* bitpos */
2193 	 complain_overflow_signed, /* complain_on_overflow */
2194 	 _bfd_mips_elf_generic_reloc, /* special_function */
2195 	 "R_MICROMIPS_PC7_S1",	/* name */
2196 	 TRUE,			/* partial_inplace */
2197 	 0x0000007f,		/* src_mask */
2198 	 0x0000007f,		/* dst_mask */
2199 	 TRUE),			/* pcrel_offset */
2200 
2201   HOWTO (R_MICROMIPS_PC10_S1,	/* type */
2202 	 1,			/* rightshift */
2203 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
2204 	 10,			/* bitsize */
2205 	 TRUE,			/* pc_relative */
2206 	 0,			/* bitpos */
2207 	 complain_overflow_signed, /* complain_on_overflow */
2208 	 _bfd_mips_elf_generic_reloc, /* special_function */
2209 	 "R_MICROMIPS_PC10_S1",	/* name */
2210 	 TRUE,			/* partial_inplace */
2211 	 0x000003ff,		/* src_mask */
2212 	 0x000003ff,		/* dst_mask */
2213 	 TRUE),			/* pcrel_offset */
2214 
2215   HOWTO (R_MICROMIPS_PC16_S1,	/* type */
2216 	 1,			/* rightshift */
2217 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2218 	 16,			/* bitsize */
2219 	 TRUE,			/* pc_relative */
2220 	 0,			/* bitpos */
2221 	 complain_overflow_signed, /* complain_on_overflow */
2222 	 _bfd_mips_elf_generic_reloc, /* special_function */
2223 	 "R_MICROMIPS_PC16_S1",	/* name */
2224 	 TRUE,			/* partial_inplace */
2225 	 0x0000ffff,		/* src_mask */
2226 	 0x0000ffff,		/* dst_mask */
2227 	 TRUE),			/* pcrel_offset */
2228 
2229   /* 16 bit call through global offset table.  */
2230   HOWTO (R_MICROMIPS_CALL16,	/* type */
2231 	 0,			/* rightshift */
2232 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2233 	 16,			/* bitsize */
2234 	 FALSE,			/* pc_relative */
2235 	 0,			/* bitpos */
2236 	 complain_overflow_signed, /* complain_on_overflow */
2237 	 _bfd_mips_elf_generic_reloc, /* special_function */
2238 	 "R_MICROMIPS_CALL16",	/* name */
2239 	 TRUE,			/* partial_inplace */
2240 	 0x0000ffff,		/* src_mask */
2241 	 0x0000ffff,		/* dst_mask */
2242 	 FALSE),		/* pcrel_offset */
2243 
2244   EMPTY_HOWTO (143),
2245   EMPTY_HOWTO (144),
2246 
2247   /* Displacement in the global offset table.  */
2248   HOWTO (R_MICROMIPS_GOT_DISP,	/* type */
2249 	 0,			/* rightshift */
2250 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2251 	 16,			/* bitsize */
2252 	 FALSE,			/* pc_relative */
2253 	 0,			/* bitpos */
2254 	 complain_overflow_signed, /* complain_on_overflow */
2255 	 _bfd_mips_elf_generic_reloc, /* special_function */
2256 	 "R_MICROMIPS_GOT_DISP",/* name */
2257 	 TRUE,			/* partial_inplace */
2258 	 0x0000ffff,		/* src_mask */
2259 	 0x0000ffff,		/* dst_mask */
2260 	 FALSE),		/* pcrel_offset */
2261 
2262   /* Displacement to page pointer in the global offset table.  */
2263   HOWTO (R_MICROMIPS_GOT_PAGE,	/* type */
2264 	 0,			/* rightshift */
2265 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2266 	 16,			/* bitsize */
2267 	 FALSE,			/* pc_relative */
2268 	 0,			/* bitpos */
2269 	 complain_overflow_signed, /* complain_on_overflow */
2270 	 _bfd_mips_elf_generic_reloc, /* special_function */
2271 	 "R_MICROMIPS_GOT_PAGE",/* name */
2272 	 TRUE,			/* partial_inplace */
2273 	 0x0000ffff,		/* src_mask */
2274 	 0x0000ffff,		/* dst_mask */
2275 	 FALSE),		/* pcrel_offset */
2276 
2277   /* Offset from page pointer in the global offset table.  */
2278   HOWTO (R_MICROMIPS_GOT_OFST,	/* 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_OFST",/* name */
2287 	 TRUE,			/* partial_inplace */
2288 	 0x0000ffff,		/* src_mask */
2289 	 0x0000ffff,		/* dst_mask */
2290 	 FALSE),		/* pcrel_offset */
2291 
2292   /* High 16 bits of displacement in global offset table.  */
2293   HOWTO (R_MICROMIPS_GOT_HI16,	/* 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_dont, /* complain_on_overflow */
2300 	 _bfd_mips_elf_generic_reloc, /* special_function */
2301 	 "R_MICROMIPS_GOT_HI16",/* name */
2302 	 TRUE,			/* partial_inplace */
2303 	 0x0000ffff,		/* src_mask */
2304 	 0x0000ffff,		/* dst_mask */
2305 	 FALSE),		/* pcrel_offset */
2306 
2307   /* Low 16 bits of displacement in global offset table.  */
2308   HOWTO (R_MICROMIPS_GOT_LO16,	/* 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_dont, /* complain_on_overflow */
2315 	 _bfd_mips_elf_generic_reloc, /* special_function */
2316 	 "R_MICROMIPS_GOT_LO16",/* name */
2317 	 TRUE,			/* partial_inplace */
2318 	 0x0000ffff,		/* src_mask */
2319 	 0x0000ffff,		/* dst_mask */
2320 	 FALSE),		/* pcrel_offset */
2321 
2322   /* 64 bit subtraction.  Used in the N32 ABI.  */
2323   HOWTO (R_MICROMIPS_SUB,	/* type */
2324 	 0,			/* rightshift */
2325 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
2326 	 64,			/* 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_SUB",	/* name */
2332 	 TRUE,			/* partial_inplace */
2333 	 MINUS_ONE,		/* src_mask */
2334 	 MINUS_ONE,		/* dst_mask */
2335 	 FALSE),		/* pcrel_offset */
2336 
2337   /* We don't support these for REL relocations, because it means building
2338      the addend from a R_MICROMIPS_HIGHEST/R_MICROMIPS_HIGHER/
2339      R_MICROMIPS_HI16/R_MICROMIPS_LO16 sequence with varying ordering,
2340      using fallable heuristics.  */
2341   EMPTY_HOWTO (R_MICROMIPS_HIGHER),
2342   EMPTY_HOWTO (R_MICROMIPS_HIGHEST),
2343 
2344   /* High 16 bits of displacement in global offset table.  */
2345   HOWTO (R_MICROMIPS_CALL_HI16,	/* type */
2346 	 0,			/* rightshift */
2347 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2348 	 16,			/* bitsize */
2349 	 FALSE,			/* pc_relative */
2350 	 0,			/* bitpos */
2351 	 complain_overflow_dont, /* complain_on_overflow */
2352 	 _bfd_mips_elf_generic_reloc, /* special_function */
2353 	 "R_MICROMIPS_CALL_HI16",/* name */
2354 	 TRUE,			/* partial_inplace */
2355 	 0x0000ffff,		/* src_mask */
2356 	 0x0000ffff,		/* dst_mask */
2357 	 FALSE),		/* pcrel_offset */
2358 
2359   /* Low 16 bits of displacement in global offset table.  */
2360   HOWTO (R_MICROMIPS_CALL_LO16,	/* type */
2361 	 0,			/* rightshift */
2362 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2363 	 16,			/* bitsize */
2364 	 FALSE,			/* pc_relative */
2365 	 0,			/* bitpos */
2366 	 complain_overflow_dont, /* complain_on_overflow */
2367 	 _bfd_mips_elf_generic_reloc, /* special_function */
2368 	 "R_MICROMIPS_CALL_LO16",/* name */
2369 	 TRUE,			/* partial_inplace */
2370 	 0x0000ffff,		/* src_mask */
2371 	 0x0000ffff,		/* dst_mask */
2372 	 FALSE),		/* pcrel_offset */
2373 
2374   /* Section displacement.  */
2375   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
2376 	 0,			/* rightshift */
2377 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2378 	 32,			/* 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_SCN_DISP", /* name */
2384 	 TRUE,			/* partial_inplace */
2385 	 0xffffffff,		/* src_mask */
2386 	 0xffffffff,		/* dst_mask */
2387 	 FALSE),		/* pcrel_offset */
2388 
2389   /* Protected jump conversion.  This is an optimization hint.  No
2390      relocation is required for correctness.  */
2391   HOWTO (R_MICROMIPS_JALR,	/* type */
2392 	 0,			/* rightshift */
2393 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2394 	 32,			/* bitsize */
2395 	 FALSE,			/* pc_relative */
2396 	 0,			/* bitpos */
2397 	 complain_overflow_dont, /* complain_on_overflow */
2398 	 _bfd_mips_elf_generic_reloc, /* special_function */
2399 	 "R_MICROMIPS_JALR",	/* name */
2400 	 FALSE,			/* partial_inplace */
2401 	 0,			/* src_mask */
2402 	 0x00000000,		/* dst_mask */
2403 	 FALSE),		/* pcrel_offset */
2404 };
2405 
2406 static reloc_howto_type micromips_elf64_howto_table_rela[] =
2407 {
2408   EMPTY_HOWTO (130),
2409   EMPTY_HOWTO (131),
2410   EMPTY_HOWTO (132),
2411 
2412   /* 26 bit jump address.  */
2413   HOWTO (R_MICROMIPS_26_S1,	/* type */
2414 	 1,			/* rightshift */
2415 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2416 	 26,			/* bitsize */
2417 	 FALSE,			/* pc_relative */
2418 	 0,			/* bitpos */
2419 	 complain_overflow_dont, /* complain_on_overflow */
2420 	 			/* This needs complex overflow
2421 				   detection, because the upper four
2422 				   bits must match the PC.  */
2423 	 _bfd_mips_elf_generic_reloc, /* special_function */
2424 	 "R_MICROMIPS_26_S1",	/* name */
2425 	 FALSE,			/* partial_inplace */
2426 	 0,			/* src_mask */
2427 	 0x3ffffff,		/* dst_mask */
2428 	 FALSE),		/* pcrel_offset */
2429 
2430   /* High 16 bits of symbol value.  */
2431   HOWTO (R_MICROMIPS_HI16,	/* type */
2432 	 16,			/* rightshift */
2433 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2434 	 16,			/* bitsize */
2435 	 FALSE,			/* pc_relative */
2436 	 0,			/* bitpos */
2437 	 complain_overflow_dont, /* complain_on_overflow */
2438 	 _bfd_mips_elf_hi16_reloc, /* special_function */
2439 	 "R_MICROMIPS_HI16",	/* name */
2440 	 FALSE,			/* partial_inplace */
2441 	 0,			/* src_mask */
2442 	 0x0000ffff,		/* dst_mask */
2443 	 FALSE),		/* pcrel_offset */
2444 
2445   /* Low 16 bits of symbol value.  */
2446   HOWTO (R_MICROMIPS_LO16,	/* type */
2447 	 0,			/* rightshift */
2448 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2449 	 16,			/* bitsize */
2450 	 FALSE,			/* pc_relative */
2451 	 0,			/* bitpos */
2452 	 complain_overflow_dont, /* complain_on_overflow */
2453 	 _bfd_mips_elf_lo16_reloc, /* special_function */
2454 	 "R_MICROMIPS_LO16",	/* name */
2455 	 FALSE,			/* partial_inplace */
2456 	 0,			/* src_mask */
2457 	 0x0000ffff,		/* dst_mask */
2458 	 FALSE),		/* pcrel_offset */
2459 
2460   /* GP relative reference.  */
2461   HOWTO (R_MICROMIPS_GPREL16,	/* type */
2462 	 0,			/* rightshift */
2463 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2464 	 16,			/* bitsize */
2465 	 FALSE,			/* pc_relative */
2466 	 0,			/* bitpos */
2467 	 complain_overflow_signed, /* complain_on_overflow */
2468 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2469 	 "R_MICROMIPS_GPREL16",	/* name */
2470 	 FALSE,			/* partial_inplace */
2471 	 0,			/* src_mask */
2472 	 0x0000ffff,		/* dst_mask */
2473 	 FALSE),		/* pcrel_offset */
2474 
2475   /* Reference to literal section.  */
2476   HOWTO (R_MICROMIPS_LITERAL,	/* 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_signed, /* complain_on_overflow */
2483 	 _bfd_mips_elf32_gprel16_reloc, /* special_function */
2484 	 "R_MICROMIPS_LITERAL",	/* name */
2485 	 FALSE,			/* partial_inplace */
2486 	 0,			/* src_mask */
2487 	 0x0000ffff,		/* dst_mask */
2488 	 FALSE),		/* pcrel_offset */
2489 
2490   /* Reference to global offset table.  */
2491   HOWTO (R_MICROMIPS_GOT16,	/* 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_elf_got16_reloc, /* special_function */
2499 	 "R_MICROMIPS_GOT16",	/* name */
2500 	 FALSE,			/* partial_inplace */
2501 	 0,			/* src_mask */
2502 	 0x0000ffff,		/* dst_mask */
2503 	 FALSE),		/* pcrel_offset */
2504 
2505   /* This is for microMIPS branches.  */
2506   HOWTO (R_MICROMIPS_PC7_S1,	/* type */
2507 	 1,			/* rightshift */
2508 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
2509 	 7,			/* bitsize */
2510 	 TRUE,			/* pc_relative */
2511 	 0,			/* bitpos */
2512 	 complain_overflow_signed, /* complain_on_overflow */
2513 	 _bfd_mips_elf_generic_reloc, /* special_function */
2514 	 "R_MICROMIPS_PC7_S1",	/* name */
2515 	 FALSE,			/* partial_inplace */
2516 	 0,			/* src_mask */
2517 	 0x0000007f,		/* dst_mask */
2518 	 TRUE),			/* pcrel_offset */
2519 
2520   HOWTO (R_MICROMIPS_PC10_S1,	/* type */
2521 	 1,			/* rightshift */
2522 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
2523 	 10,			/* bitsize */
2524 	 TRUE,			/* pc_relative */
2525 	 0,			/* bitpos */
2526 	 complain_overflow_signed, /* complain_on_overflow */
2527 	 _bfd_mips_elf_generic_reloc, /* special_function */
2528 	 "R_MICROMIPS_PC10_S1",	/* name */
2529 	 FALSE,			/* partial_inplace */
2530 	 0,			/* src_mask */
2531 	 0x000003ff,		/* dst_mask */
2532 	 TRUE),			/* pcrel_offset */
2533 
2534   HOWTO (R_MICROMIPS_PC16_S1,	/* type */
2535 	 1,			/* rightshift */
2536 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2537 	 16,			/* bitsize */
2538 	 TRUE,			/* pc_relative */
2539 	 0,			/* bitpos */
2540 	 complain_overflow_signed, /* complain_on_overflow */
2541 	 _bfd_mips_elf_generic_reloc, /* special_function */
2542 	 "R_MICROMIPS_PC16_S1",	/* name */
2543 	 FALSE,			/* partial_inplace */
2544 	 0,			/* src_mask */
2545 	 0x0000ffff,		/* dst_mask */
2546 	 TRUE),			/* pcrel_offset */
2547 
2548   /* 16 bit call through global offset table.  */
2549   HOWTO (R_MICROMIPS_CALL16,	/* type */
2550 	 0,			/* rightshift */
2551 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2552 	 16,			/* bitsize */
2553 	 FALSE,			/* pc_relative */
2554 	 0,			/* bitpos */
2555 	 complain_overflow_signed, /* complain_on_overflow */
2556 	 _bfd_mips_elf_generic_reloc, /* special_function */
2557 	 "R_MICROMIPS_CALL16",	/* name */
2558 	 FALSE,			/* partial_inplace */
2559 	 0,			/* src_mask */
2560 	 0x0000ffff,		/* dst_mask */
2561 	 FALSE),		/* pcrel_offset */
2562 
2563   EMPTY_HOWTO (143),
2564   EMPTY_HOWTO (144),
2565 
2566   /* Displacement in the global offset table.  */
2567   HOWTO (R_MICROMIPS_GOT_DISP,	/* type */
2568 	 0,			/* rightshift */
2569 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2570 	 16,			/* bitsize */
2571 	 FALSE,			/* pc_relative */
2572 	 0,			/* bitpos */
2573 	 complain_overflow_signed, /* complain_on_overflow */
2574 	 _bfd_mips_elf_generic_reloc, /* special_function */
2575 	 "R_MICROMIPS_GOT_DISP",/* name */
2576 	 FALSE,			/* partial_inplace */
2577 	 0,			/* src_mask */
2578 	 0x0000ffff,		/* dst_mask */
2579 	 FALSE),		/* pcrel_offset */
2580 
2581   /* Displacement to page pointer in the global offset table.  */
2582   HOWTO (R_MICROMIPS_GOT_PAGE,	/* type */
2583 	 0,			/* rightshift */
2584 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2585 	 16,			/* bitsize */
2586 	 FALSE,			/* pc_relative */
2587 	 0,			/* bitpos */
2588 	 complain_overflow_signed, /* complain_on_overflow */
2589 	 _bfd_mips_elf_generic_reloc, /* special_function */
2590 	 "R_MICROMIPS_GOT_PAGE",/* name */
2591 	 FALSE,			/* partial_inplace */
2592 	 0,			/* src_mask */
2593 	 0x0000ffff,		/* dst_mask */
2594 	 FALSE),		/* pcrel_offset */
2595 
2596   /* Offset from page pointer in the global offset table.  */
2597   HOWTO (R_MICROMIPS_GOT_OFST,	/* 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_OFST",/* name */
2606 	 FALSE,			/* partial_inplace */
2607 	 0,			/* src_mask */
2608 	 0x0000ffff,		/* dst_mask */
2609 	 FALSE),		/* pcrel_offset */
2610 
2611   /* High 16 bits of displacement in global offset table.  */
2612   HOWTO (R_MICROMIPS_GOT_HI16,	/* 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_dont, /* complain_on_overflow */
2619 	 _bfd_mips_elf_generic_reloc, /* special_function */
2620 	 "R_MICROMIPS_GOT_HI16",/* name */
2621 	 FALSE,			/* partial_inplace */
2622 	 0,			/* src_mask */
2623 	 0x0000ffff,		/* dst_mask */
2624 	 FALSE),		/* pcrel_offset */
2625 
2626   /* Low 16 bits of displacement in global offset table.  */
2627   HOWTO (R_MICROMIPS_GOT_LO16,	/* 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_dont, /* complain_on_overflow */
2634 	 _bfd_mips_elf_generic_reloc, /* special_function */
2635 	 "R_MICROMIPS_GOT_LO16",/* name */
2636 	 FALSE,			/* partial_inplace */
2637 	 0,			/* src_mask */
2638 	 0x0000ffff,		/* dst_mask */
2639 	 FALSE),		/* pcrel_offset */
2640 
2641   /* 64 bit subtraction.  Used in the N32 ABI.  */
2642   HOWTO (R_MICROMIPS_SUB,	/* type */
2643 	 0,			/* rightshift */
2644 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
2645 	 64,			/* 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_SUB",	/* name */
2651 	 FALSE,			/* partial_inplace */
2652 	 0,			/* src_mask */
2653 	 MINUS_ONE,		/* dst_mask */
2654 	 FALSE),		/* pcrel_offset */
2655 
2656   /* Get the higher value of a 64 bit addend.  */
2657   HOWTO (R_MICROMIPS_HIGHER,	/* 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_HIGHER",	/* name */
2666 	 FALSE,			/* partial_inplace */
2667 	 0,			/* src_mask */
2668 	 0x0000ffff,		/* dst_mask */
2669 	 FALSE),		/* pcrel_offset */
2670 
2671   /* Get the highest value of a 64 bit addend.  */
2672   HOWTO (R_MICROMIPS_HIGHEST,	/* type */
2673 	 0,			/* rightshift */
2674 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2675 	 16,			/* 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_HIGHEST",	/* name */
2681 	 FALSE,			/* partial_inplace */
2682 	 0,			/* src_mask */
2683 	 0x0000ffff,		/* dst_mask */
2684 	 FALSE),		/* pcrel_offset */
2685 
2686   /* High 16 bits of displacement in global offset table.  */
2687   HOWTO (R_MICROMIPS_CALL_HI16,	/* 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_CALL_HI16",/* name */
2696 	 FALSE,			/* partial_inplace */
2697 	 0,			/* src_mask */
2698 	 0x0000ffff,		/* dst_mask */
2699 	 FALSE),		/* pcrel_offset */
2700 
2701   /* Low 16 bits of displacement in global offset table.  */
2702   HOWTO (R_MICROMIPS_CALL_LO16,	/* 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_CALL_LO16",/* name */
2711 	 FALSE,			/* partial_inplace */
2712 	 0,			/* src_mask */
2713 	 0x0000ffff,		/* dst_mask */
2714 	 FALSE),		/* pcrel_offset */
2715 
2716   /* Section displacement.  */
2717   HOWTO (R_MICROMIPS_SCN_DISP,  /* type */
2718 	 0,			/* rightshift */
2719 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2720 	 32,			/* 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_SCN_DISP", /* name */
2726 	 FALSE,			/* partial_inplace */
2727 	 0,			/* src_mask */
2728 	 0xffffffff,		/* dst_mask */
2729 	 FALSE),		/* pcrel_offset */
2730 
2731   /* Protected jump conversion.  This is an optimization hint.  No
2732      relocation is required for correctness.  */
2733   HOWTO (R_MICROMIPS_JALR,	/* type */
2734 	 0,			/* rightshift */
2735 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2736 	 32,			/* bitsize */
2737 	 FALSE,			/* pc_relative */
2738 	 0,			/* bitpos */
2739 	 complain_overflow_dont, /* complain_on_overflow */
2740 	 _bfd_mips_elf_generic_reloc, /* special_function */
2741 	 "R_MICROMIPS_JALR",	/* name */
2742 	 FALSE,			/* partial_inplace */
2743 	 0,			/* src_mask */
2744 	 0x00000000,		/* dst_mask */
2745 	 FALSE),		/* pcrel_offset */
2746 };
2747 
2748 /* GNU extension to record C++ vtable hierarchy */
2749 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
2750   HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
2751 	 0,			/* rightshift */
2752 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2753 	 0,			/* bitsize */
2754 	 FALSE,			/* pc_relative */
2755 	 0,			/* bitpos */
2756 	 complain_overflow_dont, /* complain_on_overflow */
2757 	 NULL,			/* special_function */
2758 	 "R_MIPS_GNU_VTINHERIT", /* name */
2759 	 FALSE,			/* partial_inplace */
2760 	 0,			/* src_mask */
2761 	 0,			/* dst_mask */
2762 	 FALSE);		/* pcrel_offset */
2763 
2764 /* GNU extension to record C++ vtable member usage */
2765 static reloc_howto_type elf_mips_gnu_vtentry_howto =
2766   HOWTO (R_MIPS_GNU_VTENTRY,	/* type */
2767 	 0,			/* rightshift */
2768 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2769 	 0,			/* bitsize */
2770 	 FALSE,			/* pc_relative */
2771 	 0,			/* bitpos */
2772 	 complain_overflow_dont, /* complain_on_overflow */
2773 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
2774 	 "R_MIPS_GNU_VTENTRY",	/* name */
2775 	 FALSE,			/* partial_inplace */
2776 	 0,			/* src_mask */
2777 	 0,			/* dst_mask */
2778 	 FALSE);		/* pcrel_offset */
2779 
2780 /* 16 bit offset for pc-relative branches.  */
2781 static reloc_howto_type elf_mips_gnu_rel16_s2 =
2782   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
2783 	 2,			/* rightshift */
2784 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2785 	 16,			/* bitsize */
2786 	 TRUE,			/* pc_relative */
2787 	 0,			/* bitpos */
2788 	 complain_overflow_signed, /* complain_on_overflow */
2789 	 _bfd_mips_elf_generic_reloc,	/* special_function */
2790 	 "R_MIPS_GNU_REL16_S2",	/* name */
2791 	 TRUE,			/* partial_inplace */
2792 	 0x0000ffff,		/* src_mask */
2793 	 0x0000ffff,		/* dst_mask */
2794 	 TRUE);			/* pcrel_offset */
2795 
2796 /* 16 bit offset for pc-relative branches.  */
2797 static reloc_howto_type elf_mips_gnu_rela16_s2 =
2798   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
2799 	 2,			/* rightshift */
2800 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2801 	 16,			/* bitsize */
2802 	 TRUE,			/* pc_relative */
2803 	 0,			/* bitpos */
2804 	 complain_overflow_signed, /* complain_on_overflow */
2805 	 _bfd_mips_elf_generic_reloc,	/* special_function */
2806 	 "R_MIPS_GNU_REL16_S2",	/* name */
2807 	 FALSE,			/* partial_inplace */
2808 	 0,			/* src_mask */
2809 	 0x0000ffff,		/* dst_mask */
2810 	 TRUE);			/* pcrel_offset */
2811 
2812 /* 32 bit pc-relative.  Used for compact EH tables.  */
2813 static reloc_howto_type elf_mips_gnu_pcrel32 =
2814   HOWTO (R_MIPS_PC32,		/* type */
2815 	 0,			/* rightshift */
2816 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2817 	 32,			/* bitsize */
2818 	 TRUE,			/* pc_relative */
2819 	 0,			/* bitpos */
2820 	 complain_overflow_signed, /* complain_on_overflow */
2821 	 _bfd_mips_elf_generic_reloc, /* special_function */
2822 	 "R_MIPS_PC32",		/* name */
2823 	 TRUE,			/* partial_inplace */
2824 	 0xffffffff,		/* src_mask */
2825 	 0xffffffff,		/* dst_mask */
2826 	 TRUE);			/* pcrel_offset */
2827 
2828 
2829 /* Originally a VxWorks extension, but now used for other systems too.  */
2830 static reloc_howto_type elf_mips_copy_howto =
2831   HOWTO (R_MIPS_COPY,		/* type */
2832 	 0,			/* rightshift */
2833 	 0,			/* this one is variable size */
2834 	 0,			/* bitsize */
2835 	 FALSE,			/* pc_relative */
2836 	 0,			/* bitpos */
2837 	 complain_overflow_bitfield, /* complain_on_overflow */
2838 	 _bfd_mips_elf_generic_reloc, /* special_function */
2839 	 "R_MIPS_COPY",		/* name */
2840 	 FALSE,			/* partial_inplace */
2841 	 0x0,         		/* src_mask */
2842 	 0x0,		        /* dst_mask */
2843 	 FALSE);		/* pcrel_offset */
2844 
2845 /* Originally a VxWorks extension, but now used for other systems too.  */
2846 static reloc_howto_type elf_mips_jump_slot_howto =
2847   HOWTO (R_MIPS_JUMP_SLOT,	/* type */
2848 	 0,			/* rightshift */
2849 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
2850 	 64,			/* bitsize */
2851 	 FALSE,			/* pc_relative */
2852 	 0,			/* bitpos */
2853 	 complain_overflow_bitfield, /* complain_on_overflow */
2854 	 _bfd_mips_elf_generic_reloc, /* special_function */
2855 	 "R_MIPS_JUMP_SLOT",	/* name */
2856 	 FALSE,			/* partial_inplace */
2857 	 0x0,         		/* src_mask */
2858 	 0x0,		        /* dst_mask */
2859 	 FALSE);		/* pcrel_offset */
2860 
2861 /* Used in EH tables.  */
2862 static reloc_howto_type elf_mips_eh_howto =
2863   HOWTO (R_MIPS_EH,		/* type */
2864 	 0,			/* rightshift */
2865 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
2866 	 32,			/* bitsize */
2867 	 FALSE,			/* pc_relative */
2868 	 0,			/* bitpos */
2869 	 complain_overflow_signed, /* complain_on_overflow */
2870 	 _bfd_mips_elf_generic_reloc, /* special_function */
2871 	 "R_MIPS_EH",		/* name */
2872 	 TRUE,			/* partial_inplace */
2873 	 0xffffffff,		/* src_mask */
2874 	 0xffffffff,	        /* dst_mask */
2875 	 FALSE);		/* pcrel_offset */
2876 
2877 
2878 /* Swap in a MIPS 64-bit Rel reloc.  */
2879 
2880 static void
mips_elf64_swap_reloc_in(bfd * abfd,const Elf64_Mips_External_Rel * src,Elf64_Mips_Internal_Rela * dst)2881 mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
2882 			  Elf64_Mips_Internal_Rela *dst)
2883 {
2884   dst->r_offset = H_GET_64 (abfd, src->r_offset);
2885   dst->r_sym = H_GET_32 (abfd, src->r_sym);
2886   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
2887   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
2888   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
2889   dst->r_type = H_GET_8 (abfd, src->r_type);
2890   dst->r_addend = 0;
2891 }
2892 
2893 /* Swap in a MIPS 64-bit Rela reloc.  */
2894 
2895 static void
mips_elf64_swap_reloca_in(bfd * abfd,const Elf64_Mips_External_Rela * src,Elf64_Mips_Internal_Rela * dst)2896 mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
2897 			   Elf64_Mips_Internal_Rela *dst)
2898 {
2899   dst->r_offset = H_GET_64 (abfd, src->r_offset);
2900   dst->r_sym = H_GET_32 (abfd, src->r_sym);
2901   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
2902   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
2903   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
2904   dst->r_type = H_GET_8 (abfd, src->r_type);
2905   dst->r_addend = H_GET_S64 (abfd, src->r_addend);
2906 }
2907 
2908 /* Swap out a MIPS 64-bit Rel reloc.  */
2909 
2910 static void
mips_elf64_swap_reloc_out(bfd * abfd,const Elf64_Mips_Internal_Rela * src,Elf64_Mips_External_Rel * dst)2911 mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
2912 			   Elf64_Mips_External_Rel *dst)
2913 {
2914   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
2915   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
2916   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
2917   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
2918   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
2919   H_PUT_8 (abfd, src->r_type, dst->r_type);
2920 }
2921 
2922 /* Swap out a MIPS 64-bit Rela reloc.  */
2923 
2924 static void
mips_elf64_swap_reloca_out(bfd * abfd,const Elf64_Mips_Internal_Rela * src,Elf64_Mips_External_Rela * dst)2925 mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
2926 			    Elf64_Mips_External_Rela *dst)
2927 {
2928   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
2929   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
2930   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
2931   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
2932   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
2933   H_PUT_8 (abfd, src->r_type, dst->r_type);
2934   H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
2935 }
2936 
2937 /* Swap in a MIPS 64-bit Rel reloc.  */
2938 
2939 static void
mips_elf64_be_swap_reloc_in(bfd * abfd,const bfd_byte * src,Elf_Internal_Rela * dst)2940 mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
2941 			     Elf_Internal_Rela *dst)
2942 {
2943   Elf64_Mips_Internal_Rela mirel;
2944 
2945   mips_elf64_swap_reloc_in (abfd,
2946 			    (const Elf64_Mips_External_Rel *) src,
2947 			    &mirel);
2948 
2949   dst[0].r_offset = mirel.r_offset;
2950   dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
2951   dst[0].r_addend = 0;
2952   dst[1].r_offset = mirel.r_offset;
2953   dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
2954   dst[1].r_addend = 0;
2955   dst[2].r_offset = mirel.r_offset;
2956   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
2957   dst[2].r_addend = 0;
2958 }
2959 
2960 /* Swap in a MIPS 64-bit Rela reloc.  */
2961 
2962 static void
mips_elf64_be_swap_reloca_in(bfd * abfd,const bfd_byte * src,Elf_Internal_Rela * dst)2963 mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
2964 			      Elf_Internal_Rela *dst)
2965 {
2966   Elf64_Mips_Internal_Rela mirela;
2967 
2968   mips_elf64_swap_reloca_in (abfd,
2969 			     (const Elf64_Mips_External_Rela *) src,
2970 			     &mirela);
2971 
2972   dst[0].r_offset = mirela.r_offset;
2973   dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
2974   dst[0].r_addend = mirela.r_addend;
2975   dst[1].r_offset = mirela.r_offset;
2976   dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
2977   dst[1].r_addend = 0;
2978   dst[2].r_offset = mirela.r_offset;
2979   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
2980   dst[2].r_addend = 0;
2981 }
2982 
2983 /* Swap out a MIPS 64-bit Rel reloc.  */
2984 
2985 static void
mips_elf64_be_swap_reloc_out(bfd * abfd,const Elf_Internal_Rela * src,bfd_byte * dst)2986 mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
2987 			      bfd_byte *dst)
2988 {
2989   Elf64_Mips_Internal_Rela mirel;
2990 
2991   mirel.r_offset = src[0].r_offset;
2992   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
2993   BFD_ASSERT(src[0].r_offset == src[2].r_offset);
2994 
2995   mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
2996   mirel.r_sym = ELF64_R_SYM (src[0].r_info);
2997   mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
2998   mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
2999   mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
3000 
3001   mips_elf64_swap_reloc_out (abfd, &mirel,
3002 			     (Elf64_Mips_External_Rel *) dst);
3003 }
3004 
3005 /* Swap out a MIPS 64-bit Rela reloc.  */
3006 
3007 static void
mips_elf64_be_swap_reloca_out(bfd * abfd,const Elf_Internal_Rela * src,bfd_byte * dst)3008 mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
3009 			       bfd_byte *dst)
3010 {
3011   Elf64_Mips_Internal_Rela mirela;
3012 
3013   mirela.r_offset = src[0].r_offset;
3014   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
3015   BFD_ASSERT(src[0].r_offset == src[2].r_offset);
3016 
3017   mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
3018   mirela.r_sym = ELF64_R_SYM (src[0].r_info);
3019   mirela.r_addend = src[0].r_addend;
3020   BFD_ASSERT(src[1].r_addend == 0);
3021   BFD_ASSERT(src[2].r_addend == 0);
3022 
3023   mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
3024   mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
3025   mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
3026 
3027   mips_elf64_swap_reloca_out (abfd, &mirela,
3028 			      (Elf64_Mips_External_Rela *) dst);
3029 }
3030 
3031 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
3032    dangerous relocation.  */
3033 
3034 static bfd_boolean
mips_elf64_assign_gp(bfd * output_bfd,bfd_vma * pgp)3035 mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
3036 {
3037   unsigned int count;
3038   asymbol **sym;
3039   unsigned int i;
3040 
3041   /* If we've already figured out what GP will be, just return it.  */
3042   *pgp = _bfd_get_gp_value (output_bfd);
3043   if (*pgp)
3044     return TRUE;
3045 
3046   count = bfd_get_symcount (output_bfd);
3047   sym = bfd_get_outsymbols (output_bfd);
3048 
3049   /* The linker script will have created a symbol named `_gp' with the
3050      appropriate value.  */
3051   if (sym == NULL)
3052     i = count;
3053   else
3054     {
3055       for (i = 0; i < count; i++, sym++)
3056 	{
3057 	  register const char *name;
3058 
3059 	  name = bfd_asymbol_name (*sym);
3060 	  if (*name == '_' && strcmp (name, "_gp") == 0)
3061 	    {
3062 	      *pgp = bfd_asymbol_value (*sym);
3063 	      _bfd_set_gp_value (output_bfd, *pgp);
3064 	      break;
3065 	    }
3066 	}
3067     }
3068 
3069   if (i >= count)
3070     {
3071       /* Only get the error once.  */
3072       *pgp = 4;
3073       _bfd_set_gp_value (output_bfd, *pgp);
3074       return FALSE;
3075     }
3076 
3077   return TRUE;
3078 }
3079 
3080 /* We have to figure out the gp value, so that we can adjust the
3081    symbol value correctly.  We look up the symbol _gp in the output
3082    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
3083    target data.  We don't need to adjust the symbol value for an
3084    external symbol if we are producing relocatable output.  */
3085 
3086 static bfd_reloc_status_type
mips_elf64_final_gp(bfd * output_bfd,asymbol * symbol,bfd_boolean relocatable,char ** error_message,bfd_vma * pgp)3087 mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
3088 		     char **error_message, bfd_vma *pgp)
3089 {
3090   if (bfd_is_und_section (symbol->section)
3091       && ! relocatable)
3092     {
3093       *pgp = 0;
3094       return bfd_reloc_undefined;
3095     }
3096 
3097   *pgp = _bfd_get_gp_value (output_bfd);
3098   if (*pgp == 0
3099       && (! relocatable
3100 	  || (symbol->flags & BSF_SECTION_SYM) != 0))
3101     {
3102       if (relocatable)
3103 	{
3104 	  /* Make up a value.  */
3105 	  *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
3106 	  _bfd_set_gp_value (output_bfd, *pgp);
3107 	}
3108       else if (!mips_elf64_assign_gp (output_bfd, pgp))
3109 	{
3110 	  *error_message =
3111 	    (char *) _("GP relative relocation when _gp not defined");
3112 	  return bfd_reloc_dangerous;
3113 	}
3114     }
3115 
3116   return bfd_reloc_ok;
3117 }
3118 
3119 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
3120    become the offset from the gp register.  */
3121 
3122 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)3123 mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3124 			  void *data, asection *input_section, bfd *output_bfd,
3125 			  char **error_message)
3126 {
3127   bfd_boolean relocatable;
3128   bfd_reloc_status_type ret;
3129   bfd_vma gp;
3130 
3131   /* If we're relocating, and this is an external symbol, we don't want
3132      to change anything.  */
3133   if (output_bfd != NULL
3134       && (symbol->flags & BSF_SECTION_SYM) == 0
3135       && (symbol->flags & BSF_LOCAL) != 0)
3136     {
3137       reloc_entry->address += input_section->output_offset;
3138       return bfd_reloc_ok;
3139     }
3140 
3141   if (output_bfd != NULL)
3142     relocatable = TRUE;
3143   else
3144     {
3145       relocatable = FALSE;
3146       output_bfd = symbol->section->output_section->owner;
3147     }
3148 
3149   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3150 			     &gp);
3151   if (ret != bfd_reloc_ok)
3152     return ret;
3153 
3154   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3155 					input_section, relocatable,
3156 					data, gp);
3157 }
3158 
3159 /* Do a R_MIPS_LITERAL relocation.  */
3160 
3161 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)3162 mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3163 			  void *data, asection *input_section, bfd *output_bfd,
3164 			  char **error_message)
3165 {
3166   bfd_boolean relocatable;
3167   bfd_reloc_status_type ret;
3168   bfd_vma gp;
3169 
3170   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
3171   if (output_bfd != NULL
3172       && (symbol->flags & BSF_SECTION_SYM) == 0
3173       && (symbol->flags & BSF_LOCAL) != 0)
3174     {
3175       *error_message = (char *)
3176 	_("literal relocation occurs for an external symbol");
3177       return bfd_reloc_outofrange;
3178     }
3179 
3180   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
3181   if (output_bfd != NULL)
3182     relocatable = TRUE;
3183   else
3184     {
3185       relocatable = FALSE;
3186       output_bfd = symbol->section->output_section->owner;
3187     }
3188 
3189   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3190 			     &gp);
3191   if (ret != bfd_reloc_ok)
3192     return ret;
3193 
3194   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3195 					input_section, relocatable,
3196 					data, gp);
3197 }
3198 
3199 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
3200    become the offset from the gp register.  */
3201 
3202 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)3203 mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3204 			  void *data, asection *input_section, bfd *output_bfd,
3205 			  char **error_message)
3206 {
3207   bfd_boolean relocatable;
3208   bfd_reloc_status_type ret;
3209   bfd_vma gp;
3210   bfd_vma relocation;
3211   bfd_vma val;
3212 
3213   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
3214   if (output_bfd != NULL
3215       && (symbol->flags & BSF_SECTION_SYM) == 0
3216       && (symbol->flags & BSF_LOCAL) != 0)
3217     {
3218       *error_message = (char *)
3219 	_("32bits gp relative relocation occurs for an external symbol");
3220       return bfd_reloc_outofrange;
3221     }
3222 
3223   if (output_bfd != NULL)
3224     relocatable = TRUE;
3225   else
3226     {
3227       relocatable = FALSE;
3228       output_bfd = symbol->section->output_section->owner;
3229     }
3230 
3231   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
3232 			     error_message, &gp);
3233   if (ret != bfd_reloc_ok)
3234     return ret;
3235 
3236   if (bfd_is_com_section (symbol->section))
3237     relocation = 0;
3238   else
3239     relocation = symbol->value;
3240 
3241   relocation += symbol->section->output_section->vma;
3242   relocation += symbol->section->output_offset;
3243 
3244   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
3245     return bfd_reloc_outofrange;
3246 
3247   /* Set val to the offset into the section or symbol.  */
3248   val = reloc_entry->addend;
3249 
3250   if (reloc_entry->howto->partial_inplace)
3251     val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
3252 
3253   /* Adjust val for the final section location and GP value.  If we
3254      are producing relocatable output, we don't want to do this for
3255      an external symbol.  */
3256   if (! relocatable
3257       || (symbol->flags & BSF_SECTION_SYM) != 0)
3258     val += relocation - gp;
3259 
3260   if (reloc_entry->howto->partial_inplace)
3261     bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
3262   else
3263     reloc_entry->addend = val;
3264 
3265   if (relocatable)
3266     reloc_entry->address += input_section->output_offset;
3267 
3268   return bfd_reloc_ok;
3269 }
3270 
3271 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
3272    the rest is at bits 6-10. The bitpos already got right by the howto.  */
3273 
3274 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)3275 mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3276 			 void *data, asection *input_section, bfd *output_bfd,
3277 			 char **error_message)
3278 {
3279   if (reloc_entry->howto->partial_inplace)
3280     {
3281       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
3282 			     | (reloc_entry->addend & 0x00000800) >> 9);
3283     }
3284 
3285   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
3286 				      input_section, output_bfd,
3287 				      error_message);
3288 }
3289 
3290 /* Handle a mips16 GP relative reloc.  */
3291 
3292 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)3293 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
3294 		    void *data, asection *input_section, bfd *output_bfd,
3295 		    char **error_message)
3296 {
3297   bfd_boolean relocatable;
3298   bfd_reloc_status_type ret;
3299   bfd_byte *location;
3300   bfd_vma gp;
3301 
3302   /* If we're relocating, and this is an external symbol, we don't want
3303      to change anything.  */
3304   if (output_bfd != NULL
3305       && (symbol->flags & BSF_SECTION_SYM) == 0
3306       && (symbol->flags & BSF_LOCAL) != 0)
3307     {
3308       reloc_entry->address += input_section->output_offset;
3309       return bfd_reloc_ok;
3310     }
3311 
3312   if (output_bfd != NULL)
3313     relocatable = TRUE;
3314   else
3315     {
3316       relocatable = FALSE;
3317       output_bfd = symbol->section->output_section->owner;
3318     }
3319 
3320   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
3321 			     &gp);
3322   if (ret != bfd_reloc_ok)
3323     return ret;
3324 
3325   location = (bfd_byte *) data + reloc_entry->address;
3326   _bfd_mips_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
3327 				 location);
3328   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
3329 				       input_section, relocatable,
3330 				       data, gp);
3331   _bfd_mips_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
3332 			       location);
3333 
3334   return ret;
3335 }
3336 
3337 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
3338 
3339 struct elf_reloc_map {
3340   bfd_reloc_code_real_type bfd_val;
3341   enum elf_mips_reloc_type elf_val;
3342 };
3343 
3344 static const struct elf_reloc_map mips_reloc_map[] =
3345 {
3346   { BFD_RELOC_NONE, R_MIPS_NONE },
3347   { BFD_RELOC_16, R_MIPS_16 },
3348   { BFD_RELOC_32, R_MIPS_32 },
3349   /* There is no BFD reloc for R_MIPS_REL32.  */
3350   { BFD_RELOC_64, R_MIPS_64 },
3351   { BFD_RELOC_CTOR, R_MIPS_64 },
3352   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
3353   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
3354   { BFD_RELOC_LO16, R_MIPS_LO16 },
3355   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
3356   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
3357   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
3358   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
3359   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
3360   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
3361   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
3362   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
3363   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
3364   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
3365   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
3366   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
3367   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
3368   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
3369   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
3370   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
3371   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
3372   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
3373   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
3374   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
3375   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
3376   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
3377   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
3378   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
3379   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
3380   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
3381   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
3382   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
3383   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
3384   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
3385   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
3386   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
3387   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
3388   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
3389   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
3390   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
3391   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
3392   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
3393   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 },
3394   { BFD_RELOC_MIPS_21_PCREL_S2, R_MIPS_PC21_S2 },
3395   { BFD_RELOC_MIPS_26_PCREL_S2, R_MIPS_PC26_S2 },
3396   { BFD_RELOC_MIPS_18_PCREL_S3, R_MIPS_PC18_S3 },
3397   { BFD_RELOC_MIPS_19_PCREL_S2, R_MIPS_PC19_S2 },
3398   { BFD_RELOC_HI16_S_PCREL, R_MIPS_PCHI16 },
3399   { BFD_RELOC_LO16_PCREL, R_MIPS_PCLO16 }
3400 };
3401 
3402 static const struct elf_reloc_map mips16_reloc_map[] =
3403 {
3404   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
3405   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
3406   { BFD_RELOC_MIPS16_GOT16, R_MIPS16_GOT16 - R_MIPS16_min },
3407   { BFD_RELOC_MIPS16_CALL16, R_MIPS16_CALL16 - R_MIPS16_min },
3408   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
3409   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
3410   { BFD_RELOC_MIPS16_TLS_GD, R_MIPS16_TLS_GD - R_MIPS16_min },
3411   { BFD_RELOC_MIPS16_TLS_LDM, R_MIPS16_TLS_LDM - R_MIPS16_min },
3412   { BFD_RELOC_MIPS16_TLS_DTPREL_HI16,
3413     R_MIPS16_TLS_DTPREL_HI16 - R_MIPS16_min },
3414   { BFD_RELOC_MIPS16_TLS_DTPREL_LO16,
3415     R_MIPS16_TLS_DTPREL_LO16 - R_MIPS16_min },
3416   { BFD_RELOC_MIPS16_TLS_GOTTPREL, R_MIPS16_TLS_GOTTPREL - R_MIPS16_min },
3417   { BFD_RELOC_MIPS16_TLS_TPREL_HI16, R_MIPS16_TLS_TPREL_HI16 - R_MIPS16_min },
3418   { BFD_RELOC_MIPS16_TLS_TPREL_LO16, R_MIPS16_TLS_TPREL_LO16 - R_MIPS16_min }
3419 };
3420 
3421 static const struct elf_reloc_map micromips_reloc_map[] =
3422 {
3423   { BFD_RELOC_MICROMIPS_JMP, R_MICROMIPS_26_S1 - R_MICROMIPS_min },
3424   { BFD_RELOC_MICROMIPS_HI16_S, R_MICROMIPS_HI16 - R_MICROMIPS_min },
3425   { BFD_RELOC_MICROMIPS_LO16, R_MICROMIPS_LO16 - R_MICROMIPS_min },
3426   { BFD_RELOC_MICROMIPS_GPREL16, R_MICROMIPS_GPREL16 - R_MICROMIPS_min },
3427   { BFD_RELOC_MICROMIPS_LITERAL, R_MICROMIPS_LITERAL - R_MICROMIPS_min },
3428   { BFD_RELOC_MICROMIPS_GOT16, R_MICROMIPS_GOT16 - R_MICROMIPS_min },
3429   { BFD_RELOC_MICROMIPS_7_PCREL_S1, R_MICROMIPS_PC7_S1 - R_MICROMIPS_min },
3430   { BFD_RELOC_MICROMIPS_10_PCREL_S1, R_MICROMIPS_PC10_S1 - R_MICROMIPS_min },
3431   { BFD_RELOC_MICROMIPS_16_PCREL_S1, R_MICROMIPS_PC16_S1 - R_MICROMIPS_min },
3432   { BFD_RELOC_MICROMIPS_CALL16, R_MICROMIPS_CALL16 - R_MICROMIPS_min },
3433   { BFD_RELOC_MICROMIPS_GOT_DISP, R_MICROMIPS_GOT_DISP - R_MICROMIPS_min },
3434   { BFD_RELOC_MICROMIPS_GOT_PAGE, R_MICROMIPS_GOT_PAGE - R_MICROMIPS_min },
3435   { BFD_RELOC_MICROMIPS_GOT_OFST, R_MICROMIPS_GOT_OFST - R_MICROMIPS_min },
3436   { BFD_RELOC_MICROMIPS_GOT_HI16, R_MICROMIPS_GOT_HI16 - R_MICROMIPS_min },
3437   { BFD_RELOC_MICROMIPS_GOT_LO16, R_MICROMIPS_GOT_LO16 - R_MICROMIPS_min },
3438   { BFD_RELOC_MICROMIPS_SUB, R_MICROMIPS_SUB - R_MICROMIPS_min },
3439   { BFD_RELOC_MICROMIPS_HIGHER, R_MICROMIPS_HIGHER - R_MICROMIPS_min },
3440   { BFD_RELOC_MICROMIPS_HIGHEST, R_MICROMIPS_HIGHEST - R_MICROMIPS_min },
3441   { BFD_RELOC_MICROMIPS_CALL_HI16, R_MICROMIPS_CALL_HI16 - R_MICROMIPS_min },
3442   { BFD_RELOC_MICROMIPS_CALL_LO16, R_MICROMIPS_CALL_LO16 - R_MICROMIPS_min },
3443   { BFD_RELOC_MICROMIPS_SCN_DISP, R_MICROMIPS_SCN_DISP - R_MICROMIPS_min },
3444   { BFD_RELOC_MICROMIPS_JALR, R_MICROMIPS_JALR - R_MICROMIPS_min },
3445 };
3446 /* Given a BFD reloc type, return a howto structure.  */
3447 
3448 static reloc_howto_type *
bfd_elf64_bfd_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)3449 bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3450 				 bfd_reloc_code_real_type code)
3451 {
3452   unsigned int i;
3453   /* FIXME: We default to RELA here instead of choosing the right
3454      relocation variant.  */
3455   reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
3456   reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
3457   reloc_howto_type *howto_micromips_table = micromips_elf64_howto_table_rela;
3458 
3459   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
3460        i++)
3461     {
3462       if (mips_reloc_map[i].bfd_val == code)
3463 	return &howto_table[(int) mips_reloc_map[i].elf_val];
3464     }
3465 
3466   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
3467        i++)
3468     {
3469       if (mips16_reloc_map[i].bfd_val == code)
3470 	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
3471     }
3472 
3473   for (i = 0; i < sizeof (micromips_reloc_map) / sizeof (struct elf_reloc_map);
3474        i++)
3475     {
3476       if (micromips_reloc_map[i].bfd_val == code)
3477 	return &howto_micromips_table[(int) micromips_reloc_map[i].elf_val];
3478     }
3479 
3480   switch (code)
3481     {
3482     case BFD_RELOC_VTABLE_INHERIT:
3483       return &elf_mips_gnu_vtinherit_howto;
3484     case BFD_RELOC_VTABLE_ENTRY:
3485       return &elf_mips_gnu_vtentry_howto;
3486     case BFD_RELOC_32_PCREL:
3487       return &elf_mips_gnu_pcrel32;
3488     case BFD_RELOC_MIPS_EH:
3489       return &elf_mips_eh_howto;
3490     case BFD_RELOC_MIPS_COPY:
3491       return &elf_mips_copy_howto;
3492     case BFD_RELOC_MIPS_JUMP_SLOT:
3493       return &elf_mips_jump_slot_howto;
3494     default:
3495       bfd_set_error (bfd_error_bad_value);
3496       return NULL;
3497     }
3498 }
3499 
3500 static reloc_howto_type *
bfd_elf64_bfd_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * r_name)3501 bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
3502 				 const char *r_name)
3503 {
3504   unsigned int i;
3505 
3506   for (i = 0;
3507        i < (sizeof (mips_elf64_howto_table_rela)
3508 	    / sizeof (mips_elf64_howto_table_rela[0])); i++)
3509     if (mips_elf64_howto_table_rela[i].name != NULL
3510 	&& strcasecmp (mips_elf64_howto_table_rela[i].name, r_name) == 0)
3511       return &mips_elf64_howto_table_rela[i];
3512 
3513   for (i = 0;
3514        i < (sizeof (mips16_elf64_howto_table_rela)
3515 	    / sizeof (mips16_elf64_howto_table_rela[0]));
3516        i++)
3517     if (mips16_elf64_howto_table_rela[i].name != NULL
3518 	&& strcasecmp (mips16_elf64_howto_table_rela[i].name, r_name) == 0)
3519       return &mips16_elf64_howto_table_rela[i];
3520 
3521   for (i = 0;
3522        i < (sizeof (micromips_elf64_howto_table_rela)
3523 	    / sizeof (micromips_elf64_howto_table_rela[0]));
3524        i++)
3525     if (micromips_elf64_howto_table_rela[i].name != NULL
3526 	&& strcasecmp (micromips_elf64_howto_table_rela[i].name, r_name) == 0)
3527       return &micromips_elf64_howto_table_rela[i];
3528 
3529   if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
3530     return &elf_mips_gnu_vtinherit_howto;
3531   if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
3532     return &elf_mips_gnu_vtentry_howto;
3533   if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
3534     return &elf_mips_gnu_rel16_s2;
3535   if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
3536     return &elf_mips_gnu_rela16_s2;
3537   if (strcasecmp (elf_mips_gnu_pcrel32.name, r_name) == 0)
3538     return &elf_mips_gnu_pcrel32;
3539   if (strcasecmp (elf_mips_eh_howto.name, r_name) == 0)
3540     return &elf_mips_eh_howto;
3541   if (strcasecmp (elf_mips_copy_howto.name, r_name) == 0)
3542     return &elf_mips_copy_howto;
3543   if (strcasecmp (elf_mips_jump_slot_howto.name, r_name) == 0)
3544     return &elf_mips_jump_slot_howto;
3545 
3546   return NULL;
3547 }
3548 
3549 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
3550 
3551 static reloc_howto_type *
mips_elf64_rtype_to_howto(unsigned int r_type,bfd_boolean rela_p)3552 mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
3553 {
3554   switch (r_type)
3555     {
3556     case R_MIPS_GNU_VTINHERIT:
3557       return &elf_mips_gnu_vtinherit_howto;
3558     case R_MIPS_GNU_VTENTRY:
3559       return &elf_mips_gnu_vtentry_howto;
3560     case R_MIPS_GNU_REL16_S2:
3561       if (rela_p)
3562 	return &elf_mips_gnu_rela16_s2;
3563       else
3564 	return &elf_mips_gnu_rel16_s2;
3565     case R_MIPS_PC32:
3566       return &elf_mips_gnu_pcrel32;
3567     case R_MIPS_EH:
3568       return &elf_mips_eh_howto;
3569     case R_MIPS_COPY:
3570       return &elf_mips_copy_howto;
3571     case R_MIPS_JUMP_SLOT:
3572       return &elf_mips_jump_slot_howto;
3573     default:
3574       if (r_type >= R_MICROMIPS_min && r_type < R_MICROMIPS_max)
3575 	{
3576 	  if (rela_p)
3577 	    return &micromips_elf64_howto_table_rela[r_type - R_MICROMIPS_min];
3578 	  else
3579 	    return &micromips_elf64_howto_table_rel[r_type - R_MICROMIPS_min];
3580 	}
3581       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
3582 	{
3583 	  if (rela_p)
3584 	    return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
3585 	  else
3586 	    return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
3587 	}
3588       BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
3589       if (rela_p)
3590 	return &mips_elf64_howto_table_rela[r_type];
3591       else
3592 	return &mips_elf64_howto_table_rel[r_type];
3593       break;
3594     }
3595 }
3596 
3597 /* Prevent relocation handling by bfd for MIPS ELF64.  */
3598 
3599 static void
mips_elf64_info_to_howto_rel(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr ATTRIBUTE_UNUSED,Elf_Internal_Rela * dst ATTRIBUTE_UNUSED)3600 mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
3601 			      arelent *cache_ptr ATTRIBUTE_UNUSED,
3602 			      Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
3603 {
3604   BFD_ASSERT (0);
3605 }
3606 
3607 static void
mips_elf64_info_to_howto_rela(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr ATTRIBUTE_UNUSED,Elf_Internal_Rela * dst ATTRIBUTE_UNUSED)3608 mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
3609 			       arelent *cache_ptr ATTRIBUTE_UNUSED,
3610 			       Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
3611 {
3612   BFD_ASSERT (0);
3613 }
3614 
3615 /* Since each entry in an SHT_REL or SHT_RELA section can represent up
3616    to three relocs, we must tell the user to allocate more space.  */
3617 
3618 static long
mips_elf64_get_reloc_upper_bound(bfd * abfd ATTRIBUTE_UNUSED,asection * sec)3619 mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
3620 {
3621   return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
3622 }
3623 
3624 static long
mips_elf64_get_dynamic_reloc_upper_bound(bfd * abfd)3625 mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
3626 {
3627   return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
3628 }
3629 
3630 /* We must also copy more relocations than the corresponding functions
3631    in elf.c would, so the two following functions are slightly
3632    modified from elf.c, that multiply the external relocation count by
3633    3 to obtain the internal relocation count.  */
3634 
3635 static long
mips_elf64_canonicalize_reloc(bfd * abfd,sec_ptr section,arelent ** relptr,asymbol ** symbols)3636 mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section,
3637 			       arelent **relptr, asymbol **symbols)
3638 {
3639   arelent *tblptr;
3640   unsigned int i;
3641   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
3642 
3643   if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
3644     return -1;
3645 
3646   tblptr = section->relocation;
3647   for (i = 0; i < section->reloc_count * 3; i++)
3648     *relptr++ = tblptr++;
3649 
3650   *relptr = NULL;
3651 
3652   return section->reloc_count * 3;
3653 }
3654 
3655 static long
mips_elf64_canonicalize_dynamic_reloc(bfd * abfd,arelent ** storage,asymbol ** syms)3656 mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
3657 				       asymbol **syms)
3658 {
3659   bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
3660   asection *s;
3661   long ret;
3662 
3663   if (elf_dynsymtab (abfd) == 0)
3664     {
3665       bfd_set_error (bfd_error_invalid_operation);
3666       return -1;
3667     }
3668 
3669   slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
3670   ret = 0;
3671   for (s = abfd->sections; s != NULL; s = s->next)
3672     {
3673       if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
3674 	  && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
3675 	      || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
3676 	{
3677 	  arelent *p;
3678 	  long count, i;
3679 
3680 	  if (! (*slurp_relocs) (abfd, s, syms, TRUE))
3681 	    return -1;
3682 	  count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3;
3683 	  p = s->relocation;
3684 	  for (i = 0; i < count; i++)
3685 	    *storage++ = p++;
3686 	  ret += count;
3687 	}
3688     }
3689 
3690   *storage = NULL;
3691 
3692   return ret;
3693 }
3694 
3695 /* Read the relocations from one reloc section.  This is mostly copied
3696    from elfcode.h, except for the changes to expand one external
3697    relocation to 3 internal ones.  We must unfortunately set
3698    reloc_count to the number of external relocations, because a lot of
3699    generic code seems to depend on this.  */
3700 
3701 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)3702 mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
3703 				  Elf_Internal_Shdr *rel_hdr,
3704 				  bfd_size_type reloc_count,
3705 				  arelent *relents, asymbol **symbols,
3706 				  bfd_boolean dynamic)
3707 {
3708   void *allocated;
3709   bfd_byte *native_relocs;
3710   arelent *relent;
3711   bfd_vma i;
3712   int entsize;
3713   bfd_boolean rela_p;
3714 
3715   allocated = bfd_malloc (rel_hdr->sh_size);
3716   if (allocated == NULL)
3717     return FALSE;
3718 
3719   if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
3720       || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
3721 	  != rel_hdr->sh_size))
3722     goto error_return;
3723 
3724   native_relocs = allocated;
3725 
3726   entsize = rel_hdr->sh_entsize;
3727   BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
3728 	      || entsize == sizeof (Elf64_Mips_External_Rela));
3729 
3730   if (entsize == sizeof (Elf64_Mips_External_Rel))
3731     rela_p = FALSE;
3732   else
3733     rela_p = TRUE;
3734 
3735   for (i = 0, relent = relents;
3736        i < reloc_count;
3737        i++, native_relocs += entsize)
3738     {
3739       Elf64_Mips_Internal_Rela rela;
3740       bfd_boolean used_sym, used_ssym;
3741       int ir;
3742 
3743       if (entsize == sizeof (Elf64_Mips_External_Rela))
3744 	mips_elf64_swap_reloca_in (abfd,
3745 				   (Elf64_Mips_External_Rela *) native_relocs,
3746 				   &rela);
3747       else
3748 	mips_elf64_swap_reloc_in (abfd,
3749 				  (Elf64_Mips_External_Rel *) native_relocs,
3750 				  &rela);
3751 
3752       /* Each entry represents exactly three actual relocations.  */
3753 
3754       used_sym = FALSE;
3755       used_ssym = FALSE;
3756       for (ir = 0; ir < 3; ir++)
3757 	{
3758 	  enum elf_mips_reloc_type type;
3759 
3760 	  switch (ir)
3761 	    {
3762 	    default:
3763 	      abort ();
3764 	    case 0:
3765 	      type = (enum elf_mips_reloc_type) rela.r_type;
3766 	      break;
3767 	    case 1:
3768 	      type = (enum elf_mips_reloc_type) rela.r_type2;
3769 	      break;
3770 	    case 2:
3771 	      type = (enum elf_mips_reloc_type) rela.r_type3;
3772 	      break;
3773 	    }
3774 
3775 	  /* Some types require symbols, whereas some do not.  */
3776 	  switch (type)
3777 	    {
3778 	    case R_MIPS_NONE:
3779 	    case R_MIPS_LITERAL:
3780 	    case R_MIPS_INSERT_A:
3781 	    case R_MIPS_INSERT_B:
3782 	    case R_MIPS_DELETE:
3783 	      relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3784 	      break;
3785 
3786 	    default:
3787 	      if (! used_sym)
3788 		{
3789 		  if (rela.r_sym == STN_UNDEF)
3790 		    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3791 		  else
3792 		    {
3793 		      asymbol **ps, *s;
3794 
3795 		      ps = symbols + rela.r_sym - 1;
3796 		      s = *ps;
3797 		      if ((s->flags & BSF_SECTION_SYM) == 0)
3798 			relent->sym_ptr_ptr = ps;
3799 		      else
3800 			relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
3801 		    }
3802 
3803 		  used_sym = TRUE;
3804 		}
3805 	      else if (! used_ssym)
3806 		{
3807 		  switch (rela.r_ssym)
3808 		    {
3809 		    case RSS_UNDEF:
3810 		      relent->sym_ptr_ptr =
3811 			bfd_abs_section_ptr->symbol_ptr_ptr;
3812 		      break;
3813 
3814 		    case RSS_GP:
3815 		    case RSS_GP0:
3816 		    case RSS_LOC:
3817 		      /* FIXME: I think these need to be handled using
3818 			 special howto structures.  */
3819 		      BFD_ASSERT (0);
3820 		      break;
3821 
3822 		    default:
3823 		      BFD_ASSERT (0);
3824 		      break;
3825 		    }
3826 
3827 		  used_ssym = TRUE;
3828 		}
3829 	      else
3830 		relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
3831 
3832 	      break;
3833 	    }
3834 
3835 	  /* The address of an ELF reloc is section relative for an
3836 	     object file, and absolute for an executable file or
3837 	     shared library.  The address of a BFD reloc is always
3838 	     section relative.  */
3839 	  if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
3840 	    relent->address = rela.r_offset;
3841 	  else
3842 	    relent->address = rela.r_offset - asect->vma;
3843 
3844 	  relent->addend = rela.r_addend;
3845 
3846 	  relent->howto = mips_elf64_rtype_to_howto (type, rela_p);
3847 
3848 	  ++relent;
3849 	}
3850     }
3851 
3852   asect->reloc_count += (relent - relents) / 3;
3853 
3854   if (allocated != NULL)
3855     free (allocated);
3856 
3857   return TRUE;
3858 
3859  error_return:
3860   if (allocated != NULL)
3861     free (allocated);
3862   return FALSE;
3863 }
3864 
3865 /* Read the relocations.  On Irix 6, there can be two reloc sections
3866    associated with a single data section.  This is copied from
3867    elfcode.h as well, with changes as small as accounting for 3
3868    internal relocs per external reloc and resetting reloc_count to
3869    zero before processing the relocs of a section.  */
3870 
3871 static bfd_boolean
mips_elf64_slurp_reloc_table(bfd * abfd,asection * asect,asymbol ** symbols,bfd_boolean dynamic)3872 mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
3873 			      asymbol **symbols, bfd_boolean dynamic)
3874 {
3875   struct bfd_elf_section_data * const d = elf_section_data (asect);
3876   Elf_Internal_Shdr *rel_hdr;
3877   Elf_Internal_Shdr *rel_hdr2;
3878   bfd_size_type reloc_count;
3879   bfd_size_type reloc_count2;
3880   arelent *relents;
3881   bfd_size_type amt;
3882 
3883   if (asect->relocation != NULL)
3884     return TRUE;
3885 
3886   if (! dynamic)
3887     {
3888       if ((asect->flags & SEC_RELOC) == 0
3889 	  || asect->reloc_count == 0)
3890 	return TRUE;
3891 
3892       rel_hdr = d->rel.hdr;
3893       reloc_count = rel_hdr ? NUM_SHDR_ENTRIES (rel_hdr) : 0;
3894       rel_hdr2 = d->rela.hdr;
3895       reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
3896 
3897       BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
3898       BFD_ASSERT ((rel_hdr && asect->rel_filepos == rel_hdr->sh_offset)
3899 		  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
3900 
3901     }
3902   else
3903     {
3904       /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
3905 	 case because relocations against this section may use the
3906 	 dynamic symbol table, and in that case bfd_section_from_shdr
3907 	 in elf.c does not update the RELOC_COUNT.  */
3908       if (asect->size == 0)
3909 	return TRUE;
3910 
3911       rel_hdr = &d->this_hdr;
3912       reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
3913       rel_hdr2 = NULL;
3914       reloc_count2 = 0;
3915     }
3916 
3917   /* Allocate space for 3 arelent structures for each Rel structure.  */
3918   amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
3919   relents = bfd_alloc (abfd, amt);
3920   if (relents == NULL)
3921     return FALSE;
3922 
3923   /* The slurp_one_reloc_table routine increments reloc_count.  */
3924   asect->reloc_count = 0;
3925 
3926   if (rel_hdr != NULL
3927       && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
3928 					     rel_hdr, reloc_count,
3929 					     relents,
3930 					     symbols, dynamic))
3931     return FALSE;
3932   if (rel_hdr2 != NULL
3933       && ! mips_elf64_slurp_one_reloc_table (abfd, asect,
3934 					     rel_hdr2, reloc_count2,
3935 					     relents + reloc_count * 3,
3936 					     symbols, dynamic))
3937     return FALSE;
3938 
3939   asect->relocation = relents;
3940   return TRUE;
3941 }
3942 
3943 /* Write out the relocations.  */
3944 
3945 static void
mips_elf64_write_relocs(bfd * abfd,asection * sec,void * data)3946 mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
3947 {
3948   bfd_boolean *failedp = data;
3949   int count;
3950   Elf_Internal_Shdr *rel_hdr;
3951   unsigned int idx;
3952 
3953   /* If we have already failed, don't do anything.  */
3954   if (*failedp)
3955     return;
3956 
3957   if ((sec->flags & SEC_RELOC) == 0)
3958     return;
3959 
3960   /* The linker backend writes the relocs out itself, and sets the
3961      reloc_count field to zero to inhibit writing them here.  Also,
3962      sometimes the SEC_RELOC flag gets set even when there aren't any
3963      relocs.  */
3964   if (sec->reloc_count == 0)
3965     return;
3966 
3967   /* We can combine up to three relocs that refer to the same address
3968      if the latter relocs have no associated symbol.  */
3969   count = 0;
3970   for (idx = 0; idx < sec->reloc_count; idx++)
3971     {
3972       bfd_vma addr;
3973       unsigned int i;
3974 
3975       ++count;
3976 
3977       addr = sec->orelocation[idx]->address;
3978       for (i = 0; i < 2; i++)
3979 	{
3980 	  arelent *r;
3981 
3982 	  if (idx + 1 >= sec->reloc_count)
3983 	    break;
3984 	  r = sec->orelocation[idx + 1];
3985 	  if (r->address != addr
3986 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
3987 	      || (*r->sym_ptr_ptr)->value != 0)
3988 	    break;
3989 
3990 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
3991 
3992 	  ++idx;
3993 	}
3994     }
3995 
3996   rel_hdr = _bfd_elf_single_rel_hdr (sec);
3997 
3998   /* Do the actual relocation.  */
3999 
4000   if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
4001     mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
4002   else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
4003     mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
4004   else
4005     BFD_ASSERT (0);
4006 }
4007 
4008 static void
mips_elf64_write_rel(bfd * abfd,asection * sec,Elf_Internal_Shdr * rel_hdr,int * count,void * data)4009 mips_elf64_write_rel (bfd *abfd, asection *sec,
4010 		      Elf_Internal_Shdr *rel_hdr,
4011 		      int *count, void *data)
4012 {
4013   bfd_boolean *failedp = data;
4014   Elf64_Mips_External_Rel *ext_rel;
4015   unsigned int idx;
4016   asymbol *last_sym = 0;
4017   int last_sym_idx = 0;
4018 
4019   rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
4020   rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
4021   if (rel_hdr->contents == NULL)
4022     {
4023       *failedp = TRUE;
4024       return;
4025     }
4026 
4027   ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
4028   for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
4029     {
4030       arelent *ptr;
4031       Elf64_Mips_Internal_Rela int_rel;
4032       asymbol *sym;
4033       int n;
4034       unsigned int i;
4035 
4036       ptr = sec->orelocation[idx];
4037 
4038       /* The address of an ELF reloc is section relative for an object
4039 	 file, and absolute for an executable file or shared library.
4040 	 The address of a BFD reloc is always section relative.  */
4041       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
4042 	int_rel.r_offset = ptr->address;
4043       else
4044 	int_rel.r_offset = ptr->address + sec->vma;
4045 
4046       sym = *ptr->sym_ptr_ptr;
4047       if (sym == last_sym)
4048 	n = last_sym_idx;
4049       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
4050 	n = STN_UNDEF;
4051       else
4052 	{
4053 	  last_sym = sym;
4054 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
4055 	  if (n < 0)
4056 	    {
4057 	      *failedp = TRUE;
4058 	      return;
4059 	    }
4060 	  last_sym_idx = n;
4061 	}
4062 
4063       int_rel.r_sym = n;
4064       int_rel.r_ssym = RSS_UNDEF;
4065 
4066       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
4067 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
4068 	{
4069 	  *failedp = TRUE;
4070 	  return;
4071 	}
4072 
4073       int_rel.r_type = ptr->howto->type;
4074       int_rel.r_type2 = (int) R_MIPS_NONE;
4075       int_rel.r_type3 = (int) R_MIPS_NONE;
4076 
4077       for (i = 0; i < 2; i++)
4078 	{
4079 	  arelent *r;
4080 
4081 	  if (idx + 1 >= sec->reloc_count)
4082 	    break;
4083 	  r = sec->orelocation[idx + 1];
4084 	  if (r->address != ptr->address
4085 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
4086 	      || (*r->sym_ptr_ptr)->value != 0)
4087 	    break;
4088 
4089 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
4090 
4091 	  if (i == 0)
4092 	    int_rel.r_type2 = r->howto->type;
4093 	  else
4094 	    int_rel.r_type3 = r->howto->type;
4095 
4096 	  ++idx;
4097 	}
4098 
4099       mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
4100     }
4101 
4102   BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
4103 	      == *count);
4104 }
4105 
4106 static void
mips_elf64_write_rela(bfd * abfd,asection * sec,Elf_Internal_Shdr * rela_hdr,int * count,void * data)4107 mips_elf64_write_rela (bfd *abfd, asection *sec,
4108 		       Elf_Internal_Shdr *rela_hdr,
4109 		       int *count, void *data)
4110 {
4111   bfd_boolean *failedp = data;
4112   Elf64_Mips_External_Rela *ext_rela;
4113   unsigned int idx;
4114   asymbol *last_sym = 0;
4115   int last_sym_idx = 0;
4116 
4117   rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
4118   rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
4119   if (rela_hdr->contents == NULL)
4120     {
4121       *failedp = TRUE;
4122       return;
4123     }
4124 
4125   ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
4126   for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
4127     {
4128       arelent *ptr;
4129       Elf64_Mips_Internal_Rela int_rela;
4130       asymbol *sym;
4131       int n;
4132       unsigned int i;
4133 
4134       ptr = sec->orelocation[idx];
4135 
4136       /* The address of an ELF reloc is section relative for an object
4137 	 file, and absolute for an executable file or shared library.
4138 	 The address of a BFD reloc is always section relative.  */
4139       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
4140 	int_rela.r_offset = ptr->address;
4141       else
4142 	int_rela.r_offset = ptr->address + sec->vma;
4143 
4144       sym = *ptr->sym_ptr_ptr;
4145       if (sym == last_sym)
4146 	n = last_sym_idx;
4147       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
4148 	n = STN_UNDEF;
4149       else
4150 	{
4151 	  last_sym = sym;
4152 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
4153 	  if (n < 0)
4154 	    {
4155 	      *failedp = TRUE;
4156 	      return;
4157 	    }
4158 	  last_sym_idx = n;
4159 	}
4160 
4161       int_rela.r_sym = n;
4162       int_rela.r_addend = ptr->addend;
4163       int_rela.r_ssym = RSS_UNDEF;
4164 
4165       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
4166 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
4167 	{
4168 	  *failedp = TRUE;
4169 	  return;
4170 	}
4171 
4172       int_rela.r_type = ptr->howto->type;
4173       int_rela.r_type2 = (int) R_MIPS_NONE;
4174       int_rela.r_type3 = (int) R_MIPS_NONE;
4175 
4176       for (i = 0; i < 2; i++)
4177 	{
4178 	  arelent *r;
4179 
4180 	  if (idx + 1 >= sec->reloc_count)
4181 	    break;
4182 	  r = sec->orelocation[idx + 1];
4183 	  if (r->address != ptr->address
4184 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
4185 	      || (*r->sym_ptr_ptr)->value != 0)
4186 	    break;
4187 
4188 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
4189 
4190 	  if (i == 0)
4191 	    int_rela.r_type2 = r->howto->type;
4192 	  else
4193 	    int_rela.r_type3 = r->howto->type;
4194 
4195 	  ++idx;
4196 	}
4197 
4198       mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
4199     }
4200 
4201   BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
4202 	      == *count);
4203 }
4204 
4205 /* Set the right machine number for a MIPS ELF file.  */
4206 
4207 static bfd_boolean
mips_elf64_object_p(bfd * abfd)4208 mips_elf64_object_p (bfd *abfd)
4209 {
4210   unsigned long mach;
4211 
4212   /* Irix 6 is broken.  Object file symbol tables are not always
4213      sorted correctly such that local symbols precede global symbols,
4214      and the sh_info field in the symbol table is not always right.  */
4215   if (elf64_mips_irix_compat (abfd) != ict_none)
4216     elf_bad_symtab (abfd) = TRUE;
4217 
4218   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
4219   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
4220   return TRUE;
4221 }
4222 
4223 /* Depending on the target vector we generate some version of Irix
4224    executables or "normal" MIPS ELF ABI executables.  */
4225 static irix_compat_t
elf64_mips_irix_compat(bfd * abfd)4226 elf64_mips_irix_compat (bfd *abfd)
4227 {
4228   if ((abfd->xvec == &mips_elf64_be_vec)
4229       || (abfd->xvec == &mips_elf64_le_vec))
4230     return ict_irix6;
4231   else
4232     return ict_none;
4233 }
4234 
4235 /* Support for core dump NOTE sections.  */
4236 static bfd_boolean
elf64_mips_grok_prstatus(bfd * abfd,Elf_Internal_Note * note)4237 elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
4238 {
4239   int offset;
4240   unsigned int size;
4241 
4242   switch (note->descsz)
4243     {
4244       default:
4245 	return FALSE;
4246 
4247       case 480:		/* Linux/MIPS - N64 kernel */
4248 	/* pr_cursig */
4249 	elf_tdata (abfd)->core->signal = bfd_get_16 (abfd, note->descdata + 12);
4250 
4251 	/* pr_pid */
4252 	elf_tdata (abfd)->core->lwpid = bfd_get_32 (abfd, note->descdata + 32);
4253 
4254 	/* pr_reg */
4255 	offset = 112;
4256 	size = 360;
4257 
4258 	break;
4259     }
4260 
4261   /* Make a ".reg/999" section.  */
4262   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
4263 					  size, note->descpos + offset);
4264 }
4265 
4266 static bfd_boolean
elf64_mips_grok_psinfo(bfd * abfd,Elf_Internal_Note * note)4267 elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
4268 {
4269   switch (note->descsz)
4270     {
4271       default:
4272 	return FALSE;
4273 
4274       case 136:		/* Linux/MIPS - N64 kernel elf_prpsinfo */
4275 	elf_tdata (abfd)->core->program
4276 	 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
4277 	elf_tdata (abfd)->core->command
4278 	 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
4279     }
4280 
4281   /* Note that for some reason, a spurious space is tacked
4282      onto the end of the args in some (at least one anyway)
4283      implementations, so strip it off if it exists.  */
4284 
4285   {
4286     char *command = elf_tdata (abfd)->core->command;
4287     int n = strlen (command);
4288 
4289     if (0 < n && command[n - 1] == ' ')
4290       command[n - 1] = '\0';
4291   }
4292 
4293   return TRUE;
4294 }
4295 
4296 /* ECOFF swapping routines.  These are used when dealing with the
4297    .mdebug section, which is in the ECOFF debugging format.  */
4298 static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
4299 {
4300   /* Symbol table magic number.  */
4301   magicSym2,
4302   /* Alignment of debugging information.  E.g., 4.  */
4303   8,
4304   /* Sizes of external symbolic information.  */
4305   sizeof (struct hdr_ext),
4306   sizeof (struct dnr_ext),
4307   sizeof (struct pdr_ext),
4308   sizeof (struct sym_ext),
4309   sizeof (struct opt_ext),
4310   sizeof (struct fdr_ext),
4311   sizeof (struct rfd_ext),
4312   sizeof (struct ext_ext),
4313   /* Functions to swap in external symbolic data.  */
4314   ecoff_swap_hdr_in,
4315   ecoff_swap_dnr_in,
4316   ecoff_swap_pdr_in,
4317   ecoff_swap_sym_in,
4318   ecoff_swap_opt_in,
4319   ecoff_swap_fdr_in,
4320   ecoff_swap_rfd_in,
4321   ecoff_swap_ext_in,
4322   _bfd_ecoff_swap_tir_in,
4323   _bfd_ecoff_swap_rndx_in,
4324   /* Functions to swap out external symbolic data.  */
4325   ecoff_swap_hdr_out,
4326   ecoff_swap_dnr_out,
4327   ecoff_swap_pdr_out,
4328   ecoff_swap_sym_out,
4329   ecoff_swap_opt_out,
4330   ecoff_swap_fdr_out,
4331   ecoff_swap_rfd_out,
4332   ecoff_swap_ext_out,
4333   _bfd_ecoff_swap_tir_out,
4334   _bfd_ecoff_swap_rndx_out,
4335   /* Function to read in symbolic data.  */
4336   _bfd_mips_elf_read_ecoff_info
4337 };
4338 
4339 /* Relocations in the 64 bit MIPS ELF ABI are more complex than in
4340    standard ELF.  This structure is used to redirect the relocation
4341    handling routines.  */
4342 
4343 const struct elf_size_info mips_elf64_size_info =
4344 {
4345   sizeof (Elf64_External_Ehdr),
4346   sizeof (Elf64_External_Phdr),
4347   sizeof (Elf64_External_Shdr),
4348   sizeof (Elf64_Mips_External_Rel),
4349   sizeof (Elf64_Mips_External_Rela),
4350   sizeof (Elf64_External_Sym),
4351   sizeof (Elf64_External_Dyn),
4352   sizeof (Elf_External_Note),
4353   4,		/* hash-table entry size */
4354   3,		/* internal relocations per external relocations */
4355   64,		/* arch_size */
4356   3,		/* log_file_align */
4357   ELFCLASS64,
4358   EV_CURRENT,
4359   bfd_elf64_write_out_phdrs,
4360   bfd_elf64_write_shdrs_and_ehdr,
4361   bfd_elf64_checksum_contents,
4362   mips_elf64_write_relocs,
4363   bfd_elf64_swap_symbol_in,
4364   bfd_elf64_swap_symbol_out,
4365   mips_elf64_slurp_reloc_table,
4366   bfd_elf64_slurp_symbol_table,
4367   bfd_elf64_swap_dyn_in,
4368   bfd_elf64_swap_dyn_out,
4369   mips_elf64_be_swap_reloc_in,
4370   mips_elf64_be_swap_reloc_out,
4371   mips_elf64_be_swap_reloca_in,
4372   mips_elf64_be_swap_reloca_out
4373 };
4374 
4375 #define ELF_ARCH			bfd_arch_mips
4376 #define ELF_TARGET_ID			MIPS_ELF_DATA
4377 #define ELF_MACHINE_CODE		EM_MIPS
4378 
4379 #define elf_backend_collect		TRUE
4380 #define elf_backend_type_change_ok	TRUE
4381 #define elf_backend_can_gc_sections	TRUE
4382 #define elf_backend_gc_mark_extra_sections \
4383 					_bfd_mips_elf_gc_mark_extra_sections
4384 #define elf_info_to_howto		mips_elf64_info_to_howto_rela
4385 #define elf_info_to_howto_rel		mips_elf64_info_to_howto_rel
4386 #define elf_backend_object_p		mips_elf64_object_p
4387 #define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
4388 #define elf_backend_section_processing	_bfd_mips_elf_section_processing
4389 #define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
4390 #define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
4391 #define elf_backend_section_from_bfd_section \
4392 				_bfd_mips_elf_section_from_bfd_section
4393 #define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
4394 #define elf_backend_link_output_symbol_hook \
4395 				_bfd_mips_elf_link_output_symbol_hook
4396 #define elf_backend_create_dynamic_sections \
4397 				_bfd_mips_elf_create_dynamic_sections
4398 #define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
4399 #define elf_backend_merge_symbol_attribute \
4400 				_bfd_mips_elf_merge_symbol_attribute
4401 #define elf_backend_get_target_dtag	_bfd_mips_elf_get_target_dtag
4402 #define elf_backend_adjust_dynamic_symbol \
4403 				_bfd_mips_elf_adjust_dynamic_symbol
4404 #define elf_backend_always_size_sections \
4405 				_bfd_mips_elf_always_size_sections
4406 #define elf_backend_size_dynamic_sections \
4407 				_bfd_mips_elf_size_dynamic_sections
4408 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
4409 #define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
4410 #define elf_backend_finish_dynamic_symbol \
4411 				_bfd_mips_elf_finish_dynamic_symbol
4412 #define elf_backend_finish_dynamic_sections \
4413 				_bfd_mips_elf_finish_dynamic_sections
4414 #define elf_backend_final_write_processing \
4415 				_bfd_mips_elf_final_write_processing
4416 #define elf_backend_additional_program_headers \
4417 				_bfd_mips_elf_additional_program_headers
4418 #define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
4419 #define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
4420 #define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook
4421 #define elf_backend_copy_indirect_symbol \
4422 					_bfd_mips_elf_copy_indirect_symbol
4423 #define elf_backend_ignore_discarded_relocs \
4424 					_bfd_mips_elf_ignore_discarded_relocs
4425 #define elf_backend_mips_irix_compat	elf64_mips_irix_compat
4426 #define elf_backend_mips_rtype_to_howto	mips_elf64_rtype_to_howto
4427 #define elf_backend_ecoff_debug_swap	&mips_elf64_ecoff_debug_swap
4428 #define elf_backend_size_info		mips_elf64_size_info
4429 
4430 #define elf_backend_grok_prstatus	elf64_mips_grok_prstatus
4431 #define elf_backend_grok_psinfo		elf64_mips_grok_psinfo
4432 
4433 #define elf_backend_got_header_size	(8 * MIPS_RESERVED_GOTNO)
4434 
4435 /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
4436    work better/work only in RELA, so we default to this.  */
4437 #define elf_backend_may_use_rel_p	1
4438 #define elf_backend_may_use_rela_p	1
4439 #define elf_backend_default_use_rela_p	1
4440 #define elf_backend_rela_plts_and_copies_p 0
4441 #define elf_backend_plt_readonly	1
4442 #define elf_backend_plt_sym_val		_bfd_mips_elf_plt_sym_val
4443 
4444 #define elf_backend_sign_extend_vma	TRUE
4445 
4446 #define elf_backend_write_section	_bfd_mips_elf_write_section
4447 
4448 /* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit
4449    MIPS-specific function only applies to IRIX5, which had no 64-bit
4450    ABI.  */
4451 #define bfd_elf64_bfd_is_target_special_symbol \
4452 					_bfd_mips_elf_is_target_special_symbol
4453 #define bfd_elf64_find_nearest_line	_bfd_mips_elf_find_nearest_line
4454 #define bfd_elf64_find_inliner_info	_bfd_mips_elf_find_inliner_info
4455 #define bfd_elf64_new_section_hook	_bfd_mips_elf_new_section_hook
4456 #define bfd_elf64_set_section_contents	_bfd_mips_elf_set_section_contents
4457 #define bfd_elf64_bfd_get_relocated_section_contents \
4458 				_bfd_elf_mips_get_relocated_section_contents
4459 #define bfd_elf64_bfd_link_hash_table_create \
4460 				_bfd_mips_elf_link_hash_table_create
4461 #define bfd_elf64_bfd_final_link	_bfd_mips_elf_final_link
4462 #define bfd_elf64_bfd_merge_private_bfd_data \
4463 				_bfd_mips_elf_merge_private_bfd_data
4464 #define bfd_elf64_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
4465 #define bfd_elf64_bfd_print_private_bfd_data \
4466 				_bfd_mips_elf_print_private_bfd_data
4467 
4468 #define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound
4469 #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc
4470 #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
4471 #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc
4472 #define bfd_elf64_bfd_relax_section     _bfd_mips_relax_section
4473 #define bfd_elf64_mkobject		_bfd_mips_elf_mkobject
4474 
4475 /* MIPS ELF64 archive functions.  */
4476 #define bfd_elf64_archive_functions
4477 extern bfd_boolean bfd_elf64_archive_slurp_armap
4478   (bfd *);
4479 extern bfd_boolean bfd_elf64_archive_write_armap
4480   (bfd *, unsigned int, struct orl *, unsigned int, int);
4481 #define bfd_elf64_archive_slurp_extended_name_table \
4482 			_bfd_archive_coff_slurp_extended_name_table
4483 #define bfd_elf64_archive_construct_extended_name_table \
4484 			_bfd_archive_coff_construct_extended_name_table
4485 #define bfd_elf64_archive_truncate_arname \
4486 			_bfd_archive_coff_truncate_arname
4487 #define bfd_elf64_archive_read_ar_hdr	_bfd_archive_coff_read_ar_hdr
4488 #define bfd_elf64_archive_write_ar_hdr	_bfd_archive_coff_write_ar_hdr
4489 #define bfd_elf64_archive_openr_next_archived_file \
4490 			_bfd_archive_coff_openr_next_archived_file
4491 #define bfd_elf64_archive_get_elt_at_index \
4492 			_bfd_archive_coff_get_elt_at_index
4493 #define bfd_elf64_archive_generic_stat_arch_elt \
4494 			_bfd_archive_coff_generic_stat_arch_elt
4495 #define bfd_elf64_archive_update_armap_timestamp \
4496 			_bfd_archive_coff_update_armap_timestamp
4497 
4498 /* The SGI style (n)64 NewABI.  */
4499 #define TARGET_LITTLE_SYM		mips_elf64_le_vec
4500 #define TARGET_LITTLE_NAME		"elf64-littlemips"
4501 #define TARGET_BIG_SYM			mips_elf64_be_vec
4502 #define TARGET_BIG_NAME			"elf64-bigmips"
4503 
4504 #define ELF_MAXPAGESIZE			0x10000
4505 #define ELF_COMMONPAGESIZE		0x1000
4506 
4507 #include "elf64-target.h"
4508 
4509 /* The SYSV-style 'traditional' (n)64 NewABI.  */
4510 #undef TARGET_LITTLE_SYM
4511 #undef TARGET_LITTLE_NAME
4512 #undef TARGET_BIG_SYM
4513 #undef TARGET_BIG_NAME
4514 
4515 #undef ELF_MAXPAGESIZE
4516 #undef ELF_COMMONPAGESIZE
4517 
4518 #define TARGET_LITTLE_SYM		mips_elf64_trad_le_vec
4519 #define TARGET_LITTLE_NAME		"elf64-tradlittlemips"
4520 #define TARGET_BIG_SYM			mips_elf64_trad_be_vec
4521 #define TARGET_BIG_NAME			"elf64-tradbigmips"
4522 
4523 #define ELF_MAXPAGESIZE			0x10000
4524 #define ELF_COMMONPAGESIZE		0x1000
4525 #define elf64_bed			elf64_tradbed
4526 
4527 /* Include the target file again for this target.  */
4528 #include "elf64-target.h"
4529 
4530 
4531 /* FreeBSD support.  */
4532 
4533 #undef TARGET_LITTLE_SYM
4534 #undef TARGET_LITTLE_NAME
4535 #undef TARGET_BIG_SYM
4536 #undef TARGET_BIG_NAME
4537 
4538 #define	TARGET_LITTLE_SYM		mips_elf64_tradfbsd_le_vec
4539 #define	TARGET_LITTLE_NAME		"elf64-tradlittlemips-freebsd"
4540 #define	TARGET_BIG_SYM			mips_elf64_tradfbsd_be_vec
4541 #define	TARGET_BIG_NAME			"elf64-tradbigmips-freebsd"
4542 
4543 #undef	ELF_OSABI
4544 #define	ELF_OSABI			ELFOSABI_FREEBSD
4545 
4546 #undef	elf64_bed
4547 #define elf64_bed				elf64_fbsd_tradbed
4548 
4549 #include "elf64-target.h"
4550