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