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