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