1 /* MIPS-specific support for 32-bit ELF
2 Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002
3 Free Software Foundation, Inc.
5 Most of the information added by Ian Lance Taylor, Cygnus Support,
7 N32/64 ABI support added by Mark Mitchell, CodeSourcery, LLC.
8 <mark@codesourcery.com>
9 Traditional MIPS targets support added by Koundinya.K, Dansk Data
10 Elektronik & Operations Research Group. <kk@ddeorg.soft.net>
12 This file is part of BFD, the Binary File Descriptor library.
14 This program is free software; you can redistribute it and/or modify
15 it under the terms of the GNU General Public License as published by
16 the Free Software Foundation; either version 2 of the License, or
17 (at your option) any later version.
19 This program is distributed in the hope that it will be useful,
20 but WITHOUT ANY WARRANTY; without even the implied warranty of
21 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22 GNU General Public License for more details.
24 You should have received a copy of the GNU General Public License
25 along with this program; if not, write to the Free Software
26 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
28 /* This file handles MIPS ELF targets. SGI Irix 5 uses a slightly
29 different MIPS ELF from other targets. This matters when linking.
30 This file supports both, switching at runtime. */
38 #include "elfxx-mips.h"
41 /* Get the ECOFF swapping routines. */
43 #include "coff/symconst.h"
44 #include "coff/internal.h"
45 #include "coff/ecoff.h"
46 #include "coff/mips.h"
47 #define ECOFF_SIGNED_32
48 #include "ecoffswap.h"
50 static bfd_reloc_status_type mips_elf_hi16_reloc
51 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
52 static bfd_reloc_status_type mips_elf_lo16_reloc
53 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
54 static bfd_reloc_status_type mips_elf_got16_reloc
55 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
56 static bfd_reloc_status_type mips_elf_gprel32_reloc
57 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
58 static bfd_reloc_status_type mips32_64bit_reloc
59 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
60 static reloc_howto_type
*bfd_elf32_bfd_reloc_type_lookup
61 PARAMS ((bfd
*, bfd_reloc_code_real_type
));
62 static reloc_howto_type
*mips_elf32_rtype_to_howto
63 PARAMS ((unsigned int, boolean
));
64 static void mips_info_to_howto_rel
65 PARAMS ((bfd
*, arelent
*, Elf32_Internal_Rel
*));
66 static void mips_info_to_howto_rela
67 PARAMS ((bfd
*, arelent
*, Elf32_Internal_Rela
*));
68 static boolean mips_elf_sym_is_global
PARAMS ((bfd
*, asymbol
*));
69 static boolean mips_elf32_object_p
PARAMS ((bfd
*));
70 static boolean mips_elf_is_local_label_name
71 PARAMS ((bfd
*, const char *));
72 static bfd_reloc_status_type mips16_jump_reloc
73 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
74 static bfd_reloc_status_type mips16_gprel_reloc
75 PARAMS ((bfd
*, arelent
*, asymbol
*, PTR
, asection
*, bfd
*, char **));
76 static bfd_reloc_status_type mips_elf_final_gp
77 PARAMS ((bfd
*, asymbol
*, boolean
, char **, bfd_vma
*));
78 static boolean mips_elf_assign_gp
PARAMS ((bfd
*, bfd_vma
*));
79 static boolean elf32_mips_grok_prstatus
80 PARAMS ((bfd
*, Elf_Internal_Note
*));
81 static boolean elf32_mips_grok_psinfo
82 PARAMS ((bfd
*, Elf_Internal_Note
*));
83 static boolean elf32_mips_discard_info
84 PARAMS ((bfd
*, struct elf_reloc_cookie
*, struct bfd_link_info
*));
85 static boolean elf32_mips_ignore_discarded_relocs
86 PARAMS ((asection
*));
87 static boolean elf32_mips_write_section
88 PARAMS ((bfd
*, asection
*, bfd_byte
*));
89 static irix_compat_t elf32_mips_irix_compat
92 extern const bfd_target bfd_elf32_tradbigmips_vec
;
93 extern const bfd_target bfd_elf32_tradlittlemips_vec
;
95 /* Nonzero if ABFD is using the N32 ABI. */
97 #define ABI_N32_P(abfd) \
98 ((elf_elfheader (abfd)->e_flags & EF_MIPS_ABI2) != 0)
100 /* Nonzero if ABFD is using the 64-bit ABI. */
101 #define ABI_64_P(abfd) \
102 ((elf_elfheader (abfd)->e_ident[EI_CLASS] == ELFCLASS64) != 0)
104 #define NEWABI_P(abfd) (ABI_N32_P (abfd) || ABI_64_P (abfd))
106 /* Whether we are trying to be compatible with IRIX at all. */
107 #define SGI_COMPAT(abfd) \
108 (elf32_mips_irix_compat (abfd) != ict_none)
110 /* The size of an external REL relocation. */
111 #define MIPS_ELF_REL_SIZE(abfd) \
112 (get_elf_backend_data (abfd)->s->sizeof_rel)
114 /* The number of local .got entries we reserve. */
115 #define MIPS_RESERVED_GOTNO (2)
118 /* We no longer try to identify particular sections for the .dynsym
119 section. When we do, we wind up crashing if there are other random
120 sections with relocations. */
122 /* Names of sections which appear in the .dynsym section in an Irix 5
125 static const char * const mips_elf_dynsym_sec_names
[] =
138 #define SIZEOF_MIPS_DYNSYM_SECNAMES \
139 (sizeof mips_elf_dynsym_sec_names / sizeof mips_elf_dynsym_sec_names[0])
141 /* The number of entries in mips_elf_dynsym_sec_names which go in the
144 #define MIPS_TEXT_DYNSYM_SECNO (3)
148 /* The names of the runtime procedure table symbols used on Irix 5. */
150 static const char * const mips_elf_dynsym_rtproc_names
[] =
153 "_procedure_string_table",
154 "_procedure_table_size",
158 /* These structures are used to generate the .compact_rel section on
163 unsigned long id1
; /* Always one? */
164 unsigned long num
; /* Number of compact relocation entries. */
165 unsigned long id2
; /* Always two? */
166 unsigned long offset
; /* The file offset of the first relocation. */
167 unsigned long reserved0
; /* Zero? */
168 unsigned long reserved1
; /* Zero? */
177 bfd_byte reserved0
[4];
178 bfd_byte reserved1
[4];
179 } Elf32_External_compact_rel
;
183 unsigned int ctype
: 1; /* 1: long 0: short format. See below. */
184 unsigned int rtype
: 4; /* Relocation types. See below. */
185 unsigned int dist2to
: 8;
186 unsigned int relvaddr
: 19; /* (VADDR - vaddr of the previous entry)/ 4 */
187 unsigned long konst
; /* KONST field. See below. */
188 unsigned long vaddr
; /* VADDR to be relocated. */
193 unsigned int ctype
: 1; /* 1: long 0: short format. See below. */
194 unsigned int rtype
: 4; /* Relocation types. See below. */
195 unsigned int dist2to
: 8;
196 unsigned int relvaddr
: 19; /* (VADDR - vaddr of the previous entry)/ 4 */
197 unsigned long konst
; /* KONST field. See below. */
205 } Elf32_External_crinfo
;
211 } Elf32_External_crinfo2
;
213 /* These are the constants used to swap the bitfields in a crinfo. */
215 #define CRINFO_CTYPE (0x1)
216 #define CRINFO_CTYPE_SH (31)
217 #define CRINFO_RTYPE (0xf)
218 #define CRINFO_RTYPE_SH (27)
219 #define CRINFO_DIST2TO (0xff)
220 #define CRINFO_DIST2TO_SH (19)
221 #define CRINFO_RELVADDR (0x7ffff)
222 #define CRINFO_RELVADDR_SH (0)
224 /* A compact relocation info has long (3 words) or short (2 words)
225 formats. A short format doesn't have VADDR field and relvaddr
226 fields contains ((VADDR - vaddr of the previous entry) >> 2). */
227 #define CRF_MIPS_LONG 1
228 #define CRF_MIPS_SHORT 0
230 /* There are 4 types of compact relocation at least. The value KONST
231 has different meaning for each type:
234 CT_MIPS_REL32 Address in data
235 CT_MIPS_WORD Address in word (XXX)
236 CT_MIPS_GPHI_LO GP - vaddr
237 CT_MIPS_JMPAD Address to jump
240 #define CRT_MIPS_REL32 0xa
241 #define CRT_MIPS_WORD 0xb
242 #define CRT_MIPS_GPHI_LO 0xc
243 #define CRT_MIPS_JMPAD 0xd
245 #define mips_elf_set_cr_format(x,format) ((x).ctype = (format))
246 #define mips_elf_set_cr_type(x,type) ((x).rtype = (type))
247 #define mips_elf_set_cr_dist2to(x,v) ((x).dist2to = (v))
248 #define mips_elf_set_cr_relvaddr(x,d) ((x).relvaddr = (d)<<2)
250 /* In case we're on a 32-bit machine, construct a 64-bit "-1" value
251 from smaller values. Start with zero, widen, *then* decrement. */
252 #define MINUS_ONE (((bfd_vma)0) - 1)
254 /* The relocation table used for SHT_REL sections. */
256 static reloc_howto_type elf_mips_howto_table_rel
[] =
259 HOWTO (R_MIPS_NONE
, /* type */
261 0, /* size (0 = byte, 1 = short, 2 = long) */
263 false, /* pc_relative */
265 complain_overflow_dont
, /* complain_on_overflow */
266 bfd_elf_generic_reloc
, /* special_function */
267 "R_MIPS_NONE", /* name */
268 false, /* partial_inplace */
271 false), /* pcrel_offset */
273 /* 16 bit relocation. */
274 HOWTO (R_MIPS_16
, /* type */
276 2, /* size (0 = byte, 1 = short, 2 = long) */
278 false, /* pc_relative */
280 complain_overflow_signed
, /* complain_on_overflow */
281 bfd_elf_generic_reloc
, /* special_function */
282 "R_MIPS_16", /* name */
283 true, /* partial_inplace */
284 0x0000ffff, /* src_mask */
285 0x0000ffff, /* dst_mask */
286 false), /* pcrel_offset */
288 /* 32 bit relocation. */
289 HOWTO (R_MIPS_32
, /* type */
291 2, /* size (0 = byte, 1 = short, 2 = long) */
293 false, /* pc_relative */
295 complain_overflow_dont
, /* complain_on_overflow */
296 bfd_elf_generic_reloc
, /* special_function */
297 "R_MIPS_32", /* name */
298 true, /* partial_inplace */
299 0xffffffff, /* src_mask */
300 0xffffffff, /* dst_mask */
301 false), /* pcrel_offset */
303 /* 32 bit symbol relative relocation. */
304 HOWTO (R_MIPS_REL32
, /* type */
306 2, /* size (0 = byte, 1 = short, 2 = long) */
308 false, /* pc_relative */
310 complain_overflow_dont
, /* complain_on_overflow */
311 bfd_elf_generic_reloc
, /* special_function */
312 "R_MIPS_REL32", /* name */
313 true, /* partial_inplace */
314 0xffffffff, /* src_mask */
315 0xffffffff, /* dst_mask */
316 false), /* pcrel_offset */
318 /* 26 bit jump address. */
319 HOWTO (R_MIPS_26
, /* type */
321 2, /* size (0 = byte, 1 = short, 2 = long) */
323 false, /* pc_relative */
325 complain_overflow_dont
, /* complain_on_overflow */
326 /* This needs complex overflow
327 detection, because the upper four
328 bits must match the PC + 4. */
329 bfd_elf_generic_reloc
, /* special_function */
330 "R_MIPS_26", /* name */
331 true, /* partial_inplace */
332 0x03ffffff, /* src_mask */
333 0x03ffffff, /* dst_mask */
334 false), /* pcrel_offset */
336 /* High 16 bits of symbol value. */
337 HOWTO (R_MIPS_HI16
, /* type */
339 2, /* size (0 = byte, 1 = short, 2 = long) */
341 false, /* pc_relative */
343 complain_overflow_dont
, /* complain_on_overflow */
344 mips_elf_hi16_reloc
, /* special_function */
345 "R_MIPS_HI16", /* name */
346 true, /* partial_inplace */
347 0x0000ffff, /* src_mask */
348 0x0000ffff, /* dst_mask */
349 false), /* pcrel_offset */
351 /* Low 16 bits of symbol value. */
352 HOWTO (R_MIPS_LO16
, /* type */
354 2, /* size (0 = byte, 1 = short, 2 = long) */
356 false, /* pc_relative */
358 complain_overflow_dont
, /* complain_on_overflow */
359 mips_elf_lo16_reloc
, /* special_function */
360 "R_MIPS_LO16", /* name */
361 true, /* partial_inplace */
362 0x0000ffff, /* src_mask */
363 0x0000ffff, /* dst_mask */
364 false), /* pcrel_offset */
366 /* GP relative reference. */
367 HOWTO (R_MIPS_GPREL16
, /* type */
369 2, /* size (0 = byte, 1 = short, 2 = long) */
371 false, /* pc_relative */
373 complain_overflow_signed
, /* complain_on_overflow */
374 _bfd_mips_elf32_gprel16_reloc
, /* special_function */
375 "R_MIPS_GPREL16", /* name */
376 true, /* partial_inplace */
377 0x0000ffff, /* src_mask */
378 0x0000ffff, /* dst_mask */
379 false), /* pcrel_offset */
381 /* Reference to literal section. */
382 HOWTO (R_MIPS_LITERAL
, /* type */
384 2, /* size (0 = byte, 1 = short, 2 = long) */
386 false, /* pc_relative */
388 complain_overflow_signed
, /* complain_on_overflow */
389 _bfd_mips_elf32_gprel16_reloc
, /* special_function */
390 "R_MIPS_LITERAL", /* name */
391 true, /* partial_inplace */
392 0x0000ffff, /* src_mask */
393 0x0000ffff, /* dst_mask */
394 false), /* pcrel_offset */
396 /* Reference to global offset table. */
397 HOWTO (R_MIPS_GOT16
, /* type */
399 2, /* size (0 = byte, 1 = short, 2 = long) */
401 false, /* pc_relative */
403 complain_overflow_signed
, /* complain_on_overflow */
404 mips_elf_got16_reloc
, /* special_function */
405 "R_MIPS_GOT16", /* name */
406 true, /* partial_inplace */
407 0x0000ffff, /* src_mask */
408 0x0000ffff, /* dst_mask */
409 false), /* pcrel_offset */
411 /* 16 bit PC relative reference. */
412 HOWTO (R_MIPS_PC16
, /* type */
414 2, /* size (0 = byte, 1 = short, 2 = long) */
416 true, /* pc_relative */
418 complain_overflow_signed
, /* complain_on_overflow */
419 bfd_elf_generic_reloc
, /* special_function */
420 "R_MIPS_PC16", /* name */
421 true, /* partial_inplace */
422 0x0000ffff, /* src_mask */
423 0x0000ffff, /* dst_mask */
424 true), /* pcrel_offset */
426 /* 16 bit call through global offset table. */
427 HOWTO (R_MIPS_CALL16
, /* type */
429 2, /* size (0 = byte, 1 = short, 2 = long) */
431 false, /* pc_relative */
433 complain_overflow_signed
, /* complain_on_overflow */
434 bfd_elf_generic_reloc
, /* special_function */
435 "R_MIPS_CALL16", /* name */
436 true, /* partial_inplace */
437 0x0000ffff, /* src_mask */
438 0x0000ffff, /* dst_mask */
439 false), /* pcrel_offset */
441 /* 32 bit GP relative reference. */
442 HOWTO (R_MIPS_GPREL32
, /* type */
444 2, /* size (0 = byte, 1 = short, 2 = long) */
446 false, /* pc_relative */
448 complain_overflow_dont
, /* complain_on_overflow */
449 mips_elf_gprel32_reloc
, /* special_function */
450 "R_MIPS_GPREL32", /* name */
451 true, /* partial_inplace */
452 0xffffffff, /* src_mask */
453 0xffffffff, /* dst_mask */
454 false), /* pcrel_offset */
456 /* The remaining relocs are defined on Irix 5, although they are
457 not defined by the ABI. */
462 /* A 5 bit shift field. */
463 HOWTO (R_MIPS_SHIFT5
, /* type */
465 2, /* size (0 = byte, 1 = short, 2 = long) */
467 false, /* pc_relative */
469 complain_overflow_bitfield
, /* complain_on_overflow */
470 bfd_elf_generic_reloc
, /* special_function */
471 "R_MIPS_SHIFT5", /* name */
472 true, /* partial_inplace */
473 0x000007c0, /* src_mask */
474 0x000007c0, /* dst_mask */
475 false), /* pcrel_offset */
477 /* A 6 bit shift field. */
478 /* FIXME: This is not handled correctly; a special function is
479 needed to put the most significant bit in the right place. */
480 HOWTO (R_MIPS_SHIFT6
, /* type */
482 2, /* size (0 = byte, 1 = short, 2 = long) */
484 false, /* pc_relative */
486 complain_overflow_bitfield
, /* complain_on_overflow */
487 bfd_elf_generic_reloc
, /* special_function */
488 "R_MIPS_SHIFT6", /* name */
489 true, /* partial_inplace */
490 0x000007c4, /* src_mask */
491 0x000007c4, /* dst_mask */
492 false), /* pcrel_offset */
494 /* A 64 bit relocation. */
495 HOWTO (R_MIPS_64
, /* type */
497 4, /* size (0 = byte, 1 = short, 2 = long) */
499 false, /* pc_relative */
501 complain_overflow_dont
, /* complain_on_overflow */
502 mips32_64bit_reloc
, /* special_function */
503 "R_MIPS_64", /* name */
504 true, /* partial_inplace */
505 MINUS_ONE
, /* src_mask */
506 MINUS_ONE
, /* dst_mask */
507 false), /* pcrel_offset */
509 /* Displacement in the global offset table. */
510 HOWTO (R_MIPS_GOT_DISP
, /* type */
512 2, /* size (0 = byte, 1 = short, 2 = long) */
514 false, /* pc_relative */
516 complain_overflow_signed
, /* complain_on_overflow */
517 bfd_elf_generic_reloc
, /* special_function */
518 "R_MIPS_GOT_DISP", /* name */
519 true, /* partial_inplace */
520 0x0000ffff, /* src_mask */
521 0x0000ffff, /* dst_mask */
522 false), /* pcrel_offset */
524 /* Displacement to page pointer in the global offset table. */
525 HOWTO (R_MIPS_GOT_PAGE
, /* type */
527 2, /* size (0 = byte, 1 = short, 2 = long) */
529 false, /* pc_relative */
531 complain_overflow_signed
, /* complain_on_overflow */
532 bfd_elf_generic_reloc
, /* special_function */
533 "R_MIPS_GOT_PAGE", /* name */
534 true, /* partial_inplace */
535 0x0000ffff, /* src_mask */
536 0x0000ffff, /* dst_mask */
537 false), /* pcrel_offset */
539 /* Offset from page pointer in the global offset table. */
540 HOWTO (R_MIPS_GOT_OFST
, /* type */
542 2, /* size (0 = byte, 1 = short, 2 = long) */
544 false, /* pc_relative */
546 complain_overflow_signed
, /* complain_on_overflow */
547 bfd_elf_generic_reloc
, /* special_function */
548 "R_MIPS_GOT_OFST", /* name */
549 true, /* partial_inplace */
550 0x0000ffff, /* src_mask */
551 0x0000ffff, /* dst_mask */
552 false), /* pcrel_offset */
554 /* High 16 bits of displacement in global offset table. */
555 HOWTO (R_MIPS_GOT_HI16
, /* type */
557 2, /* size (0 = byte, 1 = short, 2 = long) */
559 false, /* pc_relative */
561 complain_overflow_dont
, /* complain_on_overflow */
562 bfd_elf_generic_reloc
, /* special_function */
563 "R_MIPS_GOT_HI16", /* name */
564 true, /* partial_inplace */
565 0x0000ffff, /* src_mask */
566 0x0000ffff, /* dst_mask */
567 false), /* pcrel_offset */
569 /* Low 16 bits of displacement in global offset table. */
570 HOWTO (R_MIPS_GOT_LO16
, /* type */
572 2, /* size (0 = byte, 1 = short, 2 = long) */
574 false, /* pc_relative */
576 complain_overflow_dont
, /* complain_on_overflow */
577 bfd_elf_generic_reloc
, /* special_function */
578 "R_MIPS_GOT_LO16", /* name */
579 true, /* partial_inplace */
580 0x0000ffff, /* src_mask */
581 0x0000ffff, /* dst_mask */
582 false), /* pcrel_offset */
584 /* 64 bit subtraction. Used in the N32 ABI. */
585 HOWTO (R_MIPS_SUB
, /* type */
587 4, /* size (0 = byte, 1 = short, 2 = long) */
589 false, /* pc_relative */
591 complain_overflow_dont
, /* complain_on_overflow */
592 bfd_elf_generic_reloc
, /* special_function */
593 "R_MIPS_SUB", /* name */
594 true, /* partial_inplace */
595 MINUS_ONE
, /* src_mask */
596 MINUS_ONE
, /* dst_mask */
597 false), /* pcrel_offset */
599 /* Used to cause the linker to insert and delete instructions? */
600 EMPTY_HOWTO (R_MIPS_INSERT_A
),
601 EMPTY_HOWTO (R_MIPS_INSERT_B
),
602 EMPTY_HOWTO (R_MIPS_DELETE
),
604 /* Get the higher value of a 64 bit addend. */
605 HOWTO (R_MIPS_HIGHER
, /* type */
607 2, /* size (0 = byte, 1 = short, 2 = long) */
609 false, /* pc_relative */
611 complain_overflow_dont
, /* complain_on_overflow */
612 bfd_elf_generic_reloc
, /* special_function */
613 "R_MIPS_HIGHER", /* name */
614 true, /* partial_inplace */
615 0x0000ffff, /* src_mask */
616 0x0000ffff, /* dst_mask */
617 false), /* pcrel_offset */
619 /* Get the highest value of a 64 bit addend. */
620 HOWTO (R_MIPS_HIGHEST
, /* type */
622 2, /* size (0 = byte, 1 = short, 2 = long) */
624 false, /* pc_relative */
626 complain_overflow_dont
, /* complain_on_overflow */
627 bfd_elf_generic_reloc
, /* special_function */
628 "R_MIPS_HIGHEST", /* name */
629 true, /* partial_inplace */
630 0x0000ffff, /* src_mask */
631 0x0000ffff, /* dst_mask */
632 false), /* pcrel_offset */
634 /* High 16 bits of displacement in global offset table. */
635 HOWTO (R_MIPS_CALL_HI16
, /* type */
637 2, /* size (0 = byte, 1 = short, 2 = long) */
639 false, /* pc_relative */
641 complain_overflow_dont
, /* complain_on_overflow */
642 bfd_elf_generic_reloc
, /* special_function */
643 "R_MIPS_CALL_HI16", /* name */
644 true, /* partial_inplace */
645 0x0000ffff, /* src_mask */
646 0x0000ffff, /* dst_mask */
647 false), /* pcrel_offset */
649 /* Low 16 bits of displacement in global offset table. */
650 HOWTO (R_MIPS_CALL_LO16
, /* type */
652 2, /* size (0 = byte, 1 = short, 2 = long) */
654 false, /* pc_relative */
656 complain_overflow_dont
, /* complain_on_overflow */
657 bfd_elf_generic_reloc
, /* special_function */
658 "R_MIPS_CALL_LO16", /* name */
659 true, /* partial_inplace */
660 0x0000ffff, /* src_mask */
661 0x0000ffff, /* dst_mask */
662 false), /* pcrel_offset */
664 /* Section displacement. */
665 HOWTO (R_MIPS_SCN_DISP
, /* type */
667 2, /* size (0 = byte, 1 = short, 2 = long) */
669 false, /* pc_relative */
671 complain_overflow_dont
, /* complain_on_overflow */
672 bfd_elf_generic_reloc
, /* special_function */
673 "R_MIPS_SCN_DISP", /* name */
674 true, /* partial_inplace */
675 0xffffffff, /* src_mask */
676 0xffffffff, /* dst_mask */
677 false), /* pcrel_offset */
679 EMPTY_HOWTO (R_MIPS_REL16
),
680 EMPTY_HOWTO (R_MIPS_ADD_IMMEDIATE
),
681 EMPTY_HOWTO (R_MIPS_PJUMP
),
682 EMPTY_HOWTO (R_MIPS_RELGOT
),
684 /* Protected jump conversion. This is an optimization hint. No
685 relocation is required for correctness. */
686 HOWTO (R_MIPS_JALR
, /* type */
688 2, /* size (0 = byte, 1 = short, 2 = long) */
690 false, /* pc_relative */
692 complain_overflow_dont
, /* complain_on_overflow */
693 bfd_elf_generic_reloc
, /* special_function */
694 "R_MIPS_JALR", /* name */
695 false, /* partial_inplace */
696 0x00000000, /* src_mask */
697 0x00000000, /* dst_mask */
698 false), /* pcrel_offset */
701 /* The reloc used for BFD_RELOC_CTOR when doing a 64 bit link. This
702 is a hack to make the linker think that we need 64 bit values. */
703 static reloc_howto_type elf_mips_ctor64_howto
=
704 HOWTO (R_MIPS_64
, /* type */
706 4, /* size (0 = byte, 1 = short, 2 = long) */
708 false, /* pc_relative */
710 complain_overflow_signed
, /* complain_on_overflow */
711 mips32_64bit_reloc
, /* special_function */
712 "R_MIPS_64", /* name */
713 true, /* partial_inplace */
714 0xffffffff, /* src_mask */
715 0xffffffff, /* dst_mask */
716 false); /* pcrel_offset */
718 /* The reloc used for the mips16 jump instruction. */
719 static reloc_howto_type elf_mips16_jump_howto
=
720 HOWTO (R_MIPS16_26
, /* type */
722 2, /* size (0 = byte, 1 = short, 2 = long) */
724 false, /* pc_relative */
726 complain_overflow_dont
, /* complain_on_overflow */
727 /* This needs complex overflow
728 detection, because the upper four
729 bits must match the PC. */
730 mips16_jump_reloc
, /* special_function */
731 "R_MIPS16_26", /* name */
732 true, /* partial_inplace */
733 0x3ffffff, /* src_mask */
734 0x3ffffff, /* dst_mask */
735 false); /* pcrel_offset */
737 /* The reloc used for the mips16 gprel instruction. */
738 static reloc_howto_type elf_mips16_gprel_howto
=
739 HOWTO (R_MIPS16_GPREL
, /* type */
741 2, /* size (0 = byte, 1 = short, 2 = long) */
743 false, /* pc_relative */
745 complain_overflow_signed
, /* complain_on_overflow */
746 mips16_gprel_reloc
, /* special_function */
747 "R_MIPS16_GPREL", /* name */
748 true, /* partial_inplace */
749 0x07ff001f, /* src_mask */
750 0x07ff001f, /* dst_mask */
751 false); /* pcrel_offset */
753 /* GNU extensions for embedded-pic. */
754 /* High 16 bits of symbol value, pc-relative. */
755 static reloc_howto_type elf_mips_gnu_rel_hi16
=
756 HOWTO (R_MIPS_GNU_REL_HI16
, /* type */
758 2, /* size (0 = byte, 1 = short, 2 = long) */
760 true, /* pc_relative */
762 complain_overflow_dont
, /* complain_on_overflow */
763 mips_elf_hi16_reloc
, /* special_function */
764 "R_MIPS_GNU_REL_HI16", /* name */
765 true, /* partial_inplace */
766 0xffff, /* src_mask */
767 0xffff, /* dst_mask */
768 true); /* pcrel_offset */
770 /* Low 16 bits of symbol value, pc-relative. */
771 static reloc_howto_type elf_mips_gnu_rel_lo16
=
772 HOWTO (R_MIPS_GNU_REL_LO16
, /* type */
774 2, /* size (0 = byte, 1 = short, 2 = long) */
776 true, /* pc_relative */
778 complain_overflow_dont
, /* complain_on_overflow */
779 mips_elf_lo16_reloc
, /* special_function */
780 "R_MIPS_GNU_REL_LO16", /* name */
781 true, /* partial_inplace */
782 0xffff, /* src_mask */
783 0xffff, /* dst_mask */
784 true); /* pcrel_offset */
786 /* 16 bit offset for pc-relative branches. */
787 static reloc_howto_type elf_mips_gnu_rel16_s2
=
788 HOWTO (R_MIPS_GNU_REL16_S2
, /* type */
790 2, /* size (0 = byte, 1 = short, 2 = long) */
792 true, /* pc_relative */
794 complain_overflow_signed
, /* complain_on_overflow */
795 bfd_elf_generic_reloc
, /* special_function */
796 "R_MIPS_GNU_REL16_S2", /* name */
797 true, /* partial_inplace */
798 0xffff, /* src_mask */
799 0xffff, /* dst_mask */
800 true); /* pcrel_offset */
802 /* 64 bit pc-relative. */
803 static reloc_howto_type elf_mips_gnu_pcrel64
=
804 HOWTO (R_MIPS_PC64
, /* type */
806 4, /* size (0 = byte, 1 = short, 2 = long) */
808 true, /* pc_relative */
810 complain_overflow_signed
, /* complain_on_overflow */
811 bfd_elf_generic_reloc
, /* special_function */
812 "R_MIPS_PC64", /* name */
813 true, /* partial_inplace */
814 MINUS_ONE
, /* src_mask */
815 MINUS_ONE
, /* dst_mask */
816 true); /* pcrel_offset */
818 /* 32 bit pc-relative. */
819 static reloc_howto_type elf_mips_gnu_pcrel32
=
820 HOWTO (R_MIPS_PC32
, /* type */
822 2, /* size (0 = byte, 1 = short, 2 = long) */
824 true, /* pc_relative */
826 complain_overflow_signed
, /* complain_on_overflow */
827 bfd_elf_generic_reloc
, /* special_function */
828 "R_MIPS_PC32", /* name */
829 true, /* partial_inplace */
830 0xffffffff, /* src_mask */
831 0xffffffff, /* dst_mask */
832 true); /* pcrel_offset */
834 /* GNU extension to record C++ vtable hierarchy */
835 static reloc_howto_type elf_mips_gnu_vtinherit_howto
=
836 HOWTO (R_MIPS_GNU_VTINHERIT
, /* type */
838 2, /* size (0 = byte, 1 = short, 2 = long) */
840 false, /* pc_relative */
842 complain_overflow_dont
, /* complain_on_overflow */
843 NULL
, /* special_function */
844 "R_MIPS_GNU_VTINHERIT", /* name */
845 false, /* partial_inplace */
848 false); /* pcrel_offset */
850 /* GNU extension to record C++ vtable member usage */
851 static reloc_howto_type elf_mips_gnu_vtentry_howto
=
852 HOWTO (R_MIPS_GNU_VTENTRY
, /* type */
854 2, /* size (0 = byte, 1 = short, 2 = long) */
856 false, /* pc_relative */
858 complain_overflow_dont
, /* complain_on_overflow */
859 _bfd_elf_rel_vtable_reloc_fn
, /* special_function */
860 "R_MIPS_GNU_VTENTRY", /* name */
861 false, /* partial_inplace */
864 false); /* pcrel_offset */
866 /* Do a R_MIPS_HI16 relocation. This has to be done in combination
867 with a R_MIPS_LO16 reloc, because there is a carry from the LO16 to
868 the HI16. Here we just save the information we need; we do the
869 actual relocation when we see the LO16.
871 MIPS ELF requires that the LO16 immediately follow the HI16. As a
872 GNU extension, for non-pc-relative relocations, we permit an
873 arbitrary number of HI16 relocs to be associated with a single LO16
874 reloc. This extension permits gcc to output the HI and LO relocs
877 This cannot be done for PC-relative relocations because both the HI16
878 and LO16 parts of the relocations must be done relative to the LO16
879 part, and there can be carry to or borrow from the HI16 part. */
883 struct mips_hi16
*next
;
888 /* FIXME: This should not be a static variable. */
890 static struct mips_hi16
*mips_hi16_list
;
892 static bfd_reloc_status_type
893 mips_elf_hi16_reloc (abfd
, reloc_entry
, symbol
, data
, input_section
,
894 output_bfd
, error_message
)
895 bfd
*abfd ATTRIBUTE_UNUSED
;
896 arelent
*reloc_entry
;
899 asection
*input_section
;
901 char **error_message
;
903 bfd_reloc_status_type ret
;
907 /* If we're relocating, and this an external symbol, we don't want
908 to change anything. */
909 if (output_bfd
!= (bfd
*) NULL
910 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
911 && reloc_entry
->addend
== 0)
913 reloc_entry
->address
+= input_section
->output_offset
;
919 if (strcmp (bfd_asymbol_name (symbol
), "_gp_disp") == 0)
921 boolean relocateable
;
924 if (ret
== bfd_reloc_undefined
)
927 if (output_bfd
!= NULL
)
931 relocateable
= false;
932 output_bfd
= symbol
->section
->output_section
->owner
;
935 ret
= mips_elf_final_gp (output_bfd
, symbol
, relocateable
,
937 if (ret
!= bfd_reloc_ok
)
940 relocation
= gp
- reloc_entry
->address
;
944 if (bfd_is_und_section (symbol
->section
)
945 && output_bfd
== (bfd
*) NULL
)
946 ret
= bfd_reloc_undefined
;
948 if (bfd_is_com_section (symbol
->section
))
951 relocation
= symbol
->value
;
954 relocation
+= symbol
->section
->output_section
->vma
;
955 relocation
+= symbol
->section
->output_offset
;
956 relocation
+= reloc_entry
->addend
;
958 if (reloc_entry
->address
> input_section
->_cooked_size
)
959 return bfd_reloc_outofrange
;
961 /* Save the information, and let LO16 do the actual relocation. */
962 n
= (struct mips_hi16
*) bfd_malloc ((bfd_size_type
) sizeof *n
);
964 return bfd_reloc_outofrange
;
965 n
->addr
= (bfd_byte
*) data
+ reloc_entry
->address
;
966 n
->addend
= relocation
;
967 n
->next
= mips_hi16_list
;
970 if (output_bfd
!= (bfd
*) NULL
)
971 reloc_entry
->address
+= input_section
->output_offset
;
976 /* Do a R_MIPS_LO16 relocation. This is a straightforward 16 bit
977 inplace relocation; this function exists in order to do the
978 R_MIPS_HI16 relocation described above. */
980 static bfd_reloc_status_type
981 mips_elf_lo16_reloc (abfd
, reloc_entry
, symbol
, data
, input_section
,
982 output_bfd
, error_message
)
984 arelent
*reloc_entry
;
987 asection
*input_section
;
989 char **error_message
;
991 arelent gp_disp_relent
;
993 if (mips_hi16_list
!= NULL
)
1002 unsigned long vallo
;
1003 struct mips_hi16
*next
;
1005 /* Do the HI16 relocation. Note that we actually don't need
1006 to know anything about the LO16 itself, except where to
1007 find the low 16 bits of the addend needed by the LO16. */
1008 insn
= bfd_get_32 (abfd
, l
->addr
);
1009 vallo
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ reloc_entry
->address
);
1011 /* The low order 16 bits are always treated as a signed
1013 vallo
= ((vallo
& 0xffff) ^ 0x8000) - 0x8000;
1014 val
= ((insn
& 0xffff) << 16) + vallo
;
1017 /* If PC-relative, we need to subtract out the address of the LO
1018 half of the HI/LO. (The actual relocation is relative
1019 to that instruction.) */
1020 if (reloc_entry
->howto
->pc_relative
)
1021 val
-= reloc_entry
->address
;
1023 /* At this point, "val" has the value of the combined HI/LO
1024 pair. If the low order 16 bits (which will be used for
1025 the LO16 insn) are negative, then we will need an
1026 adjustment for the high order 16 bits. */
1028 val
= (val
>> 16) & 0xffff;
1030 insn
&= ~ (bfd_vma
) 0xffff;
1032 bfd_put_32 (abfd
, (bfd_vma
) insn
, l
->addr
);
1034 if (strcmp (bfd_asymbol_name (symbol
), "_gp_disp") == 0)
1036 gp_disp_relent
= *reloc_entry
;
1037 reloc_entry
= &gp_disp_relent
;
1038 reloc_entry
->addend
= l
->addend
;
1046 mips_hi16_list
= NULL
;
1048 else if (strcmp (bfd_asymbol_name (symbol
), "_gp_disp") == 0)
1050 bfd_reloc_status_type ret
;
1051 bfd_vma gp
, relocation
;
1053 /* FIXME: Does this case ever occur? */
1055 ret
= mips_elf_final_gp (output_bfd
, symbol
, true, error_message
, &gp
);
1056 if (ret
!= bfd_reloc_ok
)
1059 relocation
= gp
- reloc_entry
->address
;
1060 relocation
+= symbol
->section
->output_section
->vma
;
1061 relocation
+= symbol
->section
->output_offset
;
1062 relocation
+= reloc_entry
->addend
;
1064 if (reloc_entry
->address
> input_section
->_cooked_size
)
1065 return bfd_reloc_outofrange
;
1067 gp_disp_relent
= *reloc_entry
;
1068 reloc_entry
= &gp_disp_relent
;
1069 reloc_entry
->addend
= relocation
- 4;
1072 /* Now do the LO16 reloc in the usual way. */
1073 return bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
1074 input_section
, output_bfd
, error_message
);
1077 /* Do a R_MIPS_GOT16 reloc. This is a reloc against the global offset
1078 table used for PIC code. If the symbol is an external symbol, the
1079 instruction is modified to contain the offset of the appropriate
1080 entry in the global offset table. If the symbol is a section
1081 symbol, the next reloc is a R_MIPS_LO16 reloc. The two 16 bit
1082 addends are combined to form the real addend against the section
1083 symbol; the GOT16 is modified to contain the offset of an entry in
1084 the global offset table, and the LO16 is modified to offset it
1085 appropriately. Thus an offset larger than 16 bits requires a
1086 modified value in the global offset table.
1088 This implementation suffices for the assembler, but the linker does
1089 not yet know how to create global offset tables. */
1091 static bfd_reloc_status_type
1092 mips_elf_got16_reloc (abfd
, reloc_entry
, symbol
, data
, input_section
,
1093 output_bfd
, error_message
)
1095 arelent
*reloc_entry
;
1098 asection
*input_section
;
1100 char **error_message
;
1102 /* If we're relocating, and this an external symbol, we don't want
1103 to change anything. */
1104 if (output_bfd
!= (bfd
*) NULL
1105 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
1106 && reloc_entry
->addend
== 0)
1108 reloc_entry
->address
+= input_section
->output_offset
;
1109 return bfd_reloc_ok
;
1112 /* If we're relocating, and this is a local symbol, we can handle it
1114 if (output_bfd
!= (bfd
*) NULL
1115 && (symbol
->flags
& BSF_SECTION_SYM
) != 0)
1116 return mips_elf_hi16_reloc (abfd
, reloc_entry
, symbol
, data
,
1117 input_section
, output_bfd
, error_message
);
1122 /* Set the GP value for OUTPUT_BFD. Returns false if this is a
1123 dangerous relocation. */
1126 mips_elf_assign_gp (output_bfd
, pgp
)
1134 /* If we've already figured out what GP will be, just return it. */
1135 *pgp
= _bfd_get_gp_value (output_bfd
);
1139 count
= bfd_get_symcount (output_bfd
);
1140 sym
= bfd_get_outsymbols (output_bfd
);
1142 /* The linker script will have created a symbol named `_gp' with the
1143 appropriate value. */
1144 if (sym
== (asymbol
**) NULL
)
1148 for (i
= 0; i
< count
; i
++, sym
++)
1150 register const char *name
;
1152 name
= bfd_asymbol_name (*sym
);
1153 if (*name
== '_' && strcmp (name
, "_gp") == 0)
1155 *pgp
= bfd_asymbol_value (*sym
);
1156 _bfd_set_gp_value (output_bfd
, *pgp
);
1164 /* Only get the error once. */
1166 _bfd_set_gp_value (output_bfd
, *pgp
);
1173 /* We have to figure out the gp value, so that we can adjust the
1174 symbol value correctly. We look up the symbol _gp in the output
1175 BFD. If we can't find it, we're stuck. We cache it in the ELF
1176 target data. We don't need to adjust the symbol value for an
1177 external symbol if we are producing relocateable output. */
1179 static bfd_reloc_status_type
1180 mips_elf_final_gp (output_bfd
, symbol
, relocateable
, error_message
, pgp
)
1183 boolean relocateable
;
1184 char **error_message
;
1187 if (bfd_is_und_section (symbol
->section
)
1191 return bfd_reloc_undefined
;
1194 *pgp
= _bfd_get_gp_value (output_bfd
);
1197 || (symbol
->flags
& BSF_SECTION_SYM
) != 0))
1201 /* Make up a value. */
1202 *pgp
= symbol
->section
->output_section
->vma
+ 0x4000;
1203 _bfd_set_gp_value (output_bfd
, *pgp
);
1205 else if (!mips_elf_assign_gp (output_bfd
, pgp
))
1208 (char *) _("GP relative relocation when _gp not defined");
1209 return bfd_reloc_dangerous
;
1213 return bfd_reloc_ok
;
1216 /* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must
1217 become the offset from the gp register. This function also handles
1218 R_MIPS_LITERAL relocations, although those can be handled more
1219 cleverly because the entries in the .lit8 and .lit4 sections can be
1222 bfd_reloc_status_type
1223 _bfd_mips_elf32_gprel16_reloc (abfd
, reloc_entry
, symbol
, data
, input_section
,
1224 output_bfd
, error_message
)
1226 arelent
*reloc_entry
;
1229 asection
*input_section
;
1231 char **error_message
;
1233 boolean relocateable
;
1234 bfd_reloc_status_type ret
;
1237 /* If we're relocating, and this is an external symbol with no
1238 addend, we don't want to change anything. We will only have an
1239 addend if this is a newly created reloc, not read from an ELF
1241 if (output_bfd
!= (bfd
*) NULL
1242 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
1243 && reloc_entry
->addend
== 0)
1245 reloc_entry
->address
+= input_section
->output_offset
;
1246 return bfd_reloc_ok
;
1249 if (output_bfd
!= (bfd
*) NULL
)
1250 relocateable
= true;
1253 relocateable
= false;
1254 output_bfd
= symbol
->section
->output_section
->owner
;
1257 ret
= mips_elf_final_gp (output_bfd
, symbol
, relocateable
, error_message
,
1259 if (ret
!= bfd_reloc_ok
)
1262 return _bfd_mips_elf_gprel16_with_gp (abfd
, symbol
, reloc_entry
,
1263 input_section
, relocateable
,
1267 /* Do a R_MIPS_GPREL32 relocation. Is this 32 bit value the offset
1268 from the gp register? XXX */
1270 static bfd_reloc_status_type gprel32_with_gp
PARAMS ((bfd
*, asymbol
*,
1271 arelent
*, asection
*,
1272 boolean
, PTR
, bfd_vma
));
1274 static bfd_reloc_status_type
1275 mips_elf_gprel32_reloc (abfd
, reloc_entry
, symbol
, data
, input_section
,
1276 output_bfd
, error_message
)
1278 arelent
*reloc_entry
;
1281 asection
*input_section
;
1283 char **error_message
;
1285 boolean relocateable
;
1286 bfd_reloc_status_type ret
;
1289 /* If we're relocating, and this is an external symbol with no
1290 addend, we don't want to change anything. We will only have an
1291 addend if this is a newly created reloc, not read from an ELF
1293 if (output_bfd
!= (bfd
*) NULL
1294 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
1295 && reloc_entry
->addend
== 0)
1297 *error_message
= (char *)
1298 _("32bits gp relative relocation occurs for an external symbol");
1299 return bfd_reloc_outofrange
;
1302 if (output_bfd
!= (bfd
*) NULL
)
1304 relocateable
= true;
1305 gp
= _bfd_get_gp_value (output_bfd
);
1309 relocateable
= false;
1310 output_bfd
= symbol
->section
->output_section
->owner
;
1312 ret
= mips_elf_final_gp (output_bfd
, symbol
, relocateable
,
1313 error_message
, &gp
);
1314 if (ret
!= bfd_reloc_ok
)
1318 return gprel32_with_gp (abfd
, symbol
, reloc_entry
, input_section
,
1319 relocateable
, data
, gp
);
1322 static bfd_reloc_status_type
1323 gprel32_with_gp (abfd
, symbol
, reloc_entry
, input_section
, relocateable
, data
,
1327 arelent
*reloc_entry
;
1328 asection
*input_section
;
1329 boolean relocateable
;
1336 if (bfd_is_com_section (symbol
->section
))
1339 relocation
= symbol
->value
;
1341 relocation
+= symbol
->section
->output_section
->vma
;
1342 relocation
+= symbol
->section
->output_offset
;
1344 if (reloc_entry
->address
> input_section
->_cooked_size
)
1345 return bfd_reloc_outofrange
;
1347 if (reloc_entry
->howto
->src_mask
== 0)
1349 /* This case arises with the 64-bit MIPS ELF ABI. */
1353 val
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ reloc_entry
->address
);
1355 /* Set val to the offset into the section or symbol. */
1356 val
+= reloc_entry
->addend
;
1358 /* Adjust val for the final section location and GP value. If we
1359 are producing relocateable output, we don't want to do this for
1360 an external symbol. */
1362 || (symbol
->flags
& BSF_SECTION_SYM
) != 0)
1363 val
+= relocation
- gp
;
1365 bfd_put_32 (abfd
, (bfd_vma
) val
, (bfd_byte
*) data
+ reloc_entry
->address
);
1368 reloc_entry
->address
+= input_section
->output_offset
;
1370 return bfd_reloc_ok
;
1373 /* Handle a 64 bit reloc in a 32 bit MIPS ELF file. These are
1374 generated when addresses are 64 bits. The upper 32 bits are a simple
1377 static bfd_reloc_status_type
1378 mips32_64bit_reloc (abfd
, reloc_entry
, symbol
, data
, input_section
,
1379 output_bfd
, error_message
)
1381 arelent
*reloc_entry
;
1384 asection
*input_section
;
1386 char **error_message
;
1388 bfd_reloc_status_type r
;
1393 r
= bfd_elf_generic_reloc (abfd
, reloc_entry
, symbol
, data
,
1394 input_section
, output_bfd
, error_message
);
1395 if (r
!= bfd_reloc_continue
)
1398 /* Do a normal 32 bit relocation on the lower 32 bits. */
1399 reloc32
= *reloc_entry
;
1400 if (bfd_big_endian (abfd
))
1401 reloc32
.address
+= 4;
1402 reloc32
.howto
= &elf_mips_howto_table_rel
[R_MIPS_32
];
1403 r
= bfd_perform_relocation (abfd
, &reloc32
, data
, input_section
,
1404 output_bfd
, error_message
);
1406 /* Sign extend into the upper 32 bits. */
1407 val
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ reloc32
.address
);
1408 if ((val
& 0x80000000) != 0)
1412 addr
= reloc_entry
->address
;
1413 if (bfd_little_endian (abfd
))
1415 bfd_put_32 (abfd
, (bfd_vma
) val
, (bfd_byte
*) data
+ addr
);
1420 /* Handle a mips16 jump. */
1422 static bfd_reloc_status_type
1423 mips16_jump_reloc (abfd
, reloc_entry
, symbol
, data
, input_section
,
1424 output_bfd
, error_message
)
1425 bfd
*abfd ATTRIBUTE_UNUSED
;
1426 arelent
*reloc_entry
;
1428 PTR data ATTRIBUTE_UNUSED
;
1429 asection
*input_section
;
1431 char **error_message ATTRIBUTE_UNUSED
;
1433 if (output_bfd
!= (bfd
*) NULL
1434 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
1435 && reloc_entry
->addend
== 0)
1437 reloc_entry
->address
+= input_section
->output_offset
;
1438 return bfd_reloc_ok
;
1443 static boolean warned
;
1446 (*_bfd_error_handler
)
1447 (_("Linking mips16 objects into %s format is not supported"),
1448 bfd_get_target (input_section
->output_section
->owner
));
1452 return bfd_reloc_undefined
;
1455 /* Handle a mips16 GP relative reloc. */
1457 static bfd_reloc_status_type
1458 mips16_gprel_reloc (abfd
, reloc_entry
, symbol
, data
, input_section
,
1459 output_bfd
, error_message
)
1461 arelent
*reloc_entry
;
1464 asection
*input_section
;
1466 char **error_message
;
1468 boolean relocateable
;
1469 bfd_reloc_status_type ret
;
1471 unsigned short extend
, insn
;
1472 unsigned long final
;
1474 /* If we're relocating, and this is an external symbol with no
1475 addend, we don't want to change anything. We will only have an
1476 addend if this is a newly created reloc, not read from an ELF
1478 if (output_bfd
!= NULL
1479 && (symbol
->flags
& BSF_SECTION_SYM
) == 0
1480 && reloc_entry
->addend
== 0)
1482 reloc_entry
->address
+= input_section
->output_offset
;
1483 return bfd_reloc_ok
;
1486 if (output_bfd
!= NULL
)
1487 relocateable
= true;
1490 relocateable
= false;
1491 output_bfd
= symbol
->section
->output_section
->owner
;
1494 ret
= mips_elf_final_gp (output_bfd
, symbol
, relocateable
, error_message
,
1496 if (ret
!= bfd_reloc_ok
)
1499 if (reloc_entry
->address
> input_section
->_cooked_size
)
1500 return bfd_reloc_outofrange
;
1502 /* Pick up the mips16 extend instruction and the real instruction. */
1503 extend
= bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc_entry
->address
);
1504 insn
= bfd_get_16 (abfd
, (bfd_byte
*) data
+ reloc_entry
->address
+ 2);
1506 /* Stuff the current addend back as a 32 bit value, do the usual
1507 relocation, and then clean up. */
1509 (bfd_vma
) (((extend
& 0x1f) << 11)
1512 (bfd_byte
*) data
+ reloc_entry
->address
);
1514 ret
= _bfd_mips_elf_gprel16_with_gp (abfd
, symbol
, reloc_entry
,
1515 input_section
, relocateable
, data
, gp
);
1517 final
= bfd_get_32 (abfd
, (bfd_byte
*) data
+ reloc_entry
->address
);
1519 (bfd_vma
) ((extend
& 0xf800)
1520 | ((final
>> 11) & 0x1f)
1522 (bfd_byte
*) data
+ reloc_entry
->address
);
1524 (bfd_vma
) ((insn
& 0xffe0)
1526 (bfd_byte
*) data
+ reloc_entry
->address
+ 2);
1531 /* A mapping from BFD reloc types to MIPS ELF reloc types. */
1533 struct elf_reloc_map
{
1534 bfd_reloc_code_real_type bfd_reloc_val
;
1535 enum elf_mips_reloc_type elf_reloc_val
;
1538 static const struct elf_reloc_map mips_reloc_map
[] =
1540 { BFD_RELOC_NONE
, R_MIPS_NONE
, },
1541 { BFD_RELOC_16
, R_MIPS_16
},
1542 { BFD_RELOC_32
, R_MIPS_32
},
1543 { BFD_RELOC_64
, R_MIPS_64
},
1544 { BFD_RELOC_MIPS_JMP
, R_MIPS_26
},
1545 { BFD_RELOC_HI16_S
, R_MIPS_HI16
},
1546 { BFD_RELOC_LO16
, R_MIPS_LO16
},
1547 { BFD_RELOC_GPREL16
, R_MIPS_GPREL16
},
1548 { BFD_RELOC_MIPS_LITERAL
, R_MIPS_LITERAL
},
1549 { BFD_RELOC_MIPS_GOT16
, R_MIPS_GOT16
},
1550 { BFD_RELOC_16_PCREL
, R_MIPS_PC16
},
1551 { BFD_RELOC_MIPS_CALL16
, R_MIPS_CALL16
},
1552 { BFD_RELOC_GPREL32
, R_MIPS_GPREL32
},
1553 { BFD_RELOC_MIPS_GOT_HI16
, R_MIPS_GOT_HI16
},
1554 { BFD_RELOC_MIPS_GOT_LO16
, R_MIPS_GOT_LO16
},
1555 { BFD_RELOC_MIPS_CALL_HI16
, R_MIPS_CALL_HI16
},
1556 { BFD_RELOC_MIPS_CALL_LO16
, R_MIPS_CALL_LO16
},
1557 { BFD_RELOC_MIPS_SUB
, R_MIPS_SUB
},
1558 { BFD_RELOC_MIPS_GOT_PAGE
, R_MIPS_GOT_PAGE
},
1559 { BFD_RELOC_MIPS_GOT_OFST
, R_MIPS_GOT_OFST
},
1560 { BFD_RELOC_MIPS_GOT_DISP
, R_MIPS_GOT_DISP
}
1563 /* Given a BFD reloc type, return a howto structure. */
1565 static reloc_howto_type
*
1566 bfd_elf32_bfd_reloc_type_lookup (abfd
, code
)
1568 bfd_reloc_code_real_type code
;
1572 for (i
= 0; i
< sizeof (mips_reloc_map
) / sizeof (struct elf_reloc_map
); i
++)
1574 if (mips_reloc_map
[i
].bfd_reloc_val
== code
)
1575 return &elf_mips_howto_table_rel
[(int) mips_reloc_map
[i
].elf_reloc_val
];
1581 bfd_set_error (bfd_error_bad_value
);
1584 case BFD_RELOC_CTOR
:
1585 /* We need to handle BFD_RELOC_CTOR specially.
1586 Select the right relocation (R_MIPS_32 or R_MIPS_64) based on the
1587 size of addresses on this architecture. */
1588 if (bfd_arch_bits_per_address (abfd
) == 32)
1589 return &elf_mips_howto_table_rel
[(int) R_MIPS_32
];
1591 return &elf_mips_ctor64_howto
;
1593 case BFD_RELOC_MIPS16_JMP
:
1594 return &elf_mips16_jump_howto
;
1595 case BFD_RELOC_MIPS16_GPREL
:
1596 return &elf_mips16_gprel_howto
;
1597 case BFD_RELOC_VTABLE_INHERIT
:
1598 return &elf_mips_gnu_vtinherit_howto
;
1599 case BFD_RELOC_VTABLE_ENTRY
:
1600 return &elf_mips_gnu_vtentry_howto
;
1601 case BFD_RELOC_PCREL_HI16_S
:
1602 return &elf_mips_gnu_rel_hi16
;
1603 case BFD_RELOC_PCREL_LO16
:
1604 return &elf_mips_gnu_rel_lo16
;
1605 case BFD_RELOC_16_PCREL_S2
:
1606 return &elf_mips_gnu_rel16_s2
;
1607 case BFD_RELOC_64_PCREL
:
1608 return &elf_mips_gnu_pcrel64
;
1609 case BFD_RELOC_32_PCREL
:
1610 return &elf_mips_gnu_pcrel32
;
1614 /* Given a MIPS Elf32_Internal_Rel, fill in an arelent structure. */
1616 static reloc_howto_type
*
1617 mips_elf32_rtype_to_howto (r_type
, rela_p
)
1618 unsigned int r_type
;
1619 boolean rela_p ATTRIBUTE_UNUSED
;
1624 return &elf_mips16_jump_howto
;
1626 case R_MIPS16_GPREL
:
1627 return &elf_mips16_gprel_howto
;
1629 case R_MIPS_GNU_VTINHERIT
:
1630 return &elf_mips_gnu_vtinherit_howto
;
1632 case R_MIPS_GNU_VTENTRY
:
1633 return &elf_mips_gnu_vtentry_howto
;
1635 case R_MIPS_GNU_REL_HI16
:
1636 return &elf_mips_gnu_rel_hi16
;
1638 case R_MIPS_GNU_REL_LO16
:
1639 return &elf_mips_gnu_rel_lo16
;
1641 case R_MIPS_GNU_REL16_S2
:
1642 return &elf_mips_gnu_rel16_s2
;
1645 return &elf_mips_gnu_pcrel64
;
1648 return &elf_mips_gnu_pcrel32
;
1652 BFD_ASSERT (r_type
< (unsigned int) R_MIPS_max
);
1653 return &elf_mips_howto_table_rel
[r_type
];
1657 /* Given a MIPS Elf32_Internal_Rel, fill in an arelent structure. */
1660 mips_info_to_howto_rel (abfd
, cache_ptr
, dst
)
1663 Elf32_Internal_Rel
*dst
;
1665 unsigned int r_type
;
1667 r_type
= ELF32_R_TYPE (dst
->r_info
);
1668 cache_ptr
->howto
= mips_elf32_rtype_to_howto (r_type
, false);
1670 /* The addend for a GPREL16 or LITERAL relocation comes from the GP
1671 value for the object file. We get the addend now, rather than
1672 when we do the relocation, because the symbol manipulations done
1673 by the linker may cause us to lose track of the input BFD. */
1674 if (((*cache_ptr
->sym_ptr_ptr
)->flags
& BSF_SECTION_SYM
) != 0
1675 && (r_type
== (unsigned int) R_MIPS_GPREL16
1676 || r_type
== (unsigned int) R_MIPS_LITERAL
))
1677 cache_ptr
->addend
= elf_gp (abfd
);
1680 /* Given a MIPS Elf32_Internal_Rela, fill in an arelent structure. */
1683 mips_info_to_howto_rela (abfd
, cache_ptr
, dst
)
1686 Elf32_Internal_Rela
*dst
;
1688 /* Since an Elf32_Internal_Rel is an initial prefix of an
1689 Elf32_Internal_Rela, we can just use mips_info_to_howto_rel
1691 mips_info_to_howto_rel (abfd
, cache_ptr
, (Elf32_Internal_Rel
*) dst
);
1693 /* If we ever need to do any extra processing with dst->r_addend
1694 (the field omitted in an Elf32_Internal_Rel) we can do it here. */
1697 /* Determine whether a symbol is global for the purposes of splitting
1698 the symbol table into global symbols and local symbols. At least
1699 on Irix 5, this split must be between section symbols and all other
1700 symbols. On most ELF targets the split is between static symbols
1701 and externally visible symbols. */
1704 mips_elf_sym_is_global (abfd
, sym
)
1705 bfd
*abfd ATTRIBUTE_UNUSED
;
1708 if (SGI_COMPAT (abfd
))
1709 return (sym
->flags
& BSF_SECTION_SYM
) == 0;
1711 return ((sym
->flags
& (BSF_GLOBAL
| BSF_WEAK
)) != 0
1712 || bfd_is_und_section (bfd_get_section (sym
))
1713 || bfd_is_com_section (bfd_get_section (sym
)));
1716 /* Set the right machine number for a MIPS ELF file. */
1719 mips_elf32_object_p (abfd
)
1724 /* Irix 5 and 6 are broken. Object file symbol tables are not always
1725 sorted correctly such that local symbols precede global symbols,
1726 and the sh_info field in the symbol table is not always right. */
1727 if (SGI_COMPAT (abfd
))
1728 elf_bad_symtab (abfd
) = true;
1730 mach
= _bfd_elf_mips_mach (elf_elfheader (abfd
)->e_flags
);
1731 bfd_default_set_arch_mach (abfd
, bfd_arch_mips
, mach
);
1733 if (ABI_N32_P (abfd
))
1739 /* MIPS ELF local labels start with '$', not 'L'. */
1742 mips_elf_is_local_label_name (abfd
, name
)
1749 /* On Irix 6, the labels go back to starting with '.', so we accept
1750 the generic ELF local label syntax as well. */
1751 return _bfd_elf_is_local_label_name (abfd
, name
);
1754 /* Support for core dump NOTE sections. */
1756 elf32_mips_grok_prstatus (abfd
, note
)
1758 Elf_Internal_Note
*note
;
1761 unsigned int raw_size
;
1763 switch (note
->descsz
)
1768 case 256: /* Linux/MIPS */
1770 elf_tdata (abfd
)->core_signal
= bfd_get_16 (abfd
, note
->descdata
+ 12);
1773 elf_tdata (abfd
)->core_pid
= bfd_get_32 (abfd
, note
->descdata
+ 24);
1782 /* Make a ".reg/999" section. */
1783 return _bfd_elfcore_make_pseudosection (abfd
, ".reg",
1784 raw_size
, note
->descpos
+ offset
);
1788 elf32_mips_grok_psinfo (abfd
, note
)
1790 Elf_Internal_Note
*note
;
1792 switch (note
->descsz
)
1797 case 128: /* Linux/MIPS elf_prpsinfo */
1798 elf_tdata (abfd
)->core_program
1799 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 32, 16);
1800 elf_tdata (abfd
)->core_command
1801 = _bfd_elfcore_strndup (abfd
, note
->descdata
+ 48, 80);
1804 /* Note that for some reason, a spurious space is tacked
1805 onto the end of the args in some (at least one anyway)
1806 implementations, so strip it off if it exists. */
1809 char *command
= elf_tdata (abfd
)->core_command
;
1810 int n
= strlen (command
);
1812 if (0 < n
&& command
[n
- 1] == ' ')
1813 command
[n
- 1] = '\0';
1822 elf32_mips_discard_info (abfd
, cookie
, info
)
1824 struct elf_reloc_cookie
*cookie
;
1825 struct bfd_link_info
*info
;
1828 struct elf_backend_data
*bed
= get_elf_backend_data (abfd
);
1829 boolean ret
= false;
1830 unsigned char *tdata
;
1833 o
= bfd_get_section_by_name (abfd
, ".pdr");
1836 if (o
->_raw_size
== 0)
1838 if (o
->_raw_size
% PDR_SIZE
!= 0)
1840 if (o
->output_section
!= NULL
1841 && bfd_is_abs_section (o
->output_section
))
1844 tdata
= bfd_zmalloc (o
->_raw_size
/ PDR_SIZE
);
1848 cookie
->rels
= _bfd_elf32_link_read_relocs (abfd
, o
, (PTR
) NULL
,
1849 (Elf_Internal_Rela
*) NULL
,
1857 cookie
->rel
= cookie
->rels
;
1859 cookie
->rels
+ o
->reloc_count
* bed
->s
->int_rels_per_ext_rel
;
1861 for (i
= 0, skip
= 0; i
< o
->_raw_size
; i
++)
1863 if (_bfd_elf32_reloc_symbol_deleted_p (i
* PDR_SIZE
, cookie
))
1872 elf_section_data (o
)->tdata
= tdata
;
1873 o
->_cooked_size
= o
->_raw_size
- skip
* PDR_SIZE
;
1879 if (! info
->keep_memory
)
1880 free (cookie
->rels
);
1886 elf32_mips_ignore_discarded_relocs (sec
)
1889 if (strcmp (sec
->name
, ".pdr") == 0)
1895 elf32_mips_write_section (output_bfd
, sec
, contents
)
1900 bfd_byte
*to
, *from
, *end
;
1903 if (strcmp (sec
->name
, ".pdr") != 0)
1906 if (elf_section_data (sec
)->tdata
== NULL
)
1910 end
= contents
+ sec
->_raw_size
;
1911 for (from
= contents
, i
= 0;
1913 from
+= PDR_SIZE
, i
++)
1915 if (((unsigned char *)elf_section_data (sec
)->tdata
)[i
] == 1)
1918 memcpy (to
, from
, PDR_SIZE
);
1921 bfd_set_section_contents (output_bfd
, sec
->output_section
, contents
,
1922 (file_ptr
) sec
->output_offset
,
1927 /* Depending on the target vector we generate some version of Irix
1928 executables or "normal" MIPS ELF ABI executables. */
1929 static irix_compat_t
1930 elf32_mips_irix_compat (abfd
)
1933 if ((abfd
->xvec
== &bfd_elf32_tradbigmips_vec
)
1934 || (abfd
->xvec
== &bfd_elf32_tradlittlemips_vec
))
1940 /* Given a data section and an in-memory embedded reloc section, store
1941 relocation information into the embedded reloc section which can be
1942 used at runtime to relocate the data section. This is called by the
1943 linker when the --embedded-relocs switch is used. This is called
1944 after the add_symbols entry point has been called for all the
1945 objects, and before the final_link entry point is called. */
1948 bfd_mips_elf32_create_embedded_relocs (abfd
, info
, datasec
, relsec
, errmsg
)
1950 struct bfd_link_info
*info
;
1955 Elf_Internal_Shdr
*symtab_hdr
;
1956 Elf_Internal_Shdr
*shndx_hdr
;
1957 Elf32_External_Sym
*extsyms
;
1958 Elf32_External_Sym
*free_extsyms
= NULL
;
1959 Elf_External_Sym_Shndx
*shndx_buf
= NULL
;
1960 Elf_Internal_Rela
*internal_relocs
;
1961 Elf_Internal_Rela
*free_relocs
= NULL
;
1962 Elf_Internal_Rela
*irel
, *irelend
;
1966 BFD_ASSERT (! info
->relocateable
);
1970 if (datasec
->reloc_count
== 0)
1973 symtab_hdr
= &elf_tdata (abfd
)->symtab_hdr
;
1974 /* Read this BFD's symbols if we haven't done so already, or get the cached
1975 copy if it exists. */
1976 if (symtab_hdr
->contents
!= NULL
)
1977 extsyms
= (Elf32_External_Sym
*) symtab_hdr
->contents
;
1980 /* Go get them off disk. */
1981 if (info
->keep_memory
)
1982 extsyms
= ((Elf32_External_Sym
*)
1983 bfd_alloc (abfd
, symtab_hdr
->sh_size
));
1985 extsyms
= ((Elf32_External_Sym
*)
1986 bfd_malloc (symtab_hdr
->sh_size
));
1987 if (extsyms
== NULL
)
1989 if (! info
->keep_memory
)
1990 free_extsyms
= extsyms
;
1991 if (bfd_seek (abfd
, symtab_hdr
->sh_offset
, SEEK_SET
) != 0
1992 || (bfd_bread (extsyms
, symtab_hdr
->sh_size
, abfd
)
1993 != symtab_hdr
->sh_size
))
1995 if (info
->keep_memory
)
1996 symtab_hdr
->contents
= (unsigned char *) extsyms
;
1999 shndx_hdr
= &elf_tdata (abfd
)->symtab_shndx_hdr
;
2000 if (shndx_hdr
->sh_size
!= 0)
2002 amt
= symtab_hdr
->sh_info
* sizeof (Elf_External_Sym_Shndx
);
2003 shndx_buf
= (Elf_External_Sym_Shndx
*) bfd_malloc (amt
);
2004 if (shndx_buf
== NULL
)
2006 if (bfd_seek (abfd
, shndx_hdr
->sh_offset
, SEEK_SET
) != 0
2007 || bfd_bread ((PTR
) shndx_buf
, amt
, abfd
) != amt
)
2011 /* Get a copy of the native relocations. */
2012 internal_relocs
= (_bfd_elf32_link_read_relocs
2013 (abfd
, datasec
, (PTR
) NULL
, (Elf_Internal_Rela
*) NULL
,
2014 info
->keep_memory
));
2015 if (internal_relocs
== NULL
)
2017 if (! info
->keep_memory
)
2018 free_relocs
= internal_relocs
;
2020 relsec
->contents
= (bfd_byte
*) bfd_alloc (abfd
, datasec
->reloc_count
* 12);
2021 if (relsec
->contents
== NULL
)
2024 p
= relsec
->contents
;
2026 irelend
= internal_relocs
+ datasec
->reloc_count
;
2028 for (irel
= internal_relocs
; irel
< irelend
; irel
++, p
+= 12)
2030 asection
*targetsec
;
2032 /* We are going to write a four byte longword into the runtime
2033 reloc section. The longword will be the address in the data
2034 section which must be relocated. It is followed by the name
2035 of the target section NUL-padded or truncated to 8
2038 /* We can only relocate absolute longword relocs at run time. */
2039 if ((ELF32_R_TYPE (irel
->r_info
) != (int) R_MIPS_32
) &&
2040 (ELF32_R_TYPE (irel
->r_info
) != (int) R_MIPS_64
))
2042 *errmsg
= _("unsupported reloc type");
2043 bfd_set_error (bfd_error_bad_value
);
2046 /* Get the target section referred to by the reloc. */
2047 if (ELF32_R_SYM (irel
->r_info
) < symtab_hdr
->sh_info
)
2049 Elf32_External_Sym
*esym
;
2050 Elf_External_Sym_Shndx
*shndx
;
2051 Elf_Internal_Sym isym
;
2053 /* A local symbol. */
2054 esym
= extsyms
+ ELF32_R_SYM (irel
->r_info
);
2055 shndx
= shndx_buf
+ (shndx_buf
? ELF32_R_SYM (irel
->r_info
) : 0);
2056 bfd_elf32_swap_symbol_in (abfd
, esym
, shndx
, &isym
);
2058 targetsec
= bfd_section_from_elf_index (abfd
, isym
.st_shndx
);
2063 struct elf_link_hash_entry
*h
;
2065 /* An external symbol. */
2066 indx
= ELF32_R_SYM (irel
->r_info
);
2067 h
= elf_sym_hashes (abfd
)[indx
];
2070 For some reason, in certain programs, the symbol will
2071 not be in the hash table. It seems to happen when you
2072 declare a static table of pointers to const external structures.
2073 In this case, the relocs are relative to data, not
2074 text, so just treating it like an undefined link
2075 should be sufficient. */
2076 BFD_ASSERT(h
!= NULL
);
2077 if (h
->root
.type
== bfd_link_hash_defined
2078 || h
->root
.type
== bfd_link_hash_defweak
)
2079 targetsec
= h
->root
.u
.def
.section
;
2084 Set the low bit of the relocation offset if it's a MIPS64 reloc.
2085 Relocations will always be on (at least) 32-bit boundaries. */
2087 bfd_put_32 (abfd
, ((irel
->r_offset
+ datasec
->output_offset
) +
2088 ((ELF32_R_TYPE (irel
->r_info
) == (int) R_MIPS_64
) ? 1 : 0)),
2090 memset (p
+ 4, 0, 8);
2091 if (targetsec
!= NULL
)
2092 strncpy (p
+ 4, targetsec
->output_section
->name
, 8);
2095 if (shndx_buf
!= NULL
)
2097 if (free_extsyms
!= NULL
)
2098 free (free_extsyms
);
2099 if (free_relocs
!= NULL
)
2104 if (shndx_buf
!= NULL
)
2106 if (free_extsyms
!= NULL
)
2107 free (free_extsyms
);
2108 if (free_relocs
!= NULL
)
2113 /* ECOFF swapping routines. These are used when dealing with the
2114 .mdebug section, which is in the ECOFF debugging format. */
2115 static const struct ecoff_debug_swap mips_elf32_ecoff_debug_swap
= {
2116 /* Symbol table magic number. */
2118 /* Alignment of debugging information. E.g., 4. */
2120 /* Sizes of external symbolic information. */
2121 sizeof (struct hdr_ext
),
2122 sizeof (struct dnr_ext
),
2123 sizeof (struct pdr_ext
),
2124 sizeof (struct sym_ext
),
2125 sizeof (struct opt_ext
),
2126 sizeof (struct fdr_ext
),
2127 sizeof (struct rfd_ext
),
2128 sizeof (struct ext_ext
),
2129 /* Functions to swap in external symbolic data. */
2138 _bfd_ecoff_swap_tir_in
,
2139 _bfd_ecoff_swap_rndx_in
,
2140 /* Functions to swap out external symbolic data. */
2149 _bfd_ecoff_swap_tir_out
,
2150 _bfd_ecoff_swap_rndx_out
,
2151 /* Function to read in symbolic data. */
2152 _bfd_mips_elf_read_ecoff_info
2155 #define ELF_ARCH bfd_arch_mips
2156 #define ELF_MACHINE_CODE EM_MIPS
2158 /* The SVR4 MIPS ABI says that this should be 0x10000, but Irix 5 uses
2159 a value of 0x1000, and we are compatible. */
2160 #define ELF_MAXPAGESIZE 0x1000
2162 #define elf_backend_collect true
2163 #define elf_backend_type_change_ok true
2164 #define elf_backend_can_gc_sections true
2165 #define elf_info_to_howto mips_info_to_howto_rela
2166 #define elf_info_to_howto_rel mips_info_to_howto_rel
2167 #define elf_backend_sym_is_global mips_elf_sym_is_global
2168 #define elf_backend_object_p mips_elf32_object_p
2169 #define elf_backend_symbol_processing _bfd_mips_elf_symbol_processing
2170 #define elf_backend_section_processing _bfd_mips_elf_section_processing
2171 #define elf_backend_section_from_shdr _bfd_mips_elf_section_from_shdr
2172 #define elf_backend_fake_sections _bfd_mips_elf_fake_sections
2173 #define elf_backend_section_from_bfd_section \
2174 _bfd_mips_elf_section_from_bfd_section
2175 #define elf_backend_add_symbol_hook _bfd_mips_elf_add_symbol_hook
2176 #define elf_backend_link_output_symbol_hook \
2177 _bfd_mips_elf_link_output_symbol_hook
2178 #define elf_backend_create_dynamic_sections \
2179 _bfd_mips_elf_create_dynamic_sections
2180 #define elf_backend_check_relocs _bfd_mips_elf_check_relocs
2181 #define elf_backend_adjust_dynamic_symbol \
2182 _bfd_mips_elf_adjust_dynamic_symbol
2183 #define elf_backend_always_size_sections \
2184 _bfd_mips_elf_always_size_sections
2185 #define elf_backend_size_dynamic_sections \
2186 _bfd_mips_elf_size_dynamic_sections
2187 #define elf_backend_relocate_section _bfd_mips_elf_relocate_section
2188 #define elf_backend_finish_dynamic_symbol \
2189 _bfd_mips_elf_finish_dynamic_symbol
2190 #define elf_backend_finish_dynamic_sections \
2191 _bfd_mips_elf_finish_dynamic_sections
2192 #define elf_backend_final_write_processing \
2193 _bfd_mips_elf_final_write_processing
2194 #define elf_backend_additional_program_headers \
2195 _bfd_mips_elf_additional_program_headers
2196 #define elf_backend_modify_segment_map _bfd_mips_elf_modify_segment_map
2197 #define elf_backend_gc_mark_hook _bfd_mips_elf_gc_mark_hook
2198 #define elf_backend_gc_sweep_hook _bfd_mips_elf_gc_sweep_hook
2199 #define elf_backend_copy_indirect_symbol \
2200 _bfd_mips_elf_copy_indirect_symbol
2201 #define elf_backend_hide_symbol _bfd_mips_elf_hide_symbol
2202 #define elf_backend_grok_prstatus elf32_mips_grok_prstatus
2203 #define elf_backend_grok_psinfo elf32_mips_grok_psinfo
2204 #define elf_backend_ecoff_debug_swap &mips_elf32_ecoff_debug_swap
2206 #define elf_backend_got_header_size (4 * MIPS_RESERVED_GOTNO)
2207 #define elf_backend_plt_header_size 0
2208 #define elf_backend_may_use_rel_p 1
2209 #define elf_backend_may_use_rela_p 0
2210 #define elf_backend_default_use_rela_p 0
2211 #define elf_backend_sign_extend_vma true
2213 #define elf_backend_discard_info elf32_mips_discard_info
2214 #define elf_backend_ignore_discarded_relocs \
2215 elf32_mips_ignore_discarded_relocs
2216 #define elf_backend_write_section elf32_mips_write_section
2217 #define elf_backend_mips_irix_compat elf32_mips_irix_compat
2218 #define elf_backend_mips_rtype_to_howto mips_elf32_rtype_to_howto
2219 #define bfd_elf32_bfd_is_local_label_name \
2220 mips_elf_is_local_label_name
2221 #define bfd_elf32_find_nearest_line _bfd_mips_elf_find_nearest_line
2222 #define bfd_elf32_set_section_contents _bfd_mips_elf_set_section_contents
2223 #define bfd_elf32_bfd_get_relocated_section_contents \
2224 _bfd_elf_mips_get_relocated_section_contents
2225 #define bfd_elf32_bfd_link_hash_table_create \
2226 _bfd_mips_elf_link_hash_table_create
2227 #define bfd_elf32_bfd_final_link _bfd_mips_elf_final_link
2228 #define bfd_elf32_bfd_merge_private_bfd_data \
2229 _bfd_mips_elf_merge_private_bfd_data
2230 #define bfd_elf32_bfd_set_private_flags _bfd_mips_elf_set_private_flags
2231 #define bfd_elf32_bfd_print_private_bfd_data \
2232 _bfd_mips_elf_print_private_bfd_data
2234 /* Support for SGI-ish mips targets. */
2235 #define TARGET_LITTLE_SYM bfd_elf32_littlemips_vec
2236 #define TARGET_LITTLE_NAME "elf32-littlemips"
2237 #define TARGET_BIG_SYM bfd_elf32_bigmips_vec
2238 #define TARGET_BIG_NAME "elf32-bigmips"
2240 #include "elf32-target.h"
2242 /* Support for traditional mips targets. */
2243 #define INCLUDED_TARGET_FILE /* More a type of flag. */
2245 #undef TARGET_LITTLE_SYM
2246 #undef TARGET_LITTLE_NAME
2247 #undef TARGET_BIG_SYM
2248 #undef TARGET_BIG_NAME
2250 #define TARGET_LITTLE_SYM bfd_elf32_tradlittlemips_vec
2251 #define TARGET_LITTLE_NAME "elf32-tradlittlemips"
2252 #define TARGET_BIG_SYM bfd_elf32_tradbigmips_vec
2253 #define TARGET_BIG_NAME "elf32-tradbigmips"
2255 /* Include the target file again for this target. */
2256 #include "elf32-target.h"