1 /* MIPS-specific support for 64-bit ELF
2    Copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
3    2007 Free Software Foundation, Inc.
4    Ian Lance Taylor, Cygnus Support
5    Linker support added by Mark Mitchell, CodeSourcery, LLC.
6    <mark@codesourcery.com>
7 
8 This file is part of BFD, the Binary File Descriptor library.
9 
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
14 
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 GNU General Public License for more details.
19 
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.  */
23 
24 /* This file supports the 64-bit MIPS ELF ABI.
25 
26    The MIPS 64-bit ELF ABI uses an unusual reloc format.  This file
27    overrides the usual ELF reloc handling, and handles reading and
28    writing the relocations here.  */
29 
30 /* TODO: Many things are unsupported, even if there is some code for it
31  .       (which was mostly stolen from elf32-mips.c and slightly adapted).
32  .
33  .   - Relocation handling for REL relocs is wrong in many cases and
34  .     generally untested.
35  .   - Relocation handling for RELA relocs related to GOT support are
36  .     also likely to be wrong.
37  .   - Support for MIPS16 is untested.
38  .   - Combined relocs with RSS_* entries are unsupported.
39  .   - The whole GOT handling for NewABI is missing, some parts of
40  .     the OldABI version is still lying around and should be removed.
41  */
42 
43 #include "sysdep.h"
44 #include "bfd.h"
45 #include "libbfd.h"
46 #include "aout/ar.h"
47 #include "bfdlink.h"
48 #include "genlink.h"
49 #include "elf-bfd.h"
50 #include "elfxx-mips.h"
51 #include "elf/mips.h"
52 
53 /* Get the ECOFF swapping routines.  The 64-bit ABI is not supposed to
54    use ECOFF.  However, we support it anyhow for an easier changeover.  */
55 #include "coff/sym.h"
56 #include "coff/symconst.h"
57 #include "coff/internal.h"
58 #include "coff/ecoff.h"
59 /* The 64 bit versions of the mdebug data structures are in alpha.h.  */
60 #include "coff/alpha.h"
61 #define ECOFF_SIGNED_64
62 #include "ecoffswap.h"
63 
64 static void mips_elf64_swap_reloc_in
65   (bfd *, const Elf64_Mips_External_Rel *, Elf64_Mips_Internal_Rela *);
66 static void mips_elf64_swap_reloca_in
67   (bfd *, const Elf64_Mips_External_Rela *, Elf64_Mips_Internal_Rela *);
68 static void mips_elf64_swap_reloc_out
69   (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rel *);
70 static void mips_elf64_swap_reloca_out
71   (bfd *, const Elf64_Mips_Internal_Rela *, Elf64_Mips_External_Rela *);
72 static void mips_elf64_be_swap_reloc_in
73   (bfd *, const bfd_byte *, Elf_Internal_Rela *);
74 static void mips_elf64_be_swap_reloc_out
75   (bfd *, const Elf_Internal_Rela *, bfd_byte *);
76 static void mips_elf64_be_swap_reloca_in
77   (bfd *, const bfd_byte *, Elf_Internal_Rela *);
78 static void mips_elf64_be_swap_reloca_out
79   (bfd *, const Elf_Internal_Rela *, bfd_byte *);
80 static reloc_howto_type *bfd_elf64_bfd_reloc_type_lookup
81   (bfd *, bfd_reloc_code_real_type);
82 static reloc_howto_type *mips_elf64_rtype_to_howto
83   (unsigned int, bfd_boolean);
84 static void mips_elf64_info_to_howto_rel
85   (bfd *, arelent *, Elf_Internal_Rela *);
86 static void mips_elf64_info_to_howto_rela
87   (bfd *, arelent *, Elf_Internal_Rela *);
88 static long mips_elf64_get_reloc_upper_bound
89   (bfd *, asection *);
90 static long mips_elf64_canonicalize_reloc
91   (bfd *, asection *, arelent **, asymbol **);
92 static long mips_elf64_get_dynamic_reloc_upper_bound
93   (bfd *);
94 static long mips_elf64_canonicalize_dynamic_reloc
95   (bfd *, arelent **, asymbol **);
96 static bfd_boolean mips_elf64_slurp_one_reloc_table
97   (bfd *, asection *, Elf_Internal_Shdr *, bfd_size_type, arelent *,
98    asymbol **, bfd_boolean);
99 static bfd_boolean mips_elf64_slurp_reloc_table
100   (bfd *, asection *, asymbol **, bfd_boolean);
101 static void mips_elf64_write_relocs
102   (bfd *, asection *, void *);
103 static void mips_elf64_write_rel
104   (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
105 static void mips_elf64_write_rela
106   (bfd *, asection *, Elf_Internal_Shdr *, int *, void *);
107 static bfd_reloc_status_type mips_elf64_gprel16_reloc
108   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
109 static bfd_reloc_status_type mips_elf64_literal_reloc
110   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
111 static bfd_reloc_status_type mips_elf64_gprel32_reloc
112   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
113 static bfd_reloc_status_type mips_elf64_shift6_reloc
114   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
115 static bfd_reloc_status_type mips16_gprel_reloc
116   (bfd *, arelent *, asymbol *, void *, asection *, bfd *, char **);
117 static bfd_boolean mips_elf64_assign_gp
118   (bfd *, bfd_vma *);
119 static bfd_reloc_status_type mips_elf64_final_gp
120   (bfd *, asymbol *, bfd_boolean, char **, bfd_vma *);
121 static bfd_boolean mips_elf64_object_p
122   (bfd *);
123 static irix_compat_t elf64_mips_irix_compat
124   (bfd *);
125 static bfd_boolean elf64_mips_grok_prstatus
126   (bfd *, Elf_Internal_Note *);
127 static bfd_boolean elf64_mips_grok_psinfo
128   (bfd *, Elf_Internal_Note *);
129 
130 extern const bfd_target bfd_elf64_bigmips_vec;
131 extern const bfd_target bfd_elf64_littlemips_vec;
132 
133 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
134    from smaller values.  Start with zero, widen, *then* decrement.  */
135 #define MINUS_ONE	(((bfd_vma)0) - 1)
136 
137 /* The number of local .got entries we reserve.  */
138 #define MIPS_RESERVED_GOTNO (2)
139 
140 /* The relocation table used for SHT_REL sections.  */
141 
142 static reloc_howto_type mips_elf64_howto_table_rel[] =
143 {
144   /* No relocation.  */
145   HOWTO (R_MIPS_NONE,		/* type */
146 	 0,			/* rightshift */
147 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
148 	 0,			/* bitsize */
149 	 FALSE,			/* pc_relative */
150 	 0,			/* bitpos */
151 	 complain_overflow_dont, /* complain_on_overflow */
152 	 _bfd_mips_elf_generic_reloc,	/* special_function */
153 	 "R_MIPS_NONE",		/* name */
154 	 FALSE,			/* partial_inplace */
155 	 0,			/* src_mask */
156 	 0,			/* dst_mask */
157 	 FALSE),		/* pcrel_offset */
158 
159   /* 16 bit relocation.  */
160   HOWTO (R_MIPS_16,		/* type */
161 	 0,			/* rightshift */
162 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
163 	 16,			/* bitsize */
164 	 FALSE,			/* pc_relative */
165 	 0,			/* bitpos */
166 	 complain_overflow_signed, /* complain_on_overflow */
167 	 _bfd_mips_elf_generic_reloc,	/* special_function */
168 	 "R_MIPS_16",		/* name */
169 	 TRUE,			/* partial_inplace */
170 	 0x0000ffff,		/* src_mask */
171 	 0x0000ffff,		/* dst_mask */
172 	 FALSE),		/* pcrel_offset */
173 
174   /* 32 bit relocation.  */
175   HOWTO (R_MIPS_32,		/* type */
176 	 0,			/* rightshift */
177 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
178 	 32,			/* bitsize */
179 	 FALSE,			/* pc_relative */
180 	 0,			/* bitpos */
181 	 complain_overflow_dont, /* complain_on_overflow */
182 	 _bfd_mips_elf_generic_reloc,	/* special_function */
183 	 "R_MIPS_32",		/* name */
184 	 TRUE,			/* partial_inplace */
185 	 0xffffffff,		/* src_mask */
186 	 0xffffffff,		/* dst_mask */
187 	 FALSE),		/* pcrel_offset */
188 
189   /* 32 bit symbol relative relocation.  */
190   HOWTO (R_MIPS_REL32,		/* type */
191 	 0,			/* rightshift */
192 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
193 	 32,			/* bitsize */
194 	 FALSE,			/* pc_relative */
195 	 0,			/* bitpos */
196 	 complain_overflow_dont, /* complain_on_overflow */
197 	 _bfd_mips_elf_generic_reloc,	/* special_function */
198 	 "R_MIPS_REL32",	/* name */
199 	 TRUE,			/* partial_inplace */
200 	 0xffffffff,		/* src_mask */
201 	 0xffffffff,		/* dst_mask */
202 	 FALSE),		/* pcrel_offset */
203 
204   /* 26 bit jump address.  */
205   HOWTO (R_MIPS_26,		/* type */
206 	 2,			/* rightshift */
207 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
208 	 26,			/* bitsize */
209 	 FALSE,			/* pc_relative */
210 	 0,			/* bitpos */
211 	 complain_overflow_dont, /* complain_on_overflow */
212 				/* This needs complex overflow
213 				   detection, because the upper 36
214 				   bits must match the PC + 4.  */
215 	 _bfd_mips_elf_generic_reloc,	/* special_function */
216 	 "R_MIPS_26",		/* name */
217 	 TRUE,			/* partial_inplace */
218 	 0x03ffffff,		/* src_mask */
219 	 0x03ffffff,		/* dst_mask */
220 	 FALSE),		/* pcrel_offset */
221 
222   /* R_MIPS_HI16 and R_MIPS_LO16 are unsupported for NewABI REL.
223      However, the native IRIX6 tools use them, so we try our best. */
224 
225   /* High 16 bits of symbol value.  */
226   HOWTO (R_MIPS_HI16,		/* type */
227 	 16,			/* rightshift */
228 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
229 	 16,			/* bitsize */
230 	 FALSE,			/* pc_relative */
231 	 0,			/* bitpos */
232 	 complain_overflow_dont, /* complain_on_overflow */
233 	 _bfd_mips_elf_hi16_reloc, /* special_function */
234 	 "R_MIPS_HI16",		/* name */
235 	 TRUE,			/* partial_inplace */
236 	 0x0000ffff,		/* src_mask */
237 	 0x0000ffff,		/* dst_mask */
238 	 FALSE),		/* pcrel_offset */
239 
240   /* Low 16 bits of symbol value.  */
241   HOWTO (R_MIPS_LO16,		/* type */
242 	 0,			/* rightshift */
243 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
244 	 16,			/* bitsize */
245 	 FALSE,			/* pc_relative */
246 	 0,			/* bitpos */
247 	 complain_overflow_dont, /* complain_on_overflow */
248 	 _bfd_mips_elf_lo16_reloc, /* special_function */
249 	 "R_MIPS_LO16",		/* name */
250 	 TRUE,			/* partial_inplace */
251 	 0x0000ffff,		/* src_mask */
252 	 0x0000ffff,		/* dst_mask */
253 	 FALSE),		/* pcrel_offset */
254 
255   /* GP relative reference.  */
256   HOWTO (R_MIPS_GPREL16,	/* type */
257 	 0,			/* rightshift */
258 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
259 	 16,			/* bitsize */
260 	 FALSE,			/* pc_relative */
261 	 0,			/* bitpos */
262 	 complain_overflow_signed, /* complain_on_overflow */
263 	 mips_elf64_gprel16_reloc, /* special_function */
264 	 "R_MIPS_GPREL16",	/* name */
265 	 TRUE,			/* partial_inplace */
266 	 0x0000ffff,		/* src_mask */
267 	 0x0000ffff,		/* dst_mask */
268 	 FALSE),		/* pcrel_offset */
269 
270   /* Reference to literal section.  */
271   HOWTO (R_MIPS_LITERAL,	/* type */
272 	 0,			/* rightshift */
273 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
274 	 16,			/* bitsize */
275 	 FALSE,			/* pc_relative */
276 	 0,			/* bitpos */
277 	 complain_overflow_signed, /* complain_on_overflow */
278 	 mips_elf64_literal_reloc, /* special_function */
279 	 "R_MIPS_LITERAL",	/* name */
280 	 TRUE,			/* partial_inplace */
281 	 0x0000ffff,		/* src_mask */
282 	 0x0000ffff,		/* dst_mask */
283 	 FALSE),		/* pcrel_offset */
284 
285   /* Reference to global offset table.  */
286   HOWTO (R_MIPS_GOT16,		/* type */
287 	 0,			/* rightshift */
288 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
289 	 16,			/* bitsize */
290 	 FALSE,			/* pc_relative */
291 	 0,			/* bitpos */
292 	 complain_overflow_signed, /* complain_on_overflow */
293 	 _bfd_mips_elf_got16_reloc, /* special_function */
294 	 "R_MIPS_GOT16",	/* name */
295 	 TRUE,			/* partial_inplace */
296 	 0x0000ffff,		/* src_mask */
297 	 0x0000ffff,		/* dst_mask */
298 	 FALSE),		/* pcrel_offset */
299 
300   /* 16 bit PC relative reference.  Note that the ABI document has a typo
301      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
302      We do the right thing here.  */
303   HOWTO (R_MIPS_PC16,		/* type */
304 	 2,			/* rightshift */
305 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
306 	 16,			/* bitsize */
307 	 TRUE,			/* pc_relative */
308 	 0,			/* bitpos */
309 	 complain_overflow_signed, /* complain_on_overflow */
310 	 _bfd_mips_elf_generic_reloc,	/* special_function */
311 	 "R_MIPS_PC16",		/* name */
312 	 TRUE,			/* partial_inplace */
313 	 0x0000ffff,		/* src_mask */
314 	 0x0000ffff,		/* dst_mask */
315 	 TRUE),			/* pcrel_offset */
316 
317   /* 16 bit call through global offset table.  */
318   HOWTO (R_MIPS_CALL16,		/* type */
319 	 0,			/* rightshift */
320 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
321 	 16,			/* bitsize */
322 	 FALSE,			/* pc_relative */
323 	 0,			/* bitpos */
324 	 complain_overflow_signed, /* complain_on_overflow */
325 	 _bfd_mips_elf_generic_reloc,	/* special_function */
326 	 "R_MIPS_CALL16",	/* name */
327 	 TRUE,			/* partial_inplace */
328 	 0x0000ffff,		/* src_mask */
329 	 0x0000ffff,		/* dst_mask */
330 	 FALSE),		/* pcrel_offset */
331 
332   /* 32 bit GP relative reference.  */
333   HOWTO (R_MIPS_GPREL32,	/* type */
334 	 0,			/* rightshift */
335 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
336 	 32,			/* bitsize */
337 	 FALSE,			/* pc_relative */
338 	 0,			/* bitpos */
339 	 complain_overflow_dont, /* complain_on_overflow */
340 	 mips_elf64_gprel32_reloc, /* special_function */
341 	 "R_MIPS_GPREL32",	/* name */
342 	 TRUE,			/* partial_inplace */
343 	 0xffffffff,		/* src_mask */
344 	 0xffffffff,		/* dst_mask */
345 	 FALSE),		/* pcrel_offset */
346 
347   EMPTY_HOWTO (13),
348   EMPTY_HOWTO (14),
349   EMPTY_HOWTO (15),
350 
351   /* A 5 bit shift field.  */
352   HOWTO (R_MIPS_SHIFT5,		/* type */
353 	 0,			/* rightshift */
354 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
355 	 5,			/* bitsize */
356 	 FALSE,			/* pc_relative */
357 	 6,			/* bitpos */
358 	 complain_overflow_bitfield, /* complain_on_overflow */
359 	 _bfd_mips_elf_generic_reloc,	/* special_function */
360 	 "R_MIPS_SHIFT5",	/* name */
361 	 TRUE,			/* partial_inplace */
362 	 0x000007c0,		/* src_mask */
363 	 0x000007c0,		/* dst_mask */
364 	 FALSE),		/* pcrel_offset */
365 
366   /* A 6 bit shift field.  */
367   HOWTO (R_MIPS_SHIFT6,		/* type */
368 	 0,			/* rightshift */
369 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
370 	 6,			/* bitsize */
371 	 FALSE,			/* pc_relative */
372 	 6,			/* bitpos */
373 	 complain_overflow_bitfield, /* complain_on_overflow */
374 	 mips_elf64_shift6_reloc, /* special_function */
375 	 "R_MIPS_SHIFT6",	/* name */
376 	 TRUE,			/* partial_inplace */
377 	 0x000007c4,		/* src_mask */
378 	 0x000007c4,		/* dst_mask */
379 	 FALSE),		/* pcrel_offset */
380 
381   /* 64 bit relocation.  */
382   HOWTO (R_MIPS_64,		/* type */
383 	 0,			/* rightshift */
384 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
385 	 64,			/* bitsize */
386 	 FALSE,			/* pc_relative */
387 	 0,			/* bitpos */
388 	 complain_overflow_dont, /* complain_on_overflow */
389 	 _bfd_mips_elf_generic_reloc,	/* special_function */
390 	 "R_MIPS_64",		/* name */
391 	 TRUE,			/* partial_inplace */
392 	 MINUS_ONE,		/* src_mask */
393 	 MINUS_ONE,		/* dst_mask */
394 	 FALSE),		/* pcrel_offset */
395 
396   /* Displacement in the global offset table.  */
397   HOWTO (R_MIPS_GOT_DISP,	/* type */
398 	 0,			/* rightshift */
399 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
400 	 16,			/* bitsize */
401 	 FALSE,			/* pc_relative */
402 	 0,			/* bitpos */
403 	 complain_overflow_signed, /* complain_on_overflow */
404 	 _bfd_mips_elf_generic_reloc,	/* special_function */
405 	 "R_MIPS_GOT_DISP",	/* name */
406 	 TRUE,			/* partial_inplace */
407 	 0x0000ffff,		/* src_mask */
408 	 0x0000ffff,		/* dst_mask */
409 	 FALSE),		/* pcrel_offset */
410 
411   /* Displacement to page pointer in the global offset table.  */
412   HOWTO (R_MIPS_GOT_PAGE,	/* type */
413 	 0,			/* rightshift */
414 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
415 	 16,			/* bitsize */
416 	 FALSE,			/* pc_relative */
417 	 0,			/* bitpos */
418 	 complain_overflow_signed, /* complain_on_overflow */
419 	 _bfd_mips_elf_generic_reloc,	/* special_function */
420 	 "R_MIPS_GOT_PAGE",	/* name */
421 	 TRUE,			/* partial_inplace */
422 	 0x0000ffff,		/* src_mask */
423 	 0x0000ffff,		/* dst_mask */
424 	 FALSE),		/* pcrel_offset */
425 
426   /* Offset from page pointer in the global offset table.  */
427   HOWTO (R_MIPS_GOT_OFST,	/* type */
428 	 0,			/* rightshift */
429 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
430 	 16,			/* bitsize */
431 	 FALSE,			/* pc_relative */
432 	 0,			/* bitpos */
433 	 complain_overflow_signed, /* complain_on_overflow */
434 	 _bfd_mips_elf_generic_reloc,	/* special_function */
435 	 "R_MIPS_GOT_OFST",	/* name */
436 	 TRUE,			/* partial_inplace */
437 	 0x0000ffff,		/* src_mask */
438 	 0x0000ffff,		/* dst_mask */
439 	 FALSE),		/* pcrel_offset */
440 
441   /* High 16 bits of displacement in global offset table.  */
442   HOWTO (R_MIPS_GOT_HI16,	/* type */
443 	 0,			/* rightshift */
444 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
445 	 16,			/* bitsize */
446 	 FALSE,			/* pc_relative */
447 	 0,			/* bitpos */
448 	 complain_overflow_dont, /* complain_on_overflow */
449 	 _bfd_mips_elf_generic_reloc,	/* special_function */
450 	 "R_MIPS_GOT_HI16",	/* name */
451 	 TRUE,			/* partial_inplace */
452 	 0x0000ffff,		/* src_mask */
453 	 0x0000ffff,		/* dst_mask */
454 	 FALSE),		/* pcrel_offset */
455 
456   /* Low 16 bits of displacement in global offset table.  */
457   HOWTO (R_MIPS_GOT_LO16,	/* type */
458 	 0,			/* rightshift */
459 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
460 	 16,			/* bitsize */
461 	 FALSE,			/* pc_relative */
462 	 0,			/* bitpos */
463 	 complain_overflow_dont, /* complain_on_overflow */
464 	 _bfd_mips_elf_generic_reloc,	/* special_function */
465 	 "R_MIPS_GOT_LO16",	/* name */
466 	 TRUE,			/* partial_inplace */
467 	 0x0000ffff,		/* src_mask */
468 	 0x0000ffff,		/* dst_mask */
469 	 FALSE),		/* pcrel_offset */
470 
471   /* 64 bit subtraction.  */
472   HOWTO (R_MIPS_SUB,		/* type */
473 	 0,			/* rightshift */
474 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
475 	 64,			/* bitsize */
476 	 FALSE,			/* pc_relative */
477 	 0,			/* bitpos */
478 	 complain_overflow_dont, /* complain_on_overflow */
479 	 _bfd_mips_elf_generic_reloc,	/* special_function */
480 	 "R_MIPS_SUB",		/* name */
481 	 TRUE,			/* partial_inplace */
482 	 MINUS_ONE,		/* src_mask */
483 	 MINUS_ONE,		/* dst_mask */
484 	 FALSE),		/* pcrel_offset */
485 
486   /* Insert the addend as an instruction.  */
487   /* FIXME: Not handled correctly.  */
488   HOWTO (R_MIPS_INSERT_A,	/* type */
489 	 0,			/* rightshift */
490 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
491 	 32,			/* bitsize */
492 	 FALSE,			/* pc_relative */
493 	 0,			/* bitpos */
494 	 complain_overflow_dont, /* complain_on_overflow */
495 	 _bfd_mips_elf_generic_reloc,	/* special_function */
496 	 "R_MIPS_INSERT_A",	/* name */
497 	 TRUE,			/* partial_inplace */
498 	 0xffffffff,		/* src_mask */
499 	 0xffffffff,		/* dst_mask */
500 	 FALSE),		/* pcrel_offset */
501 
502   /* Insert the addend as an instruction, and change all relocations
503      to refer to the old instruction at the address.  */
504   /* FIXME: Not handled correctly.  */
505   HOWTO (R_MIPS_INSERT_B,	/* type */
506 	 0,			/* rightshift */
507 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
508 	 32,			/* bitsize */
509 	 FALSE,			/* pc_relative */
510 	 0,			/* bitpos */
511 	 complain_overflow_dont, /* complain_on_overflow */
512 	 _bfd_mips_elf_generic_reloc,	/* special_function */
513 	 "R_MIPS_INSERT_B",	/* name */
514 	 TRUE,			/* partial_inplace */
515 	 0xffffffff,		/* src_mask */
516 	 0xffffffff,		/* dst_mask */
517 	 FALSE),		/* pcrel_offset */
518 
519   /* Delete a 32 bit instruction.  */
520   /* FIXME: Not handled correctly.  */
521   HOWTO (R_MIPS_DELETE,		/* type */
522 	 0,			/* rightshift */
523 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
524 	 32,			/* bitsize */
525 	 FALSE,			/* pc_relative */
526 	 0,			/* bitpos */
527 	 complain_overflow_dont, /* complain_on_overflow */
528 	 _bfd_mips_elf_generic_reloc,	/* special_function */
529 	 "R_MIPS_DELETE",	/* name */
530 	 TRUE,			/* partial_inplace */
531 	 0xffffffff,		/* src_mask */
532 	 0xffffffff,		/* dst_mask */
533 	 FALSE),		/* pcrel_offset */
534 
535   /* The MIPS ELF64 ABI Draft wants us to support these for REL relocations.
536      We don't, because
537        a) It means building the addend from a R_MIPS_HIGHEST/R_MIPS_HIGHER/
538 	  R_MIPS_HI16/R_MIPS_LO16 sequence with varying ordering, using
539 	  fallable heuristics.
540        b) No other NewABI toolchain actually emits such relocations.  */
541   EMPTY_HOWTO (R_MIPS_HIGHER),
542   EMPTY_HOWTO (R_MIPS_HIGHEST),
543 
544   /* High 16 bits of displacement in global offset table.  */
545   HOWTO (R_MIPS_CALL_HI16,	/* type */
546 	 0,			/* rightshift */
547 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
548 	 16,			/* bitsize */
549 	 FALSE,			/* pc_relative */
550 	 0,			/* bitpos */
551 	 complain_overflow_dont, /* complain_on_overflow */
552 	 _bfd_mips_elf_generic_reloc,	/* special_function */
553 	 "R_MIPS_CALL_HI16",	/* name */
554 	 TRUE,			/* partial_inplace */
555 	 0x0000ffff,		/* src_mask */
556 	 0x0000ffff,		/* dst_mask */
557 	 FALSE),		/* pcrel_offset */
558 
559   /* Low 16 bits of displacement in global offset table.  */
560   HOWTO (R_MIPS_CALL_LO16,	/* type */
561 	 0,			/* rightshift */
562 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
563 	 16,			/* bitsize */
564 	 FALSE,			/* pc_relative */
565 	 0,			/* bitpos */
566 	 complain_overflow_dont, /* complain_on_overflow */
567 	 _bfd_mips_elf_generic_reloc,	/* special_function */
568 	 "R_MIPS_CALL_LO16",	/* name */
569 	 TRUE,			/* partial_inplace */
570 	 0x0000ffff,		/* src_mask */
571 	 0x0000ffff,		/* dst_mask */
572 	 FALSE),		/* pcrel_offset */
573 
574   /* Section displacement, used by an associated event location section.  */
575   HOWTO (R_MIPS_SCN_DISP,	/* type */
576 	 0,			/* rightshift */
577 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
578 	 32,			/* bitsize */
579 	 FALSE,			/* pc_relative */
580 	 0,			/* bitpos */
581 	 complain_overflow_dont, /* complain_on_overflow */
582 	 _bfd_mips_elf_generic_reloc,	/* special_function */
583 	 "R_MIPS_SCN_DISP",	/* name */
584 	 TRUE,			/* partial_inplace */
585 	 0xffffffff,		/* src_mask */
586 	 0xffffffff,		/* dst_mask */
587 	 FALSE),		/* pcrel_offset */
588 
589   HOWTO (R_MIPS_REL16,		/* type */
590 	 0,			/* rightshift */
591 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
592 	 16,			/* bitsize */
593 	 FALSE,			/* pc_relative */
594 	 0,			/* bitpos */
595 	 complain_overflow_signed, /* complain_on_overflow */
596 	 _bfd_mips_elf_generic_reloc,	/* special_function */
597 	 "R_MIPS_REL16",	/* name */
598 	 TRUE,			/* partial_inplace */
599 	 0xffff,		/* src_mask */
600 	 0xffff,		/* dst_mask */
601 	 FALSE),		/* pcrel_offset */
602 
603   /* These two are obsolete.  */
604   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
605   EMPTY_HOWTO (R_MIPS_PJUMP),
606 
607   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
608      It must be used for multigot GOT's (and only there).  */
609   HOWTO (R_MIPS_RELGOT,		/* type */
610 	 0,			/* rightshift */
611 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
612 	 32,			/* bitsize */
613 	 FALSE,			/* pc_relative */
614 	 0,			/* bitpos */
615 	 complain_overflow_dont, /* complain_on_overflow */
616 	 _bfd_mips_elf_generic_reloc,	/* special_function */
617 	 "R_MIPS_RELGOT",	/* name */
618 	 TRUE,			/* partial_inplace */
619 	 0xffffffff,		/* src_mask */
620 	 0xffffffff,		/* dst_mask */
621 	 FALSE),		/* pcrel_offset */
622 
623   /* Protected jump conversion.  This is an optimization hint.  No
624      relocation is required for correctness.  */
625   HOWTO (R_MIPS_JALR,		/* type */
626 	 0,			/* rightshift */
627 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
628 	 32,			/* bitsize */
629 	 FALSE,			/* pc_relative */
630 	 0,			/* bitpos */
631 	 complain_overflow_dont, /* complain_on_overflow */
632 	 _bfd_mips_elf_generic_reloc,	/* special_function */
633 	 "R_MIPS_JALR",		/* name */
634 	 FALSE,			/* partial_inplace */
635 	 0,			/* src_mask */
636 	 0x00000000,		/* dst_mask */
637 	 FALSE),		/* pcrel_offset */
638 
639   /* TLS relocations.  */
640   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
641   EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
642 
643   HOWTO (R_MIPS_TLS_DTPMOD64,	/* type */
644 	 0,			/* rightshift */
645 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
646 	 64,			/* bitsize */
647 	 FALSE,			/* pc_relative */
648 	 0,			/* bitpos */
649 	 complain_overflow_dont, /* complain_on_overflow */
650 	 _bfd_mips_elf_generic_reloc, /* special_function */
651 	 "R_MIPS_TLS_DTPMOD64",	/* name */
652 	 TRUE,			/* partial_inplace */
653 	 MINUS_ONE,		/* src_mask */
654 	 MINUS_ONE,		/* dst_mask */
655 	 FALSE),		/* pcrel_offset */
656 
657   HOWTO (R_MIPS_TLS_DTPREL64,	/* type */
658 	 0,			/* rightshift */
659 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
660 	 64,			/* bitsize */
661 	 FALSE,			/* pc_relative */
662 	 0,			/* bitpos */
663 	 complain_overflow_dont, /* complain_on_overflow */
664 	 _bfd_mips_elf_generic_reloc, /* special_function */
665 	 "R_MIPS_TLS_DTPREL64",	/* name */
666 	 TRUE,			/* partial_inplace */
667 	 MINUS_ONE,		/* src_mask */
668 	 MINUS_ONE,		/* dst_mask */
669 	 FALSE),		/* pcrel_offset */
670 
671   /* TLS general dynamic variable reference.  */
672   HOWTO (R_MIPS_TLS_GD,		/* type */
673 	 0,			/* rightshift */
674 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
675 	 16,			/* bitsize */
676 	 FALSE,			/* pc_relative */
677 	 0,			/* bitpos */
678 	 complain_overflow_signed, /* complain_on_overflow */
679 	 _bfd_mips_elf_generic_reloc, /* special_function */
680 	 "R_MIPS_TLS_GD",	/* name */
681 	 TRUE,			/* partial_inplace */
682 	 0x0000ffff,		/* src_mask */
683 	 0x0000ffff,		/* dst_mask */
684 	 FALSE),		/* pcrel_offset */
685 
686   /* TLS local dynamic variable reference.  */
687   HOWTO (R_MIPS_TLS_LDM,	/* type */
688 	 0,			/* rightshift */
689 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
690 	 16,			/* bitsize */
691 	 FALSE,			/* pc_relative */
692 	 0,			/* bitpos */
693 	 complain_overflow_signed, /* complain_on_overflow */
694 	 _bfd_mips_elf_generic_reloc, /* special_function */
695 	 "R_MIPS_TLS_LDM",	/* name */
696 	 TRUE,			/* partial_inplace */
697 	 0x0000ffff,		/* src_mask */
698 	 0x0000ffff,		/* dst_mask */
699 	 FALSE),		/* pcrel_offset */
700 
701   /* TLS local dynamic offset.  */
702   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
703 	 0,			/* rightshift */
704 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
705 	 16,			/* bitsize */
706 	 FALSE,			/* pc_relative */
707 	 0,			/* bitpos */
708 	 complain_overflow_signed, /* complain_on_overflow */
709 	 _bfd_mips_elf_generic_reloc, /* special_function */
710 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
711 	 TRUE,			/* partial_inplace */
712 	 0x0000ffff,		/* src_mask */
713 	 0x0000ffff,		/* dst_mask */
714 	 FALSE),		/* pcrel_offset */
715 
716   /* TLS local dynamic offset.  */
717   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
718 	 0,			/* rightshift */
719 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
720 	 16,			/* bitsize */
721 	 FALSE,			/* pc_relative */
722 	 0,			/* bitpos */
723 	 complain_overflow_signed, /* complain_on_overflow */
724 	 _bfd_mips_elf_generic_reloc, /* special_function */
725 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
726 	 TRUE,			/* partial_inplace */
727 	 0x0000ffff,		/* src_mask */
728 	 0x0000ffff,		/* dst_mask */
729 	 FALSE),		/* pcrel_offset */
730 
731   /* TLS thread pointer offset.  */
732   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
733 	 0,			/* rightshift */
734 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
735 	 16,			/* bitsize */
736 	 FALSE,			/* pc_relative */
737 	 0,			/* bitpos */
738 	 complain_overflow_signed, /* complain_on_overflow */
739 	 _bfd_mips_elf_generic_reloc, /* special_function */
740 	 "R_MIPS_TLS_GOTTPREL",	/* name */
741 	 TRUE,			/* partial_inplace */
742 	 0x0000ffff,		/* src_mask */
743 	 0x0000ffff,		/* dst_mask */
744 	 FALSE),		/* pcrel_offset */
745 
746   /* TLS IE dynamic relocations.  */
747   EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
748 
749   HOWTO (R_MIPS_TLS_TPREL64,	/* type */
750 	 0,			/* rightshift */
751 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
752 	 64,			/* bitsize */
753 	 FALSE,			/* pc_relative */
754 	 0,			/* bitpos */
755 	 complain_overflow_dont, /* complain_on_overflow */
756 	 _bfd_mips_elf_generic_reloc, /* special_function */
757 	 "R_MIPS_TLS_TPREL64",	/* name */
758 	 TRUE,			/* partial_inplace */
759 	 MINUS_ONE,		/* src_mask */
760 	 MINUS_ONE,		/* dst_mask */
761 	 FALSE),		/* pcrel_offset */
762 
763   /* TLS thread pointer offset.  */
764   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
765 	 0,			/* rightshift */
766 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
767 	 16,			/* bitsize */
768 	 FALSE,			/* pc_relative */
769 	 0,			/* bitpos */
770 	 complain_overflow_signed, /* complain_on_overflow */
771 	 _bfd_mips_elf_generic_reloc, /* special_function */
772 	 "R_MIPS_TLS_TPREL_HI16", /* name */
773 	 TRUE,			/* partial_inplace */
774 	 0x0000ffff,		/* src_mask */
775 	 0x0000ffff,		/* dst_mask */
776 	 FALSE),		/* pcrel_offset */
777 
778   /* TLS thread pointer offset.  */
779   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
780 	 0,			/* rightshift */
781 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
782 	 16,			/* bitsize */
783 	 FALSE,			/* pc_relative */
784 	 0,			/* bitpos */
785 	 complain_overflow_signed, /* complain_on_overflow */
786 	 _bfd_mips_elf_generic_reloc, /* special_function */
787 	 "R_MIPS_TLS_TPREL_LO16", /* name */
788 	 TRUE,			/* partial_inplace */
789 	 0x0000ffff,		/* src_mask */
790 	 0x0000ffff,		/* dst_mask */
791 	 FALSE),		/* pcrel_offset */
792 
793   /* 32 bit relocation with no addend.  */
794   HOWTO (R_MIPS_GLOB_DAT,	/* type */
795 	 0,			/* rightshift */
796 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
797 	 32,			/* bitsize */
798 	 FALSE,			/* pc_relative */
799 	 0,			/* bitpos */
800 	 complain_overflow_dont, /* complain_on_overflow */
801 	 _bfd_mips_elf_generic_reloc, /* special_function */
802 	 "R_MIPS_GLOB_DAT",	/* name */
803 	 FALSE,			/* partial_inplace */
804 	 0x0,			/* src_mask */
805 	 0xffffffff,		/* dst_mask */
806 	 FALSE),		/* pcrel_offset */
807 };
808 
809 /* The relocation table used for SHT_RELA sections.  */
810 
811 static reloc_howto_type mips_elf64_howto_table_rela[] =
812 {
813   /* No relocation.  */
814   HOWTO (R_MIPS_NONE,		/* type */
815 	 0,			/* rightshift */
816 	 0,			/* size (0 = byte, 1 = short, 2 = long) */
817 	 0,			/* bitsize */
818 	 FALSE,			/* pc_relative */
819 	 0,			/* bitpos */
820 	 complain_overflow_dont, /* complain_on_overflow */
821 	 _bfd_mips_elf_generic_reloc,	/* special_function */
822 	 "R_MIPS_NONE",		/* name */
823 	 FALSE,			/* partial_inplace */
824 	 0,			/* src_mask */
825 	 0,			/* dst_mask */
826 	 FALSE),		/* pcrel_offset */
827 
828   /* 16 bit relocation.  */
829   HOWTO (R_MIPS_16,		/* type */
830 	 0,			/* rightshift */
831 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
832 	 16,			/* bitsize */
833 	 FALSE,			/* pc_relative */
834 	 0,			/* bitpos */
835 	 complain_overflow_signed, /* complain_on_overflow */
836 	 _bfd_mips_elf_generic_reloc,	/* special_function */
837 	 "R_MIPS_16",		/* name */
838 	 FALSE,			/* partial_inplace */
839 	 0,			/* src_mask */
840 	 0x0000ffff,		/* dst_mask */
841 	 FALSE),		/* pcrel_offset */
842 
843   /* 32 bit relocation.  */
844   HOWTO (R_MIPS_32,		/* type */
845 	 0,			/* rightshift */
846 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
847 	 32,			/* bitsize */
848 	 FALSE,			/* pc_relative */
849 	 0,			/* bitpos */
850 	 complain_overflow_dont, /* complain_on_overflow */
851 	 _bfd_mips_elf_generic_reloc,	/* special_function */
852 	 "R_MIPS_32",		/* name */
853 	 FALSE,			/* partial_inplace */
854 	 0,			/* src_mask */
855 	 0xffffffff,		/* dst_mask */
856 	 FALSE),		/* pcrel_offset */
857 
858   /* 32 bit symbol relative relocation.  */
859   HOWTO (R_MIPS_REL32,		/* type */
860 	 0,			/* rightshift */
861 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
862 	 32,			/* bitsize */
863 	 FALSE,			/* pc_relative */
864 	 0,			/* bitpos */
865 	 complain_overflow_dont, /* complain_on_overflow */
866 	 _bfd_mips_elf_generic_reloc,	/* special_function */
867 	 "R_MIPS_REL32",	/* name */
868 	 FALSE,			/* partial_inplace */
869 	 0,			/* src_mask */
870 	 0xffffffff,		/* dst_mask */
871 	 FALSE),		/* pcrel_offset */
872 
873   /* 26 bit jump address.  */
874   HOWTO (R_MIPS_26,		/* type */
875 	 2,			/* rightshift */
876 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
877 	 26,			/* bitsize */
878 	 FALSE,			/* pc_relative */
879 	 0,			/* bitpos */
880 	 complain_overflow_dont, /* complain_on_overflow */
881 				/* This needs complex overflow
882 				   detection, because the upper 36
883 				   bits must match the PC + 4.  */
884 	 _bfd_mips_elf_generic_reloc,	/* special_function */
885 	 "R_MIPS_26",		/* name */
886 	 FALSE,			/* partial_inplace */
887 	 0,			/* src_mask */
888 	 0x03ffffff,		/* dst_mask */
889 	 FALSE),		/* pcrel_offset */
890 
891   /* High 16 bits of symbol value.  */
892   HOWTO (R_MIPS_HI16,		/* type */
893 	 0,			/* rightshift */
894 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
895 	 16,			/* bitsize */
896 	 FALSE,			/* pc_relative */
897 	 0,			/* bitpos */
898 	 complain_overflow_dont, /* complain_on_overflow */
899 	 _bfd_mips_elf_generic_reloc,	/* special_function */
900 	 "R_MIPS_HI16",		/* name */
901 	 FALSE,			/* partial_inplace */
902 	 0,			/* src_mask */
903 	 0x0000ffff,		/* dst_mask */
904 	 FALSE),		/* pcrel_offset */
905 
906   /* Low 16 bits of symbol value.  */
907   HOWTO (R_MIPS_LO16,		/* type */
908 	 0,			/* rightshift */
909 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
910 	 16,			/* bitsize */
911 	 FALSE,			/* pc_relative */
912 	 0,			/* bitpos */
913 	 complain_overflow_dont, /* complain_on_overflow */
914 	 _bfd_mips_elf_generic_reloc,	/* special_function */
915 	 "R_MIPS_LO16",		/* name */
916 	 FALSE,			/* partial_inplace */
917 	 0,			/* src_mask */
918 	 0x0000ffff,		/* dst_mask */
919 	 FALSE),		/* pcrel_offset */
920 
921   /* GP relative reference.  */
922   HOWTO (R_MIPS_GPREL16,	/* type */
923 	 0,			/* rightshift */
924 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
925 	 16,			/* bitsize */
926 	 FALSE,			/* pc_relative */
927 	 0,			/* bitpos */
928 	 complain_overflow_signed, /* complain_on_overflow */
929 	 mips_elf64_gprel16_reloc, /* special_function */
930 	 "R_MIPS_GPREL16",	/* name */
931 	 FALSE,			/* partial_inplace */
932 	 0,			/* src_mask */
933 	 0x0000ffff,		/* dst_mask */
934 	 FALSE),		/* pcrel_offset */
935 
936   /* Reference to literal section.  */
937   HOWTO (R_MIPS_LITERAL,	/* type */
938 	 0,			/* rightshift */
939 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
940 	 16,			/* bitsize */
941 	 FALSE,			/* pc_relative */
942 	 0,			/* bitpos */
943 	 complain_overflow_signed, /* complain_on_overflow */
944 	 mips_elf64_literal_reloc, /* special_function */
945 	 "R_MIPS_LITERAL",	/* name */
946 	 FALSE,			/* partial_inplace */
947 	 0,			/* src_mask */
948 	 0x0000ffff,		/* dst_mask */
949 	 FALSE),		/* pcrel_offset */
950 
951   /* Reference to global offset table.  */
952   HOWTO (R_MIPS_GOT16,		/* type */
953 	 0,			/* rightshift */
954 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
955 	 16,			/* bitsize */
956 	 FALSE,			/* pc_relative */
957 	 0,			/* bitpos */
958 	 complain_overflow_signed, /* complain_on_overflow */
959 	 _bfd_mips_elf_generic_reloc, /* special_function */
960 	 "R_MIPS_GOT16",	/* name */
961 	 FALSE,			/* partial_inplace */
962 	 0,			/* src_mask */
963 	 0x0000ffff,		/* dst_mask */
964 	 FALSE),		/* pcrel_offset */
965 
966   /* 16 bit PC relative reference.  Note that the ABI document has a typo
967      and claims R_MIPS_PC16 to be not rightshifted, rendering it useless.
968      We do the right thing here.  */
969   HOWTO (R_MIPS_PC16,		/* type */
970 	 2,			/* rightshift */
971 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
972 	 16,			/* bitsize */
973 	 TRUE,			/* pc_relative */
974 	 0,			/* bitpos */
975 	 complain_overflow_signed, /* complain_on_overflow */
976 	 _bfd_mips_elf_generic_reloc,	/* special_function */
977 	 "R_MIPS_PC16",		/* name */
978 	 FALSE,			/* partial_inplace */
979 	 0,			/* src_mask */
980 	 0x0000ffff,		/* dst_mask */
981 	 TRUE),			/* pcrel_offset */
982 
983   /* 16 bit call through global offset table.  */
984   HOWTO (R_MIPS_CALL16,		/* type */
985 	 0,			/* rightshift */
986 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
987 	 16,			/* bitsize */
988 	 FALSE,			/* pc_relative */
989 	 0,			/* bitpos */
990 	 complain_overflow_signed, /* complain_on_overflow */
991 	 _bfd_mips_elf_generic_reloc,	/* special_function */
992 	 "R_MIPS_CALL16",	/* name */
993 	 FALSE,			/* partial_inplace */
994 	 0,			/* src_mask */
995 	 0x0000ffff,		/* dst_mask */
996 	 FALSE),		/* pcrel_offset */
997 
998   /* 32 bit GP relative reference.  */
999   HOWTO (R_MIPS_GPREL32,	/* type */
1000 	 0,			/* rightshift */
1001 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1002 	 32,			/* bitsize */
1003 	 FALSE,			/* pc_relative */
1004 	 0,			/* bitpos */
1005 	 complain_overflow_dont, /* complain_on_overflow */
1006 	 mips_elf64_gprel32_reloc, /* special_function */
1007 	 "R_MIPS_GPREL32",	/* name */
1008 	 FALSE,			/* partial_inplace */
1009 	 0,			/* src_mask */
1010 	 0xffffffff,		/* dst_mask */
1011 	 FALSE),		/* pcrel_offset */
1012 
1013   EMPTY_HOWTO (13),
1014   EMPTY_HOWTO (14),
1015   EMPTY_HOWTO (15),
1016 
1017   /* A 5 bit shift field.  */
1018   HOWTO (R_MIPS_SHIFT5,		/* type */
1019 	 0,			/* rightshift */
1020 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1021 	 5,			/* bitsize */
1022 	 FALSE,			/* pc_relative */
1023 	 6,			/* bitpos */
1024 	 complain_overflow_bitfield, /* complain_on_overflow */
1025 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1026 	 "R_MIPS_SHIFT5",	/* name */
1027 	 FALSE,			/* partial_inplace */
1028 	 0,			/* src_mask */
1029 	 0x000007c0,		/* dst_mask */
1030 	 FALSE),		/* pcrel_offset */
1031 
1032   /* A 6 bit shift field.  */
1033   HOWTO (R_MIPS_SHIFT6,		/* type */
1034 	 0,			/* rightshift */
1035 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1036 	 6,			/* bitsize */
1037 	 FALSE,			/* pc_relative */
1038 	 6,			/* bitpos */
1039 	 complain_overflow_bitfield, /* complain_on_overflow */
1040 	 mips_elf64_shift6_reloc, /* special_function */
1041 	 "R_MIPS_SHIFT6",	/* name */
1042 	 FALSE,			/* partial_inplace */
1043 	 0,			/* src_mask */
1044 	 0x000007c4,		/* dst_mask */
1045 	 FALSE),		/* pcrel_offset */
1046 
1047   /* 64 bit relocation.  */
1048   HOWTO (R_MIPS_64,		/* type */
1049 	 0,			/* rightshift */
1050 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
1051 	 64,			/* bitsize */
1052 	 FALSE,			/* pc_relative */
1053 	 0,			/* bitpos */
1054 	 complain_overflow_dont, /* complain_on_overflow */
1055 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1056 	 "R_MIPS_64",		/* name */
1057 	 FALSE,			/* partial_inplace */
1058 	 0,			/* src_mask */
1059 	 MINUS_ONE,		/* dst_mask */
1060 	 FALSE),		/* pcrel_offset */
1061 
1062   /* Displacement in the global offset table.  */
1063   HOWTO (R_MIPS_GOT_DISP,	/* type */
1064 	 0,			/* rightshift */
1065 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1066 	 16,			/* bitsize */
1067 	 FALSE,			/* pc_relative */
1068 	 0,			/* bitpos */
1069 	 complain_overflow_signed, /* complain_on_overflow */
1070 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1071 	 "R_MIPS_GOT_DISP",	/* name */
1072 	 FALSE,			/* partial_inplace */
1073 	 0,			/* src_mask */
1074 	 0x0000ffff,		/* dst_mask */
1075 	 FALSE),		/* pcrel_offset */
1076 
1077   /* Displacement to page pointer in the global offset table.  */
1078   HOWTO (R_MIPS_GOT_PAGE,	/* type */
1079 	 0,			/* rightshift */
1080 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1081 	 16,			/* bitsize */
1082 	 FALSE,			/* pc_relative */
1083 	 0,			/* bitpos */
1084 	 complain_overflow_signed, /* complain_on_overflow */
1085 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1086 	 "R_MIPS_GOT_PAGE",	/* name */
1087 	 FALSE,			/* partial_inplace */
1088 	 0,			/* src_mask */
1089 	 0x0000ffff,		/* dst_mask */
1090 	 FALSE),		/* pcrel_offset */
1091 
1092   /* Offset from page pointer in the global offset table.  */
1093   HOWTO (R_MIPS_GOT_OFST,	/* type */
1094 	 0,			/* rightshift */
1095 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1096 	 16,			/* bitsize */
1097 	 FALSE,			/* pc_relative */
1098 	 0,			/* bitpos */
1099 	 complain_overflow_signed, /* complain_on_overflow */
1100 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1101 	 "R_MIPS_GOT_OFST",	/* name */
1102 	 FALSE,			/* partial_inplace */
1103 	 0,			/* src_mask */
1104 	 0x0000ffff,		/* dst_mask */
1105 	 FALSE),		/* pcrel_offset */
1106 
1107   /* High 16 bits of displacement in global offset table.  */
1108   HOWTO (R_MIPS_GOT_HI16,	/* type */
1109 	 0,			/* rightshift */
1110 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1111 	 16,			/* bitsize */
1112 	 FALSE,			/* pc_relative */
1113 	 0,			/* bitpos */
1114 	 complain_overflow_dont, /* complain_on_overflow */
1115 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1116 	 "R_MIPS_GOT_HI16",	/* name */
1117 	 FALSE,			/* partial_inplace */
1118 	 0,			/* src_mask */
1119 	 0x0000ffff,		/* dst_mask */
1120 	 FALSE),		/* pcrel_offset */
1121 
1122   /* Low 16 bits of displacement in global offset table.  */
1123   HOWTO (R_MIPS_GOT_LO16,	/* type */
1124 	 0,			/* rightshift */
1125 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1126 	 16,			/* bitsize */
1127 	 FALSE,			/* pc_relative */
1128 	 0,			/* bitpos */
1129 	 complain_overflow_dont, /* complain_on_overflow */
1130 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1131 	 "R_MIPS_GOT_LO16",	/* name */
1132 	 FALSE,			/* partial_inplace */
1133 	 0,			/* src_mask */
1134 	 0x0000ffff,		/* dst_mask */
1135 	 FALSE),		/* pcrel_offset */
1136 
1137   /* 64 bit subtraction.  */
1138   HOWTO (R_MIPS_SUB,		/* type */
1139 	 0,			/* rightshift */
1140 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
1141 	 64,			/* bitsize */
1142 	 FALSE,			/* pc_relative */
1143 	 0,			/* bitpos */
1144 	 complain_overflow_dont, /* complain_on_overflow */
1145 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1146 	 "R_MIPS_SUB",		/* name */
1147 	 FALSE,			/* partial_inplace */
1148 	 0,			/* src_mask */
1149 	 MINUS_ONE,		/* dst_mask */
1150 	 FALSE),		/* pcrel_offset */
1151 
1152   /* Insert the addend as an instruction.  */
1153   /* FIXME: Not handled correctly.  */
1154   HOWTO (R_MIPS_INSERT_A,	/* type */
1155 	 0,			/* rightshift */
1156 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1157 	 32,			/* bitsize */
1158 	 FALSE,			/* pc_relative */
1159 	 0,			/* bitpos */
1160 	 complain_overflow_dont, /* complain_on_overflow */
1161 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1162 	 "R_MIPS_INSERT_A",	/* name */
1163 	 FALSE,			/* partial_inplace */
1164 	 0,			/* src_mask */
1165 	 0xffffffff,		/* dst_mask */
1166 	 FALSE),		/* pcrel_offset */
1167 
1168   /* Insert the addend as an instruction, and change all relocations
1169      to refer to the old instruction at the address.  */
1170   /* FIXME: Not handled correctly.  */
1171   HOWTO (R_MIPS_INSERT_B,	/* type */
1172 	 0,			/* rightshift */
1173 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1174 	 32,			/* bitsize */
1175 	 FALSE,			/* pc_relative */
1176 	 0,			/* bitpos */
1177 	 complain_overflow_dont, /* complain_on_overflow */
1178 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1179 	 "R_MIPS_INSERT_B",	/* name */
1180 	 FALSE,			/* partial_inplace */
1181 	 0,			/* src_mask */
1182 	 0xffffffff,		/* dst_mask */
1183 	 FALSE),		/* pcrel_offset */
1184 
1185   /* Delete a 32 bit instruction.  */
1186   /* FIXME: Not handled correctly.  */
1187   HOWTO (R_MIPS_DELETE,		/* type */
1188 	 0,			/* rightshift */
1189 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1190 	 32,			/* bitsize */
1191 	 FALSE,			/* pc_relative */
1192 	 0,			/* bitpos */
1193 	 complain_overflow_dont, /* complain_on_overflow */
1194 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1195 	 "R_MIPS_DELETE",	/* name */
1196 	 FALSE,			/* partial_inplace */
1197 	 0,			/* src_mask */
1198 	 0xffffffff,		/* dst_mask */
1199 	 FALSE),		/* pcrel_offset */
1200 
1201   /* Get the higher value of a 64 bit addend.  */
1202   HOWTO (R_MIPS_HIGHER,		/* type */
1203 	 0,			/* rightshift */
1204 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1205 	 16,			/* bitsize */
1206 	 FALSE,			/* pc_relative */
1207 	 0,			/* bitpos */
1208 	 complain_overflow_dont, /* complain_on_overflow */
1209 	 _bfd_mips_elf_generic_reloc, /* special_function */
1210 	 "R_MIPS_HIGHER",	/* name */
1211 	 FALSE,			/* partial_inplace */
1212 	 0,			/* src_mask */
1213 	 0x0000ffff,		/* dst_mask */
1214 	 FALSE),		/* pcrel_offset */
1215 
1216   /* Get the highest value of a 64 bit addend.  */
1217   HOWTO (R_MIPS_HIGHEST,	/* type */
1218 	 0,			/* rightshift */
1219 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1220 	 16,			/* bitsize */
1221 	 FALSE,			/* pc_relative */
1222 	 0,			/* bitpos */
1223 	 complain_overflow_dont, /* complain_on_overflow */
1224 	 _bfd_mips_elf_generic_reloc, /* special_function */
1225 	 "R_MIPS_HIGHEST",	/* name */
1226 	 FALSE,			/* partial_inplace */
1227 	 0,			/* src_mask */
1228 	 0x0000ffff,		/* dst_mask */
1229 	 FALSE),		/* pcrel_offset */
1230 
1231   /* High 16 bits of displacement in global offset table.  */
1232   HOWTO (R_MIPS_CALL_HI16,	/* type */
1233 	 0,			/* rightshift */
1234 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1235 	 16,			/* bitsize */
1236 	 FALSE,			/* pc_relative */
1237 	 0,			/* bitpos */
1238 	 complain_overflow_dont, /* complain_on_overflow */
1239 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1240 	 "R_MIPS_CALL_HI16",	/* name */
1241 	 FALSE,			/* partial_inplace */
1242 	 0,			/* src_mask */
1243 	 0x0000ffff,		/* dst_mask */
1244 	 FALSE),		/* pcrel_offset */
1245 
1246   /* Low 16 bits of displacement in global offset table.  */
1247   HOWTO (R_MIPS_CALL_LO16,	/* type */
1248 	 0,			/* rightshift */
1249 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1250 	 16,			/* bitsize */
1251 	 FALSE,			/* pc_relative */
1252 	 0,			/* bitpos */
1253 	 complain_overflow_dont, /* complain_on_overflow */
1254 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1255 	 "R_MIPS_CALL_LO16",	/* name */
1256 	 FALSE,			/* partial_inplace */
1257 	 0,			/* src_mask */
1258 	 0x0000ffff,		/* dst_mask */
1259 	 FALSE),		/* pcrel_offset */
1260 
1261   /* Section displacement, used by an associated event location section.  */
1262   HOWTO (R_MIPS_SCN_DISP,	/* type */
1263 	 0,			/* rightshift */
1264 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1265 	 32,			/* bitsize */
1266 	 FALSE,			/* pc_relative */
1267 	 0,			/* bitpos */
1268 	 complain_overflow_dont, /* complain_on_overflow */
1269 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1270 	 "R_MIPS_SCN_DISP",	/* name */
1271 	 FALSE,			/* partial_inplace */
1272 	 0,			/* src_mask */
1273 	 0xffffffff,		/* dst_mask */
1274 	 FALSE),		/* pcrel_offset */
1275 
1276   HOWTO (R_MIPS_REL16,		/* type */
1277 	 0,			/* rightshift */
1278 	 1,			/* size (0 = byte, 1 = short, 2 = long) */
1279 	 16,			/* bitsize */
1280 	 FALSE,			/* pc_relative */
1281 	 0,			/* bitpos */
1282 	 complain_overflow_signed, /* complain_on_overflow */
1283 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1284 	 "R_MIPS_REL16",	/* name */
1285 	 FALSE,			/* partial_inplace */
1286 	 0,			/* src_mask */
1287 	 0xffff,		/* dst_mask */
1288 	 FALSE),		/* pcrel_offset */
1289 
1290   /* These two are obsolete.  */
1291   EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE),
1292   EMPTY_HOWTO (R_MIPS_PJUMP),
1293 
1294   /* Similiar to R_MIPS_REL32, but used for relocations in a GOT section.
1295      It must be used for multigot GOT's (and only there).  */
1296   HOWTO (R_MIPS_RELGOT,		/* type */
1297 	 0,			/* rightshift */
1298 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1299 	 32,			/* bitsize */
1300 	 FALSE,			/* pc_relative */
1301 	 0,			/* bitpos */
1302 	 complain_overflow_dont, /* complain_on_overflow */
1303 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1304 	 "R_MIPS_RELGOT",	/* name */
1305 	 FALSE,			/* partial_inplace */
1306 	 0,			/* src_mask */
1307 	 0xffffffff,		/* dst_mask */
1308 	 FALSE),		/* pcrel_offset */
1309 
1310   /* Protected jump conversion.  This is an optimization hint.  No
1311      relocation is required for correctness.  */
1312   HOWTO (R_MIPS_JALR,		/* type */
1313 	 0,			/* rightshift */
1314 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1315 	 32,			/* 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_JALR",		/* name */
1321 	 FALSE,			/* partial_inplace */
1322 	 0,			/* src_mask */
1323 	 0x00000000,		/* dst_mask */
1324 	 FALSE),		/* pcrel_offset */
1325 
1326   /* TLS relocations.  */
1327   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD32),
1328   EMPTY_HOWTO (R_MIPS_TLS_DTPREL32),
1329   EMPTY_HOWTO (R_MIPS_TLS_DTPMOD64),
1330 
1331   HOWTO (R_MIPS_TLS_DTPREL64,	/* type */
1332 	 0,			/* rightshift */
1333 	 4,			/* size (0 = byte, 1 = short, 2 = long) */
1334 	 64,			/* bitsize */
1335 	 FALSE,			/* pc_relative */
1336 	 0,			/* bitpos */
1337 	 complain_overflow_dont, /* complain_on_overflow */
1338 	 _bfd_mips_elf_generic_reloc, /* special_function */
1339 	 "R_MIPS_TLS_DTPREL64",	/* name */
1340 	 TRUE,			/* partial_inplace */
1341 	 MINUS_ONE,		/* src_mask */
1342 	 MINUS_ONE,		/* dst_mask */
1343 	 FALSE),		/* pcrel_offset */
1344 
1345   /* TLS general dynamic variable reference.  */
1346   HOWTO (R_MIPS_TLS_GD,		/* type */
1347 	 0,			/* rightshift */
1348 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1349 	 16,			/* bitsize */
1350 	 FALSE,			/* pc_relative */
1351 	 0,			/* bitpos */
1352 	 complain_overflow_signed, /* complain_on_overflow */
1353 	 _bfd_mips_elf_generic_reloc, /* special_function */
1354 	 "R_MIPS_TLS_GD",	/* name */
1355 	 TRUE,			/* partial_inplace */
1356 	 0x0000ffff,		/* src_mask */
1357 	 0x0000ffff,		/* dst_mask */
1358 	 FALSE),		/* pcrel_offset */
1359 
1360   /* TLS local dynamic variable reference.  */
1361   HOWTO (R_MIPS_TLS_LDM,	/* type */
1362 	 0,			/* rightshift */
1363 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1364 	 16,			/* bitsize */
1365 	 FALSE,			/* pc_relative */
1366 	 0,			/* bitpos */
1367 	 complain_overflow_signed, /* complain_on_overflow */
1368 	 _bfd_mips_elf_generic_reloc, /* special_function */
1369 	 "R_MIPS_TLS_LDM",	/* name */
1370 	 TRUE,			/* partial_inplace */
1371 	 0x0000ffff,		/* src_mask */
1372 	 0x0000ffff,		/* dst_mask */
1373 	 FALSE),		/* pcrel_offset */
1374 
1375   /* TLS local dynamic offset.  */
1376   HOWTO (R_MIPS_TLS_DTPREL_HI16,	/* type */
1377 	 0,			/* rightshift */
1378 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1379 	 16,			/* bitsize */
1380 	 FALSE,			/* pc_relative */
1381 	 0,			/* bitpos */
1382 	 complain_overflow_signed, /* complain_on_overflow */
1383 	 _bfd_mips_elf_generic_reloc, /* special_function */
1384 	 "R_MIPS_TLS_DTPREL_HI16",	/* name */
1385 	 TRUE,			/* partial_inplace */
1386 	 0x0000ffff,		/* src_mask */
1387 	 0x0000ffff,		/* dst_mask */
1388 	 FALSE),		/* pcrel_offset */
1389 
1390   /* TLS local dynamic offset.  */
1391   HOWTO (R_MIPS_TLS_DTPREL_LO16,	/* type */
1392 	 0,			/* rightshift */
1393 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1394 	 16,			/* bitsize */
1395 	 FALSE,			/* pc_relative */
1396 	 0,			/* bitpos */
1397 	 complain_overflow_signed, /* complain_on_overflow */
1398 	 _bfd_mips_elf_generic_reloc, /* special_function */
1399 	 "R_MIPS_TLS_DTPREL_LO16",	/* name */
1400 	 TRUE,			/* partial_inplace */
1401 	 0x0000ffff,		/* src_mask */
1402 	 0x0000ffff,		/* dst_mask */
1403 	 FALSE),		/* pcrel_offset */
1404 
1405   /* TLS thread pointer offset.  */
1406   HOWTO (R_MIPS_TLS_GOTTPREL,	/* type */
1407 	 0,			/* rightshift */
1408 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1409 	 16,			/* bitsize */
1410 	 FALSE,			/* pc_relative */
1411 	 0,			/* bitpos */
1412 	 complain_overflow_signed, /* complain_on_overflow */
1413 	 _bfd_mips_elf_generic_reloc, /* special_function */
1414 	 "R_MIPS_TLS_GOTTPREL",	/* name */
1415 	 TRUE,			/* partial_inplace */
1416 	 0x0000ffff,		/* src_mask */
1417 	 0x0000ffff,		/* dst_mask */
1418 	 FALSE),		/* pcrel_offset */
1419 
1420   EMPTY_HOWTO (R_MIPS_TLS_TPREL32),
1421   EMPTY_HOWTO (R_MIPS_TLS_TPREL64),
1422 
1423   /* TLS thread pointer offset.  */
1424   HOWTO (R_MIPS_TLS_TPREL_HI16,	/* type */
1425 	 0,			/* rightshift */
1426 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1427 	 16,			/* bitsize */
1428 	 FALSE,			/* pc_relative */
1429 	 0,			/* bitpos */
1430 	 complain_overflow_signed, /* complain_on_overflow */
1431 	 _bfd_mips_elf_generic_reloc, /* special_function */
1432 	 "R_MIPS_TLS_TPREL_HI16", /* name */
1433 	 TRUE,			/* partial_inplace */
1434 	 0x0000ffff,		/* src_mask */
1435 	 0x0000ffff,		/* dst_mask */
1436 	 FALSE),		/* pcrel_offset */
1437 
1438   /* TLS thread pointer offset.  */
1439   HOWTO (R_MIPS_TLS_TPREL_LO16,	/* type */
1440 	 0,			/* rightshift */
1441 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1442 	 16,			/* bitsize */
1443 	 FALSE,			/* pc_relative */
1444 	 0,			/* bitpos */
1445 	 complain_overflow_signed, /* complain_on_overflow */
1446 	 _bfd_mips_elf_generic_reloc, /* special_function */
1447 	 "R_MIPS_TLS_TPREL_LO16", /* name */
1448 	 TRUE,			/* partial_inplace */
1449 	 0x0000ffff,		/* src_mask */
1450 	 0x0000ffff,		/* dst_mask */
1451 	 FALSE),		/* pcrel_offset */
1452 
1453   /* 32 bit relocation with no addend.  */
1454   HOWTO (R_MIPS_GLOB_DAT,	/* type */
1455 	 0,			/* rightshift */
1456 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1457 	 32,			/* bitsize */
1458 	 FALSE,			/* pc_relative */
1459 	 0,			/* bitpos */
1460 	 complain_overflow_dont, /* complain_on_overflow */
1461 	 _bfd_mips_elf_generic_reloc, /* special_function */
1462 	 "R_MIPS_GLOB_DAT",	/* name */
1463 	 FALSE,			/* partial_inplace */
1464 	 0x0,			/* src_mask */
1465 	 0xffffffff,		/* dst_mask */
1466 	 FALSE),		/* pcrel_offset */
1467 };
1468 
1469 static reloc_howto_type mips16_elf64_howto_table_rel[] =
1470 {
1471   /* The reloc used for the mips16 jump instruction.  */
1472   HOWTO (R_MIPS16_26,		/* type */
1473 	 2,			/* rightshift */
1474 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1475 	 26,			/* bitsize */
1476 	 FALSE,			/* pc_relative */
1477 	 0,			/* bitpos */
1478 	 complain_overflow_dont, /* complain_on_overflow */
1479 	 			/* This needs complex overflow
1480 				   detection, because the upper four
1481 				   bits must match the PC.  */
1482 	 _bfd_mips_elf_generic_reloc, /* special_function */
1483 	 "R_MIPS16_26",		/* name */
1484 	 TRUE,			/* partial_inplace */
1485 	 0x3ffffff,		/* src_mask */
1486 	 0x3ffffff,		/* dst_mask */
1487 	 FALSE),		/* pcrel_offset */
1488 
1489   /* The reloc used for the mips16 gprel instruction.  */
1490   HOWTO (R_MIPS16_GPREL,	/* type */
1491 	 0,			/* rightshift */
1492 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1493 	 16,			/* bitsize */
1494 	 FALSE,			/* pc_relative */
1495 	 0,			/* bitpos */
1496 	 complain_overflow_signed, /* complain_on_overflow */
1497 	 mips16_gprel_reloc,	/* special_function */
1498 	 "R_MIPS16_GPREL",	/* name */
1499 	 TRUE,			/* partial_inplace */
1500 	 0x0000ffff,		/* src_mask */
1501 	 0x0000ffff,	        /* dst_mask */
1502 	 FALSE),		/* pcrel_offset */
1503 
1504   /* A placeholder for MIPS16 reference to global offset table.  */
1505   EMPTY_HOWTO (R_MIPS16_GOT16),
1506 
1507   /* A placeholder for MIPS16 16 bit call through global offset table.  */
1508   EMPTY_HOWTO (R_MIPS16_CALL16),
1509 
1510   /* MIPS16 high 16 bits of symbol value.  */
1511   HOWTO (R_MIPS16_HI16,		/* type */
1512 	 16,			/* rightshift */
1513 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1514 	 16,			/* bitsize */
1515 	 FALSE,			/* pc_relative */
1516 	 0,			/* bitpos */
1517 	 complain_overflow_dont, /* complain_on_overflow */
1518 	 _bfd_mips_elf_hi16_reloc, /* special_function */
1519 	 "R_MIPS16_HI16",	/* name */
1520 	 TRUE,			/* partial_inplace */
1521 	 0x0000ffff,		/* src_mask */
1522 	 0x0000ffff,		/* dst_mask */
1523 	 FALSE),		/* pcrel_offset */
1524 
1525   /* MIPS16 low 16 bits of symbol value.  */
1526   HOWTO (R_MIPS16_LO16,		/* type */
1527 	 0,			/* rightshift */
1528 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1529 	 16,			/* bitsize */
1530 	 FALSE,			/* pc_relative */
1531 	 0,			/* bitpos */
1532 	 complain_overflow_dont, /* complain_on_overflow */
1533 	 _bfd_mips_elf_lo16_reloc, /* special_function */
1534 	 "R_MIPS16_LO16",	/* name */
1535 	 TRUE,			/* partial_inplace */
1536 	 0x0000ffff,		/* src_mask */
1537 	 0x0000ffff,		/* dst_mask */
1538 	 FALSE),		/* pcrel_offset */
1539 };
1540 
1541 static reloc_howto_type mips16_elf64_howto_table_rela[] =
1542 {
1543   /* The reloc used for the mips16 jump instruction.  */
1544   HOWTO (R_MIPS16_26,		/* type */
1545 	 2,			/* rightshift */
1546 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1547 	 26,			/* bitsize */
1548 	 FALSE,			/* pc_relative */
1549 	 0,			/* bitpos */
1550 	 complain_overflow_dont, /* complain_on_overflow */
1551 	 			/* This needs complex overflow
1552 				   detection, because the upper four
1553 				   bits must match the PC.  */
1554 	 _bfd_mips_elf_generic_reloc, /* special_function */
1555 	 "R_MIPS16_26",		/* name */
1556 	 FALSE,			/* partial_inplace */
1557 	 0x3ffffff,		/* src_mask */
1558 	 0x3ffffff,		/* dst_mask */
1559 	 FALSE),		/* pcrel_offset */
1560 
1561   /* The reloc used for the mips16 gprel instruction.  */
1562   HOWTO (R_MIPS16_GPREL,	/* type */
1563 	 0,			/* rightshift */
1564 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1565 	 16,			/* bitsize */
1566 	 FALSE,			/* pc_relative */
1567 	 0,			/* bitpos */
1568 	 complain_overflow_signed, /* complain_on_overflow */
1569 	 mips16_gprel_reloc,	/* special_function */
1570 	 "R_MIPS16_GPREL",	/* name */
1571 	 FALSE,			/* partial_inplace */
1572 	 0x0000ffff,		/* src_mask */
1573 	 0x0000ffff,	        /* dst_mask */
1574 	 FALSE),		/* pcrel_offset */
1575 
1576   /* A placeholder for MIPS16 reference to global offset table.  */
1577   EMPTY_HOWTO (R_MIPS16_GOT16),
1578 
1579   /* A placeholder for MIPS16 16 bit call through global offset table.  */
1580   EMPTY_HOWTO (R_MIPS16_CALL16),
1581 
1582   /* MIPS16 high 16 bits of symbol value.  */
1583   HOWTO (R_MIPS16_HI16,		/* type */
1584 	 16,			/* rightshift */
1585 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1586 	 16,			/* bitsize */
1587 	 FALSE,			/* pc_relative */
1588 	 0,			/* bitpos */
1589 	 complain_overflow_dont, /* complain_on_overflow */
1590 	 _bfd_mips_elf_hi16_reloc, /* special_function */
1591 	 "R_MIPS16_HI16",	/* name */
1592 	 FALSE,			/* partial_inplace */
1593 	 0x0000ffff,		/* src_mask */
1594 	 0x0000ffff,		/* dst_mask */
1595 	 FALSE),		/* pcrel_offset */
1596 
1597   /* MIPS16 low 16 bits of symbol value.  */
1598   HOWTO (R_MIPS16_LO16,		/* type */
1599 	 0,			/* rightshift */
1600 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1601 	 16,			/* bitsize */
1602 	 FALSE,			/* pc_relative */
1603 	 0,			/* bitpos */
1604 	 complain_overflow_dont, /* complain_on_overflow */
1605 	 _bfd_mips_elf_lo16_reloc, /* special_function */
1606 	 "R_MIPS16_LO16",	/* name */
1607 	 FALSE,			/* partial_inplace */
1608 	 0x0000ffff,		/* src_mask */
1609 	 0x0000ffff,		/* dst_mask */
1610 	 FALSE),		/* pcrel_offset */
1611 };
1612 
1613 /* GNU extension to record C++ vtable hierarchy */
1614 static reloc_howto_type elf_mips_gnu_vtinherit_howto =
1615   HOWTO (R_MIPS_GNU_VTINHERIT,	/* type */
1616 	 0,			/* rightshift */
1617 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1618 	 0,			/* bitsize */
1619 	 FALSE,			/* pc_relative */
1620 	 0,			/* bitpos */
1621 	 complain_overflow_dont, /* complain_on_overflow */
1622 	 NULL,			/* special_function */
1623 	 "R_MIPS_GNU_VTINHERIT", /* name */
1624 	 FALSE,			/* partial_inplace */
1625 	 0,			/* src_mask */
1626 	 0,			/* dst_mask */
1627 	 FALSE);		/* pcrel_offset */
1628 
1629 /* GNU extension to record C++ vtable member usage */
1630 static reloc_howto_type elf_mips_gnu_vtentry_howto =
1631   HOWTO (R_MIPS_GNU_VTENTRY,	/* type */
1632 	 0,			/* rightshift */
1633 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1634 	 0,			/* bitsize */
1635 	 FALSE,			/* pc_relative */
1636 	 0,			/* bitpos */
1637 	 complain_overflow_dont, /* complain_on_overflow */
1638 	 _bfd_elf_rel_vtable_reloc_fn, /* special_function */
1639 	 "R_MIPS_GNU_VTENTRY",	/* name */
1640 	 FALSE,			/* partial_inplace */
1641 	 0,			/* src_mask */
1642 	 0,			/* dst_mask */
1643 	 FALSE);		/* pcrel_offset */
1644 
1645 /* 16 bit offset for pc-relative branches.  */
1646 static reloc_howto_type elf_mips_gnu_rel16_s2 =
1647   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
1648 	 2,			/* rightshift */
1649 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1650 	 16,			/* bitsize */
1651 	 TRUE,			/* pc_relative */
1652 	 0,			/* bitpos */
1653 	 complain_overflow_signed, /* complain_on_overflow */
1654 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1655 	 "R_MIPS_GNU_REL16_S2",	/* name */
1656 	 TRUE,			/* partial_inplace */
1657 	 0x0000ffff,		/* src_mask */
1658 	 0x0000ffff,		/* dst_mask */
1659 	 TRUE);			/* pcrel_offset */
1660 
1661 /* 16 bit offset for pc-relative branches.  */
1662 static reloc_howto_type elf_mips_gnu_rela16_s2 =
1663   HOWTO (R_MIPS_GNU_REL16_S2,	/* type */
1664 	 2,			/* rightshift */
1665 	 2,			/* size (0 = byte, 1 = short, 2 = long) */
1666 	 16,			/* bitsize */
1667 	 TRUE,			/* pc_relative */
1668 	 0,			/* bitpos */
1669 	 complain_overflow_signed, /* complain_on_overflow */
1670 	 _bfd_mips_elf_generic_reloc,	/* special_function */
1671 	 "R_MIPS_GNU_REL16_S2",	/* name */
1672 	 FALSE,			/* partial_inplace */
1673 	 0,			/* src_mask */
1674 	 0x0000ffff,		/* dst_mask */
1675 	 TRUE);			/* pcrel_offset */
1676 
1677 /* Swap in a MIPS 64-bit Rel reloc.  */
1678 
1679 static void
mips_elf64_swap_reloc_in(bfd * abfd,const Elf64_Mips_External_Rel * src,Elf64_Mips_Internal_Rela * dst)1680 mips_elf64_swap_reloc_in (bfd *abfd, const Elf64_Mips_External_Rel *src,
1681 			  Elf64_Mips_Internal_Rela *dst)
1682 {
1683   dst->r_offset = H_GET_64 (abfd, src->r_offset);
1684   dst->r_sym = H_GET_32 (abfd, src->r_sym);
1685   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
1686   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
1687   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
1688   dst->r_type = H_GET_8 (abfd, src->r_type);
1689   dst->r_addend = 0;
1690 }
1691 
1692 /* Swap in a MIPS 64-bit Rela reloc.  */
1693 
1694 static void
mips_elf64_swap_reloca_in(bfd * abfd,const Elf64_Mips_External_Rela * src,Elf64_Mips_Internal_Rela * dst)1695 mips_elf64_swap_reloca_in (bfd *abfd, const Elf64_Mips_External_Rela *src,
1696 			   Elf64_Mips_Internal_Rela *dst)
1697 {
1698   dst->r_offset = H_GET_64 (abfd, src->r_offset);
1699   dst->r_sym = H_GET_32 (abfd, src->r_sym);
1700   dst->r_ssym = H_GET_8 (abfd, src->r_ssym);
1701   dst->r_type3 = H_GET_8 (abfd, src->r_type3);
1702   dst->r_type2 = H_GET_8 (abfd, src->r_type2);
1703   dst->r_type = H_GET_8 (abfd, src->r_type);
1704   dst->r_addend = H_GET_S64 (abfd, src->r_addend);
1705 }
1706 
1707 /* Swap out a MIPS 64-bit Rel reloc.  */
1708 
1709 static void
mips_elf64_swap_reloc_out(bfd * abfd,const Elf64_Mips_Internal_Rela * src,Elf64_Mips_External_Rel * dst)1710 mips_elf64_swap_reloc_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
1711 			   Elf64_Mips_External_Rel *dst)
1712 {
1713   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
1714   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
1715   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
1716   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
1717   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
1718   H_PUT_8 (abfd, src->r_type, dst->r_type);
1719 }
1720 
1721 /* Swap out a MIPS 64-bit Rela reloc.  */
1722 
1723 static void
mips_elf64_swap_reloca_out(bfd * abfd,const Elf64_Mips_Internal_Rela * src,Elf64_Mips_External_Rela * dst)1724 mips_elf64_swap_reloca_out (bfd *abfd, const Elf64_Mips_Internal_Rela *src,
1725 			    Elf64_Mips_External_Rela *dst)
1726 {
1727   H_PUT_64 (abfd, src->r_offset, dst->r_offset);
1728   H_PUT_32 (abfd, src->r_sym, dst->r_sym);
1729   H_PUT_8 (abfd, src->r_ssym, dst->r_ssym);
1730   H_PUT_8 (abfd, src->r_type3, dst->r_type3);
1731   H_PUT_8 (abfd, src->r_type2, dst->r_type2);
1732   H_PUT_8 (abfd, src->r_type, dst->r_type);
1733   H_PUT_S64 (abfd, src->r_addend, dst->r_addend);
1734 }
1735 
1736 /* Swap in a MIPS 64-bit Rel reloc.  */
1737 
1738 static void
mips_elf64_be_swap_reloc_in(bfd * abfd,const bfd_byte * src,Elf_Internal_Rela * dst)1739 mips_elf64_be_swap_reloc_in (bfd *abfd, const bfd_byte *src,
1740 			     Elf_Internal_Rela *dst)
1741 {
1742   Elf64_Mips_Internal_Rela mirel;
1743 
1744   mips_elf64_swap_reloc_in (abfd,
1745 			    (const Elf64_Mips_External_Rel *) src,
1746 			    &mirel);
1747 
1748   dst[0].r_offset = mirel.r_offset;
1749   dst[0].r_info = ELF64_R_INFO (mirel.r_sym, mirel.r_type);
1750   dst[0].r_addend = 0;
1751   dst[1].r_offset = mirel.r_offset;
1752   dst[1].r_info = ELF64_R_INFO (mirel.r_ssym, mirel.r_type2);
1753   dst[1].r_addend = 0;
1754   dst[2].r_offset = mirel.r_offset;
1755   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirel.r_type3);
1756   dst[2].r_addend = 0;
1757 }
1758 
1759 /* Swap in a MIPS 64-bit Rela reloc.  */
1760 
1761 static void
mips_elf64_be_swap_reloca_in(bfd * abfd,const bfd_byte * src,Elf_Internal_Rela * dst)1762 mips_elf64_be_swap_reloca_in (bfd *abfd, const bfd_byte *src,
1763 			      Elf_Internal_Rela *dst)
1764 {
1765   Elf64_Mips_Internal_Rela mirela;
1766 
1767   mips_elf64_swap_reloca_in (abfd,
1768 			     (const Elf64_Mips_External_Rela *) src,
1769 			     &mirela);
1770 
1771   dst[0].r_offset = mirela.r_offset;
1772   dst[0].r_info = ELF64_R_INFO (mirela.r_sym, mirela.r_type);
1773   dst[0].r_addend = mirela.r_addend;
1774   dst[1].r_offset = mirela.r_offset;
1775   dst[1].r_info = ELF64_R_INFO (mirela.r_ssym, mirela.r_type2);
1776   dst[1].r_addend = 0;
1777   dst[2].r_offset = mirela.r_offset;
1778   dst[2].r_info = ELF64_R_INFO (STN_UNDEF, mirela.r_type3);
1779   dst[2].r_addend = 0;
1780 }
1781 
1782 /* Swap out a MIPS 64-bit Rel reloc.  */
1783 
1784 static void
mips_elf64_be_swap_reloc_out(bfd * abfd,const Elf_Internal_Rela * src,bfd_byte * dst)1785 mips_elf64_be_swap_reloc_out (bfd *abfd, const Elf_Internal_Rela *src,
1786 			      bfd_byte *dst)
1787 {
1788   Elf64_Mips_Internal_Rela mirel;
1789 
1790   mirel.r_offset = src[0].r_offset;
1791   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
1792 
1793   mirel.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
1794   mirel.r_sym = ELF64_R_SYM (src[0].r_info);
1795   mirel.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
1796   mirel.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
1797   mirel.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
1798 
1799   mips_elf64_swap_reloc_out (abfd, &mirel,
1800 			     (Elf64_Mips_External_Rel *) dst);
1801 }
1802 
1803 /* Swap out a MIPS 64-bit Rela reloc.  */
1804 
1805 static void
mips_elf64_be_swap_reloca_out(bfd * abfd,const Elf_Internal_Rela * src,bfd_byte * dst)1806 mips_elf64_be_swap_reloca_out (bfd *abfd, const Elf_Internal_Rela *src,
1807 			       bfd_byte *dst)
1808 {
1809   Elf64_Mips_Internal_Rela mirela;
1810 
1811   mirela.r_offset = src[0].r_offset;
1812   BFD_ASSERT(src[0].r_offset == src[1].r_offset);
1813   BFD_ASSERT(src[0].r_offset == src[2].r_offset);
1814 
1815   mirela.r_type = ELF64_MIPS_R_TYPE (src[0].r_info);
1816   mirela.r_sym = ELF64_R_SYM (src[0].r_info);
1817   mirela.r_addend = src[0].r_addend;
1818   BFD_ASSERT(src[1].r_addend == 0);
1819   BFD_ASSERT(src[2].r_addend == 0);
1820 
1821   mirela.r_type2 = ELF64_MIPS_R_TYPE (src[1].r_info);
1822   mirela.r_ssym = ELF64_MIPS_R_SSYM (src[1].r_info);
1823   mirela.r_type3 = ELF64_MIPS_R_TYPE (src[2].r_info);
1824 
1825   mips_elf64_swap_reloca_out (abfd, &mirela,
1826 			      (Elf64_Mips_External_Rela *) dst);
1827 }
1828 
1829 /* Set the GP value for OUTPUT_BFD.  Returns FALSE if this is a
1830    dangerous relocation.  */
1831 
1832 static bfd_boolean
mips_elf64_assign_gp(bfd * output_bfd,bfd_vma * pgp)1833 mips_elf64_assign_gp (bfd *output_bfd, bfd_vma *pgp)
1834 {
1835   unsigned int count;
1836   asymbol **sym;
1837   unsigned int i;
1838 
1839   /* If we've already figured out what GP will be, just return it.  */
1840   *pgp = _bfd_get_gp_value (output_bfd);
1841   if (*pgp)
1842     return TRUE;
1843 
1844   count = bfd_get_symcount (output_bfd);
1845   sym = bfd_get_outsymbols (output_bfd);
1846 
1847   /* The linker script will have created a symbol named `_gp' with the
1848      appropriate value.  */
1849   if (sym == NULL)
1850     i = count;
1851   else
1852     {
1853       for (i = 0; i < count; i++, sym++)
1854 	{
1855 	  register const char *name;
1856 
1857 	  name = bfd_asymbol_name (*sym);
1858 	  if (*name == '_' && strcmp (name, "_gp") == 0)
1859 	    {
1860 	      *pgp = bfd_asymbol_value (*sym);
1861 	      _bfd_set_gp_value (output_bfd, *pgp);
1862 	      break;
1863 	    }
1864 	}
1865     }
1866 
1867   if (i >= count)
1868     {
1869       /* Only get the error once.  */
1870       *pgp = 4;
1871       _bfd_set_gp_value (output_bfd, *pgp);
1872       return FALSE;
1873     }
1874 
1875   return TRUE;
1876 }
1877 
1878 /* We have to figure out the gp value, so that we can adjust the
1879    symbol value correctly.  We look up the symbol _gp in the output
1880    BFD.  If we can't find it, we're stuck.  We cache it in the ELF
1881    target data.  We don't need to adjust the symbol value for an
1882    external symbol if we are producing relocatable output.  */
1883 
1884 static bfd_reloc_status_type
mips_elf64_final_gp(bfd * output_bfd,asymbol * symbol,bfd_boolean relocatable,char ** error_message,bfd_vma * pgp)1885 mips_elf64_final_gp (bfd *output_bfd, asymbol *symbol, bfd_boolean relocatable,
1886 		     char **error_message, bfd_vma *pgp)
1887 {
1888   if (bfd_is_und_section (symbol->section)
1889       && ! relocatable)
1890     {
1891       *pgp = 0;
1892       return bfd_reloc_undefined;
1893     }
1894 
1895   *pgp = _bfd_get_gp_value (output_bfd);
1896   if (*pgp == 0
1897       && (! relocatable
1898 	  || (symbol->flags & BSF_SECTION_SYM) != 0))
1899     {
1900       if (relocatable)
1901 	{
1902 	  /* Make up a value.  */
1903 	  *pgp = symbol->section->output_section->vma /*+ 0x4000*/;
1904 	  _bfd_set_gp_value (output_bfd, *pgp);
1905 	}
1906       else if (!mips_elf64_assign_gp (output_bfd, pgp))
1907 	{
1908 	  *error_message =
1909 	    (char *) _("GP relative relocation when _gp not defined");
1910 	  return bfd_reloc_dangerous;
1911 	}
1912     }
1913 
1914   return bfd_reloc_ok;
1915 }
1916 
1917 /* Do a R_MIPS_GPREL16 relocation.  This is a 16 bit value which must
1918    become the offset from the gp register.  */
1919 
1920 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)1921 mips_elf64_gprel16_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1922 			  void *data, asection *input_section, bfd *output_bfd,
1923 			  char **error_message)
1924 {
1925   bfd_boolean relocatable;
1926   bfd_reloc_status_type ret;
1927   bfd_vma gp;
1928 
1929   /* If we're relocating, and this is an external symbol, we don't want
1930      to change anything.  */
1931   if (output_bfd != NULL
1932       && (symbol->flags & BSF_SECTION_SYM) == 0
1933       && (symbol->flags & BSF_LOCAL) != 0)
1934     {
1935       reloc_entry->address += input_section->output_offset;
1936       return bfd_reloc_ok;
1937     }
1938 
1939   if (output_bfd != NULL)
1940     relocatable = TRUE;
1941   else
1942     {
1943       relocatable = FALSE;
1944       output_bfd = symbol->section->output_section->owner;
1945     }
1946 
1947   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
1948 			     &gp);
1949   if (ret != bfd_reloc_ok)
1950     return ret;
1951 
1952   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1953 					input_section, relocatable,
1954 					data, gp);
1955 }
1956 
1957 /* Do a R_MIPS_LITERAL relocation.  */
1958 
1959 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)1960 mips_elf64_literal_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
1961 			  void *data, asection *input_section, bfd *output_bfd,
1962 			  char **error_message)
1963 {
1964   bfd_boolean relocatable;
1965   bfd_reloc_status_type ret;
1966   bfd_vma gp;
1967 
1968   /* R_MIPS_LITERAL relocations are defined for local symbols only.  */
1969   if (output_bfd != NULL
1970       && (symbol->flags & BSF_SECTION_SYM) == 0
1971       && (symbol->flags & BSF_LOCAL) != 0)
1972     {
1973       *error_message = (char *)
1974 	_("literal relocation occurs for an external symbol");
1975       return bfd_reloc_outofrange;
1976     }
1977 
1978   /* FIXME: The entries in the .lit8 and .lit4 sections should be merged.  */
1979   if (output_bfd != NULL)
1980     relocatable = TRUE;
1981   else
1982     {
1983       relocatable = FALSE;
1984       output_bfd = symbol->section->output_section->owner;
1985     }
1986 
1987   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
1988 			     &gp);
1989   if (ret != bfd_reloc_ok)
1990     return ret;
1991 
1992   return _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
1993 					input_section, relocatable,
1994 					data, gp);
1995 }
1996 
1997 /* Do a R_MIPS_GPREL32 relocation.  This is a 32 bit value which must
1998    become the offset from the gp register.  */
1999 
2000 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)2001 mips_elf64_gprel32_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2002 			  void *data, asection *input_section, bfd *output_bfd,
2003 			  char **error_message)
2004 {
2005   bfd_boolean relocatable;
2006   bfd_reloc_status_type ret;
2007   bfd_vma gp;
2008   bfd_vma relocation;
2009   bfd_vma val;
2010 
2011   /* R_MIPS_GPREL32 relocations are defined for local symbols only.  */
2012   if (output_bfd != NULL
2013       && (symbol->flags & BSF_SECTION_SYM) == 0
2014       && (symbol->flags & BSF_LOCAL) != 0)
2015     {
2016       *error_message = (char *)
2017 	_("32bits gp relative relocation occurs for an external symbol");
2018       return bfd_reloc_outofrange;
2019     }
2020 
2021   if (output_bfd != NULL)
2022     relocatable = TRUE;
2023   else
2024     {
2025       relocatable = FALSE;
2026       output_bfd = symbol->section->output_section->owner;
2027     }
2028 
2029   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable,
2030 			     error_message, &gp);
2031   if (ret != bfd_reloc_ok)
2032     return ret;
2033 
2034   if (bfd_is_com_section (symbol->section))
2035     relocation = 0;
2036   else
2037     relocation = symbol->value;
2038 
2039   relocation += symbol->section->output_section->vma;
2040   relocation += symbol->section->output_offset;
2041 
2042   if (reloc_entry->address > bfd_get_section_limit (abfd, input_section))
2043     return bfd_reloc_outofrange;
2044 
2045   /* Set val to the offset into the section or symbol.  */
2046   val = reloc_entry->addend;
2047 
2048   if (reloc_entry->howto->partial_inplace)
2049     val += bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
2050 
2051   /* Adjust val for the final section location and GP value.  If we
2052      are producing relocatable output, we don't want to do this for
2053      an external symbol.  */
2054   if (! relocatable
2055       || (symbol->flags & BSF_SECTION_SYM) != 0)
2056     val += relocation - gp;
2057 
2058   if (reloc_entry->howto->partial_inplace)
2059     bfd_put_32 (abfd, val, (bfd_byte *) data + reloc_entry->address);
2060   else
2061     reloc_entry->addend = val;
2062 
2063   if (relocatable)
2064     reloc_entry->address += input_section->output_offset;
2065 
2066   return bfd_reloc_ok;
2067 }
2068 
2069 /* Do a R_MIPS_SHIFT6 relocation. The MSB of the shift is stored at bit 2,
2070    the rest is at bits 6-10. The bitpos already got right by the howto.  */
2071 
2072 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)2073 mips_elf64_shift6_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2074 			 void *data, asection *input_section, bfd *output_bfd,
2075 			 char **error_message)
2076 {
2077   if (reloc_entry->howto->partial_inplace)
2078     {
2079       reloc_entry->addend = ((reloc_entry->addend & 0x00007c0)
2080 			     | (reloc_entry->addend & 0x00000800) >> 9);
2081     }
2082 
2083   return _bfd_mips_elf_generic_reloc (abfd, reloc_entry, symbol, data,
2084 				      input_section, output_bfd,
2085 				      error_message);
2086 }
2087 
2088 /* Handle a mips16 GP relative reloc.  */
2089 
2090 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)2091 mips16_gprel_reloc (bfd *abfd, arelent *reloc_entry, asymbol *symbol,
2092 		    void *data, asection *input_section, bfd *output_bfd,
2093 		    char **error_message)
2094 {
2095   bfd_boolean relocatable;
2096   bfd_reloc_status_type ret;
2097   bfd_byte *location;
2098   bfd_vma gp;
2099 
2100   /* If we're relocating, and this is an external symbol, we don't want
2101      to change anything.  */
2102   if (output_bfd != NULL
2103       && (symbol->flags & BSF_SECTION_SYM) == 0
2104       && (symbol->flags & BSF_LOCAL) != 0)
2105     {
2106       reloc_entry->address += input_section->output_offset;
2107       return bfd_reloc_ok;
2108     }
2109 
2110   if (output_bfd != NULL)
2111     relocatable = TRUE;
2112   else
2113     {
2114       relocatable = FALSE;
2115       output_bfd = symbol->section->output_section->owner;
2116     }
2117 
2118   ret = mips_elf64_final_gp (output_bfd, symbol, relocatable, error_message,
2119 			     &gp);
2120   if (ret != bfd_reloc_ok)
2121     return ret;
2122 
2123   location = (bfd_byte *) data + reloc_entry->address;
2124   _bfd_mips16_elf_reloc_unshuffle (abfd, reloc_entry->howto->type, FALSE,
2125 				   location);
2126   ret = _bfd_mips_elf_gprel16_with_gp (abfd, symbol, reloc_entry,
2127 				       input_section, relocatable,
2128 				       data, gp);
2129   _bfd_mips16_elf_reloc_shuffle (abfd, reloc_entry->howto->type, !relocatable,
2130 				 location);
2131 
2132   return ret;
2133 }
2134 
2135 /* A mapping from BFD reloc types to MIPS ELF reloc types.  */
2136 
2137 struct elf_reloc_map {
2138   bfd_reloc_code_real_type bfd_val;
2139   enum elf_mips_reloc_type elf_val;
2140 };
2141 
2142 static const struct elf_reloc_map mips_reloc_map[] =
2143 {
2144   { BFD_RELOC_NONE, R_MIPS_NONE },
2145   { BFD_RELOC_16, R_MIPS_16 },
2146   { BFD_RELOC_32, R_MIPS_32 },
2147   /* There is no BFD reloc for R_MIPS_REL32.  */
2148   { BFD_RELOC_64, R_MIPS_64 },
2149   { BFD_RELOC_CTOR, R_MIPS_64 },
2150   { BFD_RELOC_16_PCREL_S2, R_MIPS_PC16 },
2151   { BFD_RELOC_HI16_S, R_MIPS_HI16 },
2152   { BFD_RELOC_LO16, R_MIPS_LO16 },
2153   { BFD_RELOC_GPREL16, R_MIPS_GPREL16 },
2154   { BFD_RELOC_GPREL32, R_MIPS_GPREL32 },
2155   { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
2156   { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
2157   { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
2158   { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
2159   { BFD_RELOC_MIPS_SHIFT5, R_MIPS_SHIFT5 },
2160   { BFD_RELOC_MIPS_SHIFT6, R_MIPS_SHIFT6 },
2161   { BFD_RELOC_MIPS_GOT_DISP, R_MIPS_GOT_DISP },
2162   { BFD_RELOC_MIPS_GOT_PAGE, R_MIPS_GOT_PAGE },
2163   { BFD_RELOC_MIPS_GOT_OFST, R_MIPS_GOT_OFST },
2164   { BFD_RELOC_MIPS_GOT_HI16, R_MIPS_GOT_HI16 },
2165   { BFD_RELOC_MIPS_GOT_LO16, R_MIPS_GOT_LO16 },
2166   { BFD_RELOC_MIPS_SUB, R_MIPS_SUB },
2167   { BFD_RELOC_MIPS_INSERT_A, R_MIPS_INSERT_A },
2168   { BFD_RELOC_MIPS_INSERT_B, R_MIPS_INSERT_B },
2169   { BFD_RELOC_MIPS_DELETE, R_MIPS_DELETE },
2170   { BFD_RELOC_MIPS_HIGHEST, R_MIPS_HIGHEST },
2171   { BFD_RELOC_MIPS_HIGHER, R_MIPS_HIGHER },
2172   { BFD_RELOC_MIPS_CALL_HI16, R_MIPS_CALL_HI16 },
2173   { BFD_RELOC_MIPS_CALL_LO16, R_MIPS_CALL_LO16 },
2174   { BFD_RELOC_MIPS_SCN_DISP, R_MIPS_SCN_DISP },
2175   { BFD_RELOC_MIPS_REL16, R_MIPS_REL16 },
2176   /* Use of R_MIPS_ADD_IMMEDIATE and R_MIPS_PJUMP is deprecated.  */
2177   { BFD_RELOC_MIPS_RELGOT, R_MIPS_RELGOT },
2178   { BFD_RELOC_MIPS_JALR, R_MIPS_JALR },
2179   { BFD_RELOC_MIPS_TLS_DTPMOD32, R_MIPS_TLS_DTPMOD32 },
2180   { BFD_RELOC_MIPS_TLS_DTPREL32, R_MIPS_TLS_DTPREL32 },
2181   { BFD_RELOC_MIPS_TLS_DTPMOD64, R_MIPS_TLS_DTPMOD64 },
2182   { BFD_RELOC_MIPS_TLS_DTPREL64, R_MIPS_TLS_DTPREL64 },
2183   { BFD_RELOC_MIPS_TLS_GD, R_MIPS_TLS_GD },
2184   { BFD_RELOC_MIPS_TLS_LDM, R_MIPS_TLS_LDM },
2185   { BFD_RELOC_MIPS_TLS_DTPREL_HI16, R_MIPS_TLS_DTPREL_HI16 },
2186   { BFD_RELOC_MIPS_TLS_DTPREL_LO16, R_MIPS_TLS_DTPREL_LO16 },
2187   { BFD_RELOC_MIPS_TLS_GOTTPREL, R_MIPS_TLS_GOTTPREL },
2188   { BFD_RELOC_MIPS_TLS_TPREL32, R_MIPS_TLS_TPREL32 },
2189   { BFD_RELOC_MIPS_TLS_TPREL64, R_MIPS_TLS_TPREL64 },
2190   { BFD_RELOC_MIPS_TLS_TPREL_HI16, R_MIPS_TLS_TPREL_HI16 },
2191   { BFD_RELOC_MIPS_TLS_TPREL_LO16, R_MIPS_TLS_TPREL_LO16 }
2192 };
2193 
2194 static const struct elf_reloc_map mips16_reloc_map[] =
2195 {
2196   { BFD_RELOC_MIPS16_JMP, R_MIPS16_26 - R_MIPS16_min },
2197   { BFD_RELOC_MIPS16_GPREL, R_MIPS16_GPREL - R_MIPS16_min },
2198   { BFD_RELOC_MIPS16_HI16_S, R_MIPS16_HI16 - R_MIPS16_min },
2199   { BFD_RELOC_MIPS16_LO16, R_MIPS16_LO16 - R_MIPS16_min },
2200 };
2201 
2202 /* Given a BFD reloc type, return a howto structure.  */
2203 
2204 static reloc_howto_type *
bfd_elf64_bfd_reloc_type_lookup(bfd * abfd ATTRIBUTE_UNUSED,bfd_reloc_code_real_type code)2205 bfd_elf64_bfd_reloc_type_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2206 				 bfd_reloc_code_real_type code)
2207 {
2208   unsigned int i;
2209   /* FIXME: We default to RELA here instead of choosing the right
2210      relocation variant.  */
2211   reloc_howto_type *howto_table = mips_elf64_howto_table_rela;
2212   reloc_howto_type *howto16_table = mips16_elf64_howto_table_rela;
2213 
2214   for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map);
2215        i++)
2216     {
2217       if (mips_reloc_map[i].bfd_val == code)
2218 	return &howto_table[(int) mips_reloc_map[i].elf_val];
2219     }
2220 
2221   for (i = 0; i < sizeof (mips16_reloc_map) / sizeof (struct elf_reloc_map);
2222        i++)
2223     {
2224       if (mips16_reloc_map[i].bfd_val == code)
2225 	return &howto16_table[(int) mips16_reloc_map[i].elf_val];
2226     }
2227 
2228   switch (code)
2229     {
2230     case BFD_RELOC_VTABLE_INHERIT:
2231       return &elf_mips_gnu_vtinherit_howto;
2232     case BFD_RELOC_VTABLE_ENTRY:
2233       return &elf_mips_gnu_vtentry_howto;
2234     default:
2235       bfd_set_error (bfd_error_bad_value);
2236       return NULL;
2237     }
2238 }
2239 
2240 static reloc_howto_type *
bfd_elf64_bfd_reloc_name_lookup(bfd * abfd ATTRIBUTE_UNUSED,const char * r_name)2241 bfd_elf64_bfd_reloc_name_lookup (bfd *abfd ATTRIBUTE_UNUSED,
2242 				 const char *r_name)
2243 {
2244   unsigned int i;
2245 
2246   for (i = 0;
2247        i < (sizeof (mips_elf64_howto_table_rela)
2248 	    / sizeof (mips_elf64_howto_table_rela[0])); i++)
2249     if (mips_elf64_howto_table_rela[i].name != NULL
2250 	&& strcasecmp (mips_elf64_howto_table_rela[i].name, r_name) == 0)
2251       return &mips_elf64_howto_table_rela[i];
2252 
2253   for (i = 0;
2254        i < (sizeof (mips16_elf64_howto_table_rela)
2255 	    / sizeof (mips16_elf64_howto_table_rela[0]));
2256        i++)
2257     if (mips16_elf64_howto_table_rela[i].name != NULL
2258 	&& strcasecmp (mips16_elf64_howto_table_rela[i].name, r_name) == 0)
2259       return &mips16_elf64_howto_table_rela[i];
2260 
2261   if (strcasecmp (elf_mips_gnu_vtinherit_howto.name, r_name) == 0)
2262     return &elf_mips_gnu_vtinherit_howto;
2263   if (strcasecmp (elf_mips_gnu_vtentry_howto.name, r_name) == 0)
2264     return &elf_mips_gnu_vtentry_howto;
2265   if (strcasecmp (elf_mips_gnu_rel16_s2.name, r_name) == 0)
2266     return &elf_mips_gnu_rel16_s2;
2267   if (strcasecmp (elf_mips_gnu_rela16_s2.name, r_name) == 0)
2268     return &elf_mips_gnu_rela16_s2;
2269 
2270   return NULL;
2271 }
2272 
2273 /* Given a MIPS Elf_Internal_Rel, fill in an arelent structure.  */
2274 
2275 static reloc_howto_type *
mips_elf64_rtype_to_howto(unsigned int r_type,bfd_boolean rela_p)2276 mips_elf64_rtype_to_howto (unsigned int r_type, bfd_boolean rela_p)
2277 {
2278   switch (r_type)
2279     {
2280     case R_MIPS_GNU_VTINHERIT:
2281       return &elf_mips_gnu_vtinherit_howto;
2282     case R_MIPS_GNU_VTENTRY:
2283       return &elf_mips_gnu_vtentry_howto;
2284     case R_MIPS_GNU_REL16_S2:
2285       if (rela_p)
2286 	return &elf_mips_gnu_rela16_s2;
2287       else
2288 	return &elf_mips_gnu_rel16_s2;
2289     default:
2290       if (r_type >= R_MIPS16_min && r_type < R_MIPS16_max)
2291 	{
2292 	  if (rela_p)
2293 	    return &mips16_elf64_howto_table_rela[r_type - R_MIPS16_min];
2294 	  else
2295 	    return &mips16_elf64_howto_table_rel[r_type - R_MIPS16_min];
2296 	}
2297       BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
2298       if (rela_p)
2299 	return &mips_elf64_howto_table_rela[r_type];
2300       else
2301 	return &mips_elf64_howto_table_rel[r_type];
2302       break;
2303     }
2304 }
2305 
2306 /* Prevent relocation handling by bfd for MIPS ELF64.  */
2307 
2308 static void
mips_elf64_info_to_howto_rel(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr ATTRIBUTE_UNUSED,Elf_Internal_Rela * dst ATTRIBUTE_UNUSED)2309 mips_elf64_info_to_howto_rel (bfd *abfd ATTRIBUTE_UNUSED,
2310 			      arelent *cache_ptr ATTRIBUTE_UNUSED,
2311 			      Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
2312 {
2313   BFD_ASSERT (0);
2314 }
2315 
2316 static void
mips_elf64_info_to_howto_rela(bfd * abfd ATTRIBUTE_UNUSED,arelent * cache_ptr ATTRIBUTE_UNUSED,Elf_Internal_Rela * dst ATTRIBUTE_UNUSED)2317 mips_elf64_info_to_howto_rela (bfd *abfd ATTRIBUTE_UNUSED,
2318 			       arelent *cache_ptr ATTRIBUTE_UNUSED,
2319 			       Elf_Internal_Rela *dst ATTRIBUTE_UNUSED)
2320 {
2321   BFD_ASSERT (0);
2322 }
2323 
2324 /* Since each entry in an SHT_REL or SHT_RELA section can represent up
2325    to three relocs, we must tell the user to allocate more space.  */
2326 
2327 static long
mips_elf64_get_reloc_upper_bound(bfd * abfd ATTRIBUTE_UNUSED,asection * sec)2328 mips_elf64_get_reloc_upper_bound (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
2329 {
2330   return (sec->reloc_count * 3 + 1) * sizeof (arelent *);
2331 }
2332 
2333 static long
mips_elf64_get_dynamic_reloc_upper_bound(bfd * abfd)2334 mips_elf64_get_dynamic_reloc_upper_bound (bfd *abfd)
2335 {
2336   return _bfd_elf_get_dynamic_reloc_upper_bound (abfd) * 3;
2337 }
2338 
2339 /* We must also copy more relocations than the corresponding functions
2340    in elf.c would, so the two following functions are slightly
2341    modified from elf.c, that multiply the external relocation count by
2342    3 to obtain the internal relocation count.  */
2343 
2344 static long
mips_elf64_canonicalize_reloc(bfd * abfd,sec_ptr section,arelent ** relptr,asymbol ** symbols)2345 mips_elf64_canonicalize_reloc (bfd *abfd, sec_ptr section,
2346 			       arelent **relptr, asymbol **symbols)
2347 {
2348   arelent *tblptr;
2349   unsigned int i;
2350   const struct elf_backend_data *bed = get_elf_backend_data (abfd);
2351 
2352   if (! bed->s->slurp_reloc_table (abfd, section, symbols, FALSE))
2353     return -1;
2354 
2355   tblptr = section->relocation;
2356   for (i = 0; i < section->reloc_count * 3; i++)
2357     *relptr++ = tblptr++;
2358 
2359   *relptr = NULL;
2360 
2361   return section->reloc_count * 3;
2362 }
2363 
2364 static long
mips_elf64_canonicalize_dynamic_reloc(bfd * abfd,arelent ** storage,asymbol ** syms)2365 mips_elf64_canonicalize_dynamic_reloc (bfd *abfd, arelent **storage,
2366 				       asymbol **syms)
2367 {
2368   bfd_boolean (*slurp_relocs) (bfd *, asection *, asymbol **, bfd_boolean);
2369   asection *s;
2370   long ret;
2371 
2372   if (elf_dynsymtab (abfd) == 0)
2373     {
2374       bfd_set_error (bfd_error_invalid_operation);
2375       return -1;
2376     }
2377 
2378   slurp_relocs = get_elf_backend_data (abfd)->s->slurp_reloc_table;
2379   ret = 0;
2380   for (s = abfd->sections; s != NULL; s = s->next)
2381     {
2382       if (elf_section_data (s)->this_hdr.sh_link == elf_dynsymtab (abfd)
2383 	  && (elf_section_data (s)->this_hdr.sh_type == SHT_REL
2384 	      || elf_section_data (s)->this_hdr.sh_type == SHT_RELA))
2385 	{
2386 	  arelent *p;
2387 	  long count, i;
2388 
2389 	  if (! (*slurp_relocs) (abfd, s, syms, TRUE))
2390 	    return -1;
2391 	  count = s->size / elf_section_data (s)->this_hdr.sh_entsize * 3;
2392 	  p = s->relocation;
2393 	  for (i = 0; i < count; i++)
2394 	    *storage++ = p++;
2395 	  ret += count;
2396 	}
2397     }
2398 
2399   *storage = NULL;
2400 
2401   return ret;
2402 }
2403 
2404 /* Read the relocations from one reloc section.  This is mostly copied
2405    from elfcode.h, except for the changes to expand one external
2406    relocation to 3 internal ones.  We must unfortunately set
2407    reloc_count to the number of external relocations, because a lot of
2408    generic code seems to depend on this.  */
2409 
2410 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)2411 mips_elf64_slurp_one_reloc_table (bfd *abfd, asection *asect,
2412 				  Elf_Internal_Shdr *rel_hdr,
2413 				  bfd_size_type reloc_count,
2414 				  arelent *relents, asymbol **symbols,
2415 				  bfd_boolean dynamic)
2416 {
2417   void *allocated;
2418   bfd_byte *native_relocs;
2419   arelent *relent;
2420   bfd_vma i;
2421   int entsize;
2422   bfd_boolean rela_p;
2423 
2424   allocated = bfd_malloc (rel_hdr->sh_size);
2425   if (allocated == NULL)
2426     return FALSE;
2427 
2428   if (bfd_seek (abfd, rel_hdr->sh_offset, SEEK_SET) != 0
2429       || (bfd_bread (allocated, rel_hdr->sh_size, abfd)
2430 	  != rel_hdr->sh_size))
2431     goto error_return;
2432 
2433   native_relocs = allocated;
2434 
2435   entsize = rel_hdr->sh_entsize;
2436   BFD_ASSERT (entsize == sizeof (Elf64_Mips_External_Rel)
2437 	      || entsize == sizeof (Elf64_Mips_External_Rela));
2438 
2439   if (entsize == sizeof (Elf64_Mips_External_Rel))
2440     rela_p = FALSE;
2441   else
2442     rela_p = TRUE;
2443 
2444   for (i = 0, relent = relents;
2445        i < reloc_count;
2446        i++, native_relocs += entsize)
2447     {
2448       Elf64_Mips_Internal_Rela rela;
2449       bfd_boolean used_sym, used_ssym;
2450       int ir;
2451 
2452       if (entsize == sizeof (Elf64_Mips_External_Rela))
2453 	mips_elf64_swap_reloca_in (abfd,
2454 				   (Elf64_Mips_External_Rela *) native_relocs,
2455 				   &rela);
2456       else
2457 	mips_elf64_swap_reloc_in (abfd,
2458 				  (Elf64_Mips_External_Rel *) native_relocs,
2459 				  &rela);
2460 
2461       /* Each entry represents exactly three actual relocations.  */
2462 
2463       used_sym = FALSE;
2464       used_ssym = FALSE;
2465       for (ir = 0; ir < 3; ir++)
2466 	{
2467 	  enum elf_mips_reloc_type type;
2468 
2469 	  switch (ir)
2470 	    {
2471 	    default:
2472 	      abort ();
2473 	    case 0:
2474 	      type = (enum elf_mips_reloc_type) rela.r_type;
2475 	      break;
2476 	    case 1:
2477 	      type = (enum elf_mips_reloc_type) rela.r_type2;
2478 	      break;
2479 	    case 2:
2480 	      type = (enum elf_mips_reloc_type) rela.r_type3;
2481 	      break;
2482 	    }
2483 
2484 	  /* Some types require symbols, whereas some do not.  */
2485 	  switch (type)
2486 	    {
2487 	    case R_MIPS_NONE:
2488 	    case R_MIPS_LITERAL:
2489 	    case R_MIPS_INSERT_A:
2490 	    case R_MIPS_INSERT_B:
2491 	    case R_MIPS_DELETE:
2492 	      relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
2493 	      break;
2494 
2495 	    default:
2496 	      if (! used_sym)
2497 		{
2498 		  if (rela.r_sym == 0)
2499 		    relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
2500 		  else
2501 		    {
2502 		      asymbol **ps, *s;
2503 
2504 		      ps = symbols + rela.r_sym - 1;
2505 		      s = *ps;
2506 		      if ((s->flags & BSF_SECTION_SYM) == 0)
2507 			relent->sym_ptr_ptr = ps;
2508 		      else
2509 			relent->sym_ptr_ptr = s->section->symbol_ptr_ptr;
2510 		    }
2511 
2512 		  used_sym = TRUE;
2513 		}
2514 	      else if (! used_ssym)
2515 		{
2516 		  switch (rela.r_ssym)
2517 		    {
2518 		    case RSS_UNDEF:
2519 		      relent->sym_ptr_ptr =
2520 			bfd_abs_section_ptr->symbol_ptr_ptr;
2521 		      break;
2522 
2523 		    case RSS_GP:
2524 		    case RSS_GP0:
2525 		    case RSS_LOC:
2526 		      /* FIXME: I think these need to be handled using
2527 			 special howto structures.  */
2528 		      BFD_ASSERT (0);
2529 		      break;
2530 
2531 		    default:
2532 		      BFD_ASSERT (0);
2533 		      break;
2534 		    }
2535 
2536 		  used_ssym = TRUE;
2537 		}
2538 	      else
2539 		relent->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
2540 
2541 	      break;
2542 	    }
2543 
2544 	  /* The address of an ELF reloc is section relative for an
2545 	     object file, and absolute for an executable file or
2546 	     shared library.  The address of a BFD reloc is always
2547 	     section relative.  */
2548 	  if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0 || dynamic)
2549 	    relent->address = rela.r_offset;
2550 	  else
2551 	    relent->address = rela.r_offset - asect->vma;
2552 
2553 	  relent->addend = rela.r_addend;
2554 
2555 	  relent->howto = mips_elf64_rtype_to_howto (type, rela_p);
2556 
2557 	  ++relent;
2558 	}
2559     }
2560 
2561   asect->reloc_count += (relent - relents) / 3;
2562 
2563   if (allocated != NULL)
2564     free (allocated);
2565 
2566   return TRUE;
2567 
2568  error_return:
2569   if (allocated != NULL)
2570     free (allocated);
2571   return FALSE;
2572 }
2573 
2574 /* Read the relocations.  On Irix 6, there can be two reloc sections
2575    associated with a single data section.  This is copied from
2576    elfcode.h as well, with changes as small as accounting for 3
2577    internal relocs per external reloc and resetting reloc_count to
2578    zero before processing the relocs of a section.  */
2579 
2580 static bfd_boolean
mips_elf64_slurp_reloc_table(bfd * abfd,asection * asect,asymbol ** symbols,bfd_boolean dynamic)2581 mips_elf64_slurp_reloc_table (bfd *abfd, asection *asect,
2582 			      asymbol **symbols, bfd_boolean dynamic)
2583 {
2584   struct bfd_elf_section_data * const d = elf_section_data (asect);
2585   Elf_Internal_Shdr *rel_hdr;
2586   Elf_Internal_Shdr *rel_hdr2;
2587   bfd_size_type reloc_count;
2588   bfd_size_type reloc_count2;
2589   arelent *relents;
2590   bfd_size_type amt;
2591 
2592   if (asect->relocation != NULL)
2593     return TRUE;
2594 
2595   if (! dynamic)
2596     {
2597       if ((asect->flags & SEC_RELOC) == 0
2598 	  || asect->reloc_count == 0)
2599 	return TRUE;
2600 
2601       rel_hdr = &d->rel_hdr;
2602       reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
2603       rel_hdr2 = d->rel_hdr2;
2604       reloc_count2 = (rel_hdr2 ? NUM_SHDR_ENTRIES (rel_hdr2) : 0);
2605 
2606       BFD_ASSERT (asect->reloc_count == reloc_count + reloc_count2);
2607       BFD_ASSERT (asect->rel_filepos == rel_hdr->sh_offset
2608 		  || (rel_hdr2 && asect->rel_filepos == rel_hdr2->sh_offset));
2609 
2610     }
2611   else
2612     {
2613       /* Note that ASECT->RELOC_COUNT tends not to be accurate in this
2614 	 case because relocations against this section may use the
2615 	 dynamic symbol table, and in that case bfd_section_from_shdr
2616 	 in elf.c does not update the RELOC_COUNT.  */
2617       if (asect->size == 0)
2618 	return TRUE;
2619 
2620       rel_hdr = &d->this_hdr;
2621       reloc_count = NUM_SHDR_ENTRIES (rel_hdr);
2622       rel_hdr2 = NULL;
2623       reloc_count2 = 0;
2624     }
2625 
2626   /* Allocate space for 3 arelent structures for each Rel structure.  */
2627   amt = (reloc_count + reloc_count2) * 3 * sizeof (arelent);
2628   relents = bfd_alloc (abfd, amt);
2629   if (relents == NULL)
2630     return FALSE;
2631 
2632   /* The slurp_one_reloc_table routine increments reloc_count.  */
2633   asect->reloc_count = 0;
2634 
2635   if (! mips_elf64_slurp_one_reloc_table (abfd, asect,
2636 					  rel_hdr, reloc_count,
2637 					  relents,
2638 					  symbols, dynamic))
2639     return FALSE;
2640   if (d->rel_hdr2 != NULL)
2641     {
2642       if (! mips_elf64_slurp_one_reloc_table (abfd, asect,
2643 					      rel_hdr2, reloc_count2,
2644 					      relents + reloc_count * 3,
2645 					      symbols, dynamic))
2646 	return FALSE;
2647     }
2648 
2649   asect->relocation = relents;
2650   return TRUE;
2651 }
2652 
2653 /* Write out the relocations.  */
2654 
2655 static void
mips_elf64_write_relocs(bfd * abfd,asection * sec,void * data)2656 mips_elf64_write_relocs (bfd *abfd, asection *sec, void *data)
2657 {
2658   bfd_boolean *failedp = data;
2659   int count;
2660   Elf_Internal_Shdr *rel_hdr;
2661   unsigned int idx;
2662 
2663   /* If we have already failed, don't do anything.  */
2664   if (*failedp)
2665     return;
2666 
2667   if ((sec->flags & SEC_RELOC) == 0)
2668     return;
2669 
2670   /* The linker backend writes the relocs out itself, and sets the
2671      reloc_count field to zero to inhibit writing them here.  Also,
2672      sometimes the SEC_RELOC flag gets set even when there aren't any
2673      relocs.  */
2674   if (sec->reloc_count == 0)
2675     return;
2676 
2677   /* We can combine up to three relocs that refer to the same address
2678      if the latter relocs have no associated symbol.  */
2679   count = 0;
2680   for (idx = 0; idx < sec->reloc_count; idx++)
2681     {
2682       bfd_vma addr;
2683       unsigned int i;
2684 
2685       ++count;
2686 
2687       addr = sec->orelocation[idx]->address;
2688       for (i = 0; i < 2; i++)
2689 	{
2690 	  arelent *r;
2691 
2692 	  if (idx + 1 >= sec->reloc_count)
2693 	    break;
2694 	  r = sec->orelocation[idx + 1];
2695 	  if (r->address != addr
2696 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
2697 	      || (*r->sym_ptr_ptr)->value != 0)
2698 	    break;
2699 
2700 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
2701 
2702 	  ++idx;
2703 	}
2704     }
2705 
2706   rel_hdr = &elf_section_data (sec)->rel_hdr;
2707 
2708   /* Do the actual relocation.  */
2709 
2710   if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rel))
2711     mips_elf64_write_rel (abfd, sec, rel_hdr, &count, data);
2712   else if (rel_hdr->sh_entsize == sizeof(Elf64_Mips_External_Rela))
2713     mips_elf64_write_rela (abfd, sec, rel_hdr, &count, data);
2714   else
2715     BFD_ASSERT (0);
2716 }
2717 
2718 static void
mips_elf64_write_rel(bfd * abfd,asection * sec,Elf_Internal_Shdr * rel_hdr,int * count,void * data)2719 mips_elf64_write_rel (bfd *abfd, asection *sec,
2720 		      Elf_Internal_Shdr *rel_hdr,
2721 		      int *count, void *data)
2722 {
2723   bfd_boolean *failedp = data;
2724   Elf64_Mips_External_Rel *ext_rel;
2725   unsigned int idx;
2726   asymbol *last_sym = 0;
2727   int last_sym_idx = 0;
2728 
2729   rel_hdr->sh_size = rel_hdr->sh_entsize * *count;
2730   rel_hdr->contents = bfd_alloc (abfd, rel_hdr->sh_size);
2731   if (rel_hdr->contents == NULL)
2732     {
2733       *failedp = TRUE;
2734       return;
2735     }
2736 
2737   ext_rel = (Elf64_Mips_External_Rel *) rel_hdr->contents;
2738   for (idx = 0; idx < sec->reloc_count; idx++, ext_rel++)
2739     {
2740       arelent *ptr;
2741       Elf64_Mips_Internal_Rela int_rel;
2742       asymbol *sym;
2743       int n;
2744       unsigned int i;
2745 
2746       ptr = sec->orelocation[idx];
2747 
2748       /* The address of an ELF reloc is section relative for an object
2749 	 file, and absolute for an executable file or shared library.
2750 	 The address of a BFD reloc is always section relative.  */
2751       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
2752 	int_rel.r_offset = ptr->address;
2753       else
2754 	int_rel.r_offset = ptr->address + sec->vma;
2755 
2756       sym = *ptr->sym_ptr_ptr;
2757       if (sym == last_sym)
2758 	n = last_sym_idx;
2759       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
2760 	n = STN_UNDEF;
2761       else
2762 	{
2763 	  last_sym = sym;
2764 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
2765 	  if (n < 0)
2766 	    {
2767 	      *failedp = TRUE;
2768 	      return;
2769 	    }
2770 	  last_sym_idx = n;
2771 	}
2772 
2773       int_rel.r_sym = n;
2774       int_rel.r_ssym = RSS_UNDEF;
2775 
2776       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
2777 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
2778 	{
2779 	  *failedp = TRUE;
2780 	  return;
2781 	}
2782 
2783       int_rel.r_type = ptr->howto->type;
2784       int_rel.r_type2 = (int) R_MIPS_NONE;
2785       int_rel.r_type3 = (int) R_MIPS_NONE;
2786 
2787       for (i = 0; i < 2; i++)
2788 	{
2789 	  arelent *r;
2790 
2791 	  if (idx + 1 >= sec->reloc_count)
2792 	    break;
2793 	  r = sec->orelocation[idx + 1];
2794 	  if (r->address != ptr->address
2795 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
2796 	      || (*r->sym_ptr_ptr)->value != 0)
2797 	    break;
2798 
2799 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
2800 
2801 	  if (i == 0)
2802 	    int_rel.r_type2 = r->howto->type;
2803 	  else
2804 	    int_rel.r_type3 = r->howto->type;
2805 
2806 	  ++idx;
2807 	}
2808 
2809       mips_elf64_swap_reloc_out (abfd, &int_rel, ext_rel);
2810     }
2811 
2812   BFD_ASSERT (ext_rel - (Elf64_Mips_External_Rel *) rel_hdr->contents
2813 	      == *count);
2814 }
2815 
2816 static void
mips_elf64_write_rela(bfd * abfd,asection * sec,Elf_Internal_Shdr * rela_hdr,int * count,void * data)2817 mips_elf64_write_rela (bfd *abfd, asection *sec,
2818 		       Elf_Internal_Shdr *rela_hdr,
2819 		       int *count, void *data)
2820 {
2821   bfd_boolean *failedp = data;
2822   Elf64_Mips_External_Rela *ext_rela;
2823   unsigned int idx;
2824   asymbol *last_sym = 0;
2825   int last_sym_idx = 0;
2826 
2827   rela_hdr->sh_size = rela_hdr->sh_entsize * *count;
2828   rela_hdr->contents = bfd_alloc (abfd, rela_hdr->sh_size);
2829   if (rela_hdr->contents == NULL)
2830     {
2831       *failedp = TRUE;
2832       return;
2833     }
2834 
2835   ext_rela = (Elf64_Mips_External_Rela *) rela_hdr->contents;
2836   for (idx = 0; idx < sec->reloc_count; idx++, ext_rela++)
2837     {
2838       arelent *ptr;
2839       Elf64_Mips_Internal_Rela int_rela;
2840       asymbol *sym;
2841       int n;
2842       unsigned int i;
2843 
2844       ptr = sec->orelocation[idx];
2845 
2846       /* The address of an ELF reloc is section relative for an object
2847 	 file, and absolute for an executable file or shared library.
2848 	 The address of a BFD reloc is always section relative.  */
2849       if ((abfd->flags & (EXEC_P | DYNAMIC)) == 0)
2850 	int_rela.r_offset = ptr->address;
2851       else
2852 	int_rela.r_offset = ptr->address + sec->vma;
2853 
2854       sym = *ptr->sym_ptr_ptr;
2855       if (sym == last_sym)
2856 	n = last_sym_idx;
2857       else if (bfd_is_abs_section (sym->section) && sym->value == 0)
2858 	n = STN_UNDEF;
2859       else
2860 	{
2861 	  last_sym = sym;
2862 	  n = _bfd_elf_symbol_from_bfd_symbol (abfd, &sym);
2863 	  if (n < 0)
2864 	    {
2865 	      *failedp = TRUE;
2866 	      return;
2867 	    }
2868 	  last_sym_idx = n;
2869 	}
2870 
2871       int_rela.r_sym = n;
2872       int_rela.r_addend = ptr->addend;
2873       int_rela.r_ssym = RSS_UNDEF;
2874 
2875       if ((*ptr->sym_ptr_ptr)->the_bfd->xvec != abfd->xvec
2876 	  && ! _bfd_elf_validate_reloc (abfd, ptr))
2877 	{
2878 	  *failedp = TRUE;
2879 	  return;
2880 	}
2881 
2882       int_rela.r_type = ptr->howto->type;
2883       int_rela.r_type2 = (int) R_MIPS_NONE;
2884       int_rela.r_type3 = (int) R_MIPS_NONE;
2885 
2886       for (i = 0; i < 2; i++)
2887 	{
2888 	  arelent *r;
2889 
2890 	  if (idx + 1 >= sec->reloc_count)
2891 	    break;
2892 	  r = sec->orelocation[idx + 1];
2893 	  if (r->address != ptr->address
2894 	      || ! bfd_is_abs_section ((*r->sym_ptr_ptr)->section)
2895 	      || (*r->sym_ptr_ptr)->value != 0)
2896 	    break;
2897 
2898 	  /* We can merge the reloc at IDX + 1 with the reloc at IDX.  */
2899 
2900 	  if (i == 0)
2901 	    int_rela.r_type2 = r->howto->type;
2902 	  else
2903 	    int_rela.r_type3 = r->howto->type;
2904 
2905 	  ++idx;
2906 	}
2907 
2908       mips_elf64_swap_reloca_out (abfd, &int_rela, ext_rela);
2909     }
2910 
2911   BFD_ASSERT (ext_rela - (Elf64_Mips_External_Rela *) rela_hdr->contents
2912 	      == *count);
2913 }
2914 
2915 /* Set the right machine number for a MIPS ELF file.  */
2916 
2917 static bfd_boolean
mips_elf64_object_p(bfd * abfd)2918 mips_elf64_object_p (bfd *abfd)
2919 {
2920   unsigned long mach;
2921 
2922   /* Irix 6 is broken.  Object file symbol tables are not always
2923      sorted correctly such that local symbols precede global symbols,
2924      and the sh_info field in the symbol table is not always right.  */
2925   if (elf64_mips_irix_compat (abfd) != ict_none)
2926     elf_bad_symtab (abfd) = TRUE;
2927 
2928   mach = _bfd_elf_mips_mach (elf_elfheader (abfd)->e_flags);
2929   bfd_default_set_arch_mach (abfd, bfd_arch_mips, mach);
2930   return TRUE;
2931 }
2932 
2933 /* Depending on the target vector we generate some version of Irix
2934    executables or "normal" MIPS ELF ABI executables.  */
2935 static irix_compat_t
elf64_mips_irix_compat(bfd * abfd)2936 elf64_mips_irix_compat (bfd *abfd)
2937 {
2938   if ((abfd->xvec == &bfd_elf64_bigmips_vec)
2939       || (abfd->xvec == &bfd_elf64_littlemips_vec))
2940     return ict_irix6;
2941   else
2942     return ict_none;
2943 }
2944 
2945 /* Support for core dump NOTE sections.  */
2946 static bfd_boolean
elf64_mips_grok_prstatus(bfd * abfd,Elf_Internal_Note * note)2947 elf64_mips_grok_prstatus (bfd *abfd, Elf_Internal_Note *note)
2948 {
2949   int offset;
2950   unsigned int size;
2951 
2952   switch (note->descsz)
2953     {
2954       default:
2955 	return FALSE;
2956 
2957       case 480:		/* Linux/MIPS - N64 kernel */
2958 	/* pr_cursig */
2959 	elf_tdata (abfd)->core_signal = bfd_get_16 (abfd, note->descdata + 12);
2960 
2961 	/* pr_pid */
2962 	elf_tdata (abfd)->core_pid = bfd_get_32 (abfd, note->descdata + 32);
2963 
2964 	/* pr_reg */
2965 	offset = 112;
2966 	size = 360;
2967 
2968 	break;
2969     }
2970 
2971   /* Make a ".reg/999" section.  */
2972   return _bfd_elfcore_make_pseudosection (abfd, ".reg",
2973 					  size, note->descpos + offset);
2974 }
2975 
2976 static bfd_boolean
elf64_mips_grok_psinfo(bfd * abfd,Elf_Internal_Note * note)2977 elf64_mips_grok_psinfo (bfd *abfd, Elf_Internal_Note *note)
2978 {
2979   switch (note->descsz)
2980     {
2981       default:
2982 	return FALSE;
2983 
2984       case 136:		/* Linux/MIPS - N64 kernel elf_prpsinfo */
2985 	elf_tdata (abfd)->core_program
2986 	 = _bfd_elfcore_strndup (abfd, note->descdata + 40, 16);
2987 	elf_tdata (abfd)->core_command
2988 	 = _bfd_elfcore_strndup (abfd, note->descdata + 56, 80);
2989     }
2990 
2991   /* Note that for some reason, a spurious space is tacked
2992      onto the end of the args in some (at least one anyway)
2993      implementations, so strip it off if it exists.  */
2994 
2995   {
2996     char *command = elf_tdata (abfd)->core_command;
2997     int n = strlen (command);
2998 
2999     if (0 < n && command[n - 1] == ' ')
3000       command[n - 1] = '\0';
3001   }
3002 
3003   return TRUE;
3004 }
3005 
3006 /* ECOFF swapping routines.  These are used when dealing with the
3007    .mdebug section, which is in the ECOFF debugging format.  */
3008 static const struct ecoff_debug_swap mips_elf64_ecoff_debug_swap =
3009 {
3010   /* Symbol table magic number.  */
3011   magicSym2,
3012   /* Alignment of debugging information.  E.g., 4.  */
3013   8,
3014   /* Sizes of external symbolic information.  */
3015   sizeof (struct hdr_ext),
3016   sizeof (struct dnr_ext),
3017   sizeof (struct pdr_ext),
3018   sizeof (struct sym_ext),
3019   sizeof (struct opt_ext),
3020   sizeof (struct fdr_ext),
3021   sizeof (struct rfd_ext),
3022   sizeof (struct ext_ext),
3023   /* Functions to swap in external symbolic data.  */
3024   ecoff_swap_hdr_in,
3025   ecoff_swap_dnr_in,
3026   ecoff_swap_pdr_in,
3027   ecoff_swap_sym_in,
3028   ecoff_swap_opt_in,
3029   ecoff_swap_fdr_in,
3030   ecoff_swap_rfd_in,
3031   ecoff_swap_ext_in,
3032   _bfd_ecoff_swap_tir_in,
3033   _bfd_ecoff_swap_rndx_in,
3034   /* Functions to swap out external symbolic data.  */
3035   ecoff_swap_hdr_out,
3036   ecoff_swap_dnr_out,
3037   ecoff_swap_pdr_out,
3038   ecoff_swap_sym_out,
3039   ecoff_swap_opt_out,
3040   ecoff_swap_fdr_out,
3041   ecoff_swap_rfd_out,
3042   ecoff_swap_ext_out,
3043   _bfd_ecoff_swap_tir_out,
3044   _bfd_ecoff_swap_rndx_out,
3045   /* Function to read in symbolic data.  */
3046   _bfd_mips_elf_read_ecoff_info
3047 };
3048 
3049 /* Relocations in the 64 bit MIPS ELF ABI are more complex than in
3050    standard ELF.  This structure is used to redirect the relocation
3051    handling routines.  */
3052 
3053 const struct elf_size_info mips_elf64_size_info =
3054 {
3055   sizeof (Elf64_External_Ehdr),
3056   sizeof (Elf64_External_Phdr),
3057   sizeof (Elf64_External_Shdr),
3058   sizeof (Elf64_Mips_External_Rel),
3059   sizeof (Elf64_Mips_External_Rela),
3060   sizeof (Elf64_External_Sym),
3061   sizeof (Elf64_External_Dyn),
3062   sizeof (Elf_External_Note),
3063   4,		/* hash-table entry size */
3064   3,		/* internal relocations per external relocations */
3065   64,		/* arch_size */
3066   3,		/* log_file_align */
3067   ELFCLASS64,
3068   EV_CURRENT,
3069   bfd_elf64_write_out_phdrs,
3070   bfd_elf64_write_shdrs_and_ehdr,
3071   mips_elf64_write_relocs,
3072   bfd_elf64_swap_symbol_in,
3073   bfd_elf64_swap_symbol_out,
3074   mips_elf64_slurp_reloc_table,
3075   bfd_elf64_slurp_symbol_table,
3076   bfd_elf64_swap_dyn_in,
3077   bfd_elf64_swap_dyn_out,
3078   mips_elf64_be_swap_reloc_in,
3079   mips_elf64_be_swap_reloc_out,
3080   mips_elf64_be_swap_reloca_in,
3081   mips_elf64_be_swap_reloca_out
3082 };
3083 
3084 #define ELF_ARCH			bfd_arch_mips
3085 #define ELF_MACHINE_CODE		EM_MIPS
3086 
3087 #define elf_backend_collect		TRUE
3088 #define elf_backend_type_change_ok	TRUE
3089 #define elf_backend_can_gc_sections	TRUE
3090 #define elf_info_to_howto		mips_elf64_info_to_howto_rela
3091 #define elf_info_to_howto_rel		mips_elf64_info_to_howto_rel
3092 #define elf_backend_object_p		mips_elf64_object_p
3093 #define elf_backend_symbol_processing	_bfd_mips_elf_symbol_processing
3094 #define elf_backend_section_processing	_bfd_mips_elf_section_processing
3095 #define elf_backend_section_from_shdr	_bfd_mips_elf_section_from_shdr
3096 #define elf_backend_fake_sections	_bfd_mips_elf_fake_sections
3097 #define elf_backend_section_from_bfd_section \
3098 				_bfd_mips_elf_section_from_bfd_section
3099 #define elf_backend_add_symbol_hook	_bfd_mips_elf_add_symbol_hook
3100 #define elf_backend_link_output_symbol_hook \
3101 				_bfd_mips_elf_link_output_symbol_hook
3102 #define elf_backend_create_dynamic_sections \
3103 				_bfd_mips_elf_create_dynamic_sections
3104 #define elf_backend_check_relocs	_bfd_mips_elf_check_relocs
3105 #define elf_backend_merge_symbol_attribute \
3106 				_bfd_mips_elf_merge_symbol_attribute
3107 #define elf_backend_adjust_dynamic_symbol \
3108 				_bfd_mips_elf_adjust_dynamic_symbol
3109 #define elf_backend_always_size_sections \
3110 				_bfd_mips_elf_always_size_sections
3111 #define elf_backend_size_dynamic_sections \
3112 				_bfd_mips_elf_size_dynamic_sections
3113 #define elf_backend_init_index_section	_bfd_elf_init_1_index_section
3114 #define elf_backend_relocate_section    _bfd_mips_elf_relocate_section
3115 #define elf_backend_finish_dynamic_symbol \
3116 				_bfd_mips_elf_finish_dynamic_symbol
3117 #define elf_backend_finish_dynamic_sections \
3118 				_bfd_mips_elf_finish_dynamic_sections
3119 #define elf_backend_final_write_processing \
3120 				_bfd_mips_elf_final_write_processing
3121 #define elf_backend_additional_program_headers \
3122 				_bfd_mips_elf_additional_program_headers
3123 #define elf_backend_modify_segment_map	_bfd_mips_elf_modify_segment_map
3124 #define elf_backend_gc_mark_hook	_bfd_mips_elf_gc_mark_hook
3125 #define elf_backend_gc_sweep_hook	_bfd_mips_elf_gc_sweep_hook
3126 #define elf_backend_copy_indirect_symbol \
3127 					_bfd_mips_elf_copy_indirect_symbol
3128 #define elf_backend_hide_symbol		_bfd_mips_elf_hide_symbol
3129 #define elf_backend_ignore_discarded_relocs \
3130 					_bfd_mips_elf_ignore_discarded_relocs
3131 #define elf_backend_mips_irix_compat	elf64_mips_irix_compat
3132 #define elf_backend_mips_rtype_to_howto	mips_elf64_rtype_to_howto
3133 #define elf_backend_ecoff_debug_swap	&mips_elf64_ecoff_debug_swap
3134 #define elf_backend_size_info		mips_elf64_size_info
3135 
3136 #define elf_backend_grok_prstatus	elf64_mips_grok_prstatus
3137 #define elf_backend_grok_psinfo		elf64_mips_grok_psinfo
3138 
3139 #define elf_backend_got_header_size	(4 * MIPS_RESERVED_GOTNO)
3140 
3141 /* MIPS ELF64 can use a mixture of REL and RELA, but some Relocations
3142    work better/work only in RELA, so we default to this.  */
3143 #define elf_backend_may_use_rel_p	1
3144 #define elf_backend_may_use_rela_p	1
3145 #define elf_backend_default_use_rela_p	1
3146 
3147 #define elf_backend_write_section	_bfd_mips_elf_write_section
3148 
3149 /* We don't set bfd_elf64_bfd_is_local_label_name because the 32-bit
3150    MIPS-specific function only applies to IRIX5, which had no 64-bit
3151    ABI.  */
3152 #define bfd_elf64_find_nearest_line	_bfd_mips_elf_find_nearest_line
3153 #define bfd_elf64_find_inliner_info	_bfd_mips_elf_find_inliner_info
3154 #define bfd_elf64_new_section_hook	_bfd_mips_elf_new_section_hook
3155 #define bfd_elf64_set_section_contents	_bfd_mips_elf_set_section_contents
3156 #define bfd_elf64_bfd_get_relocated_section_contents \
3157 				_bfd_elf_mips_get_relocated_section_contents
3158 #define bfd_elf64_bfd_link_hash_table_create \
3159 				_bfd_mips_elf_link_hash_table_create
3160 #define bfd_elf64_bfd_final_link	_bfd_mips_elf_final_link
3161 #define bfd_elf64_bfd_merge_private_bfd_data \
3162 				_bfd_mips_elf_merge_private_bfd_data
3163 #define bfd_elf64_bfd_set_private_flags	_bfd_mips_elf_set_private_flags
3164 #define bfd_elf64_bfd_print_private_bfd_data \
3165 				_bfd_mips_elf_print_private_bfd_data
3166 
3167 #define bfd_elf64_get_reloc_upper_bound mips_elf64_get_reloc_upper_bound
3168 #define bfd_elf64_canonicalize_reloc mips_elf64_canonicalize_reloc
3169 #define bfd_elf64_get_dynamic_reloc_upper_bound mips_elf64_get_dynamic_reloc_upper_bound
3170 #define bfd_elf64_canonicalize_dynamic_reloc mips_elf64_canonicalize_dynamic_reloc
3171 #define bfd_elf64_bfd_relax_section     _bfd_mips_relax_section
3172 
3173 /* MIPS ELF64 archive functions.  */
3174 #define bfd_elf64_archive_functions
3175 extern bfd_boolean bfd_elf64_archive_slurp_armap
3176   (bfd *);
3177 extern bfd_boolean bfd_elf64_archive_write_armap
3178   (bfd *, unsigned int, struct orl *, unsigned int, int);
3179 #define bfd_elf64_archive_slurp_extended_name_table \
3180 			_bfd_archive_coff_slurp_extended_name_table
3181 #define bfd_elf64_archive_construct_extended_name_table \
3182 			_bfd_archive_coff_construct_extended_name_table
3183 #define bfd_elf64_archive_truncate_arname \
3184 			_bfd_archive_coff_truncate_arname
3185 #define bfd_elf64_archive_read_ar_hdr	_bfd_archive_coff_read_ar_hdr
3186 #define bfd_elf64_archive_openr_next_archived_file \
3187 			_bfd_archive_coff_openr_next_archived_file
3188 #define bfd_elf64_archive_get_elt_at_index \
3189 			_bfd_archive_coff_get_elt_at_index
3190 #define bfd_elf64_archive_generic_stat_arch_elt \
3191 			_bfd_archive_coff_generic_stat_arch_elt
3192 #define bfd_elf64_archive_update_armap_timestamp \
3193 			_bfd_archive_coff_update_armap_timestamp
3194 
3195 /* The SGI style (n)64 NewABI.  */
3196 #define TARGET_LITTLE_SYM		bfd_elf64_littlemips_vec
3197 #define TARGET_LITTLE_NAME		"elf64-littlemips"
3198 #define TARGET_BIG_SYM			bfd_elf64_bigmips_vec
3199 #define TARGET_BIG_NAME			"elf64-bigmips"
3200 
3201 #define ELF_MAXPAGESIZE			0x10000
3202 #define ELF_COMMONPAGESIZE		0x1000
3203 
3204 #include "elf64-target.h"
3205 
3206 /* The SYSV-style 'traditional' (n)64 NewABI.  */
3207 #undef TARGET_LITTLE_SYM
3208 #undef TARGET_LITTLE_NAME
3209 #undef TARGET_BIG_SYM
3210 #undef TARGET_BIG_NAME
3211 
3212 #undef ELF_MAXPAGESIZE
3213 #undef ELF_COMMONPAGESIZE
3214 
3215 #define TARGET_LITTLE_SYM		bfd_elf64_tradlittlemips_vec
3216 #define TARGET_LITTLE_NAME		"elf64-tradlittlemips"
3217 #define TARGET_BIG_SYM			bfd_elf64_tradbigmips_vec
3218 #define TARGET_BIG_NAME			"elf64-tradbigmips"
3219 
3220 #define ELF_MAXPAGESIZE			0x10000
3221 #define ELF_COMMONPAGESIZE		0x1000
3222 #define elf64_bed			elf64_tradbed
3223 
3224 /* Include the target file again for this target.  */
3225 #include "elf64-target.h"
3226