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