1 /* MIPS-specific support for 32-bit ELF
2 Copyright 1993, 1994, 1995 Free Software Foundation, Inc.
4 Most of the information added by Ian Lance Taylor, Cygnus Support,
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 2 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
31 /* Get the ECOFF swapping routines. */
33 #include "coff/symconst.h"
34 #include "coff/internal.h"
35 #include "coff/ecoff.h"
36 #include "coff/mips.h"
38 #include "ecoffswap.h"
40 static bfd_reloc_status_type mips_elf_hi16_reloc PARAMS ((bfd *abfd,
47 static bfd_reloc_status_type mips_elf_got16_reloc PARAMS ((bfd *abfd,
54 static bfd_reloc_status_type mips_elf_lo16_reloc PARAMS ((bfd *abfd,
61 static bfd_reloc_status_type mips_elf_gprel16_reloc PARAMS ((bfd *abfd,
68 static reloc_howto_type *bfd_elf32_bfd_reloc_type_lookup
69 PARAMS ((bfd *, bfd_reloc_code_real_type));
70 static void mips_info_to_howto_rel
71 PARAMS ((bfd *, arelent *, Elf32_Internal_Rel *));
72 static boolean mips_elf_sym_is_global PARAMS ((bfd *, asymbol *));
73 static boolean mips_elf_object_p PARAMS ((bfd *));
74 static void mips_elf_final_write_processing
75 PARAMS ((bfd *, boolean));
76 static boolean mips_elf_section_from_shdr
77 PARAMS ((bfd *, Elf32_Internal_Shdr *, char *));
78 static boolean mips_elf_fake_sections
79 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *));
80 static boolean mips_elf_section_from_bfd_section
81 PARAMS ((bfd *, Elf32_Internal_Shdr *, asection *, int *));
82 static boolean mips_elf_section_processing
83 PARAMS ((bfd *, Elf32_Internal_Shdr *));
84 static void mips_elf_symbol_processing PARAMS ((bfd *, asymbol *));
85 static boolean mips_elf_read_ecoff_info
86 PARAMS ((bfd *, asection *, struct ecoff_debug_info *));
87 static boolean mips_elf_is_local_label
88 PARAMS ((bfd *, asymbol *));
89 static boolean mips_elf_find_nearest_line
90 PARAMS ((bfd *, asection *, asymbol **, bfd_vma, const char **,
91 const char **, unsigned int *));
92 static struct bfd_hash_entry *mips_elf_link_hash_newfunc
93 PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, const char *));
94 static struct bfd_link_hash_table *mips_elf_link_hash_table_create
96 static int gptab_compare PARAMS ((const void *, const void *));
97 static boolean mips_elf_final_link
98 PARAMS ((bfd *, struct bfd_link_info *));
99 static void mips_elf_relocate_hi16
100 PARAMS ((bfd *, Elf_Internal_Rela *, Elf_Internal_Rela *, bfd_byte *,
102 static boolean mips_elf_relocate_section
103 PARAMS ((bfd *, struct bfd_link_info *, bfd *, asection *, bfd_byte *,
104 Elf_Internal_Rela *, Elf_Internal_Sym *, asection **));
105 static boolean mips_elf_add_symbol_hook
106 PARAMS ((bfd *, struct bfd_link_info *, const Elf_Internal_Sym *,
107 const char **, flagword *, asection **, bfd_vma *));
109 #define USE_REL 1 /* MIPS uses REL relocations instead of RELA */
114 R_MIPS_16, R_MIPS_32,
115 R_MIPS_REL32, R_MIPS_26,
116 R_MIPS_HI16, R_MIPS_LO16,
117 R_MIPS_GPREL16, R_MIPS_LITERAL,
118 R_MIPS_GOT16, R_MIPS_PC16,
119 R_MIPS_CALL16, R_MIPS_GPREL32,
120 /* The remaining relocs are defined on Irix, although they are not
121 in the MIPS ELF ABI. */
122 R_MIPS_UNUSED1, R_MIPS_UNUSED2,
124 R_MIPS_SHIFT5, R_MIPS_SHIFT6,
125 R_MIPS_64, R_MIPS_GOT_DISP,
126 R_MIPS_GOT_PAGE, R_MIPS_GOT_OFST,
127 R_MIPS_GOT_HI16, R_MIPS_GOT_LO16,
128 R_MIPS_SUB, R_MIPS_INSERT_A,
129 R_MIPS_INSERT_B, R_MIPS_DELETE,
130 R_MIPS_HIGHER, R_MIPS_HIGHEST,
131 R_MIPS_CALL_HI16, R_MIPS_CALL_LO16,
135 static reloc_howto_type elf_mips_howto_table[] =
138 HOWTO (R_MIPS_NONE, /* type */
140 0, /* size (0 = byte, 1 = short, 2 = long) */
142 false, /* pc_relative */
144 complain_overflow_dont, /* complain_on_overflow */
145 bfd_elf_generic_reloc, /* special_function */
146 "R_MIPS_NONE", /* name */
147 false, /* partial_inplace */
150 false), /* pcrel_offset */
152 /* 16 bit relocation. */
153 HOWTO (R_MIPS_16, /* type */
155 1, /* size (0 = byte, 1 = short, 2 = long) */
157 false, /* pc_relative */
159 complain_overflow_bitfield, /* complain_on_overflow */
160 bfd_elf_generic_reloc, /* special_function */
161 "R_MIPS_16", /* name */
162 true, /* partial_inplace */
163 0xffff, /* src_mask */
164 0xffff, /* dst_mask */
165 false), /* pcrel_offset */
167 /* 32 bit relocation. */
168 HOWTO (R_MIPS_32, /* type */
170 2, /* size (0 = byte, 1 = short, 2 = long) */
172 false, /* pc_relative */
174 complain_overflow_bitfield, /* complain_on_overflow */
175 bfd_elf_generic_reloc, /* special_function */
176 "R_MIPS_32", /* name */
177 true, /* partial_inplace */
178 0xffffffff, /* src_mask */
179 0xffffffff, /* dst_mask */
180 false), /* pcrel_offset */
182 /* 32 bit symbol relative relocation. */
183 HOWTO (R_MIPS_REL32, /* type */
185 2, /* size (0 = byte, 1 = short, 2 = long) */
187 false, /* pc_relative */
189 complain_overflow_bitfield, /* complain_on_overflow */
190 bfd_elf_generic_reloc, /* special_function */
191 "R_MIPS_REL32", /* name */
192 true, /* partial_inplace */
193 0xffffffff, /* src_mask */
194 0xffffffff, /* dst_mask */
195 false), /* pcrel_offset */
197 /* 26 bit branch address. */
198 HOWTO (R_MIPS_26, /* type */
200 2, /* size (0 = byte, 1 = short, 2 = long) */
202 false, /* pc_relative */
204 complain_overflow_dont, /* complain_on_overflow */
205 /* This needs complex overflow
206 detection, because the upper four
207 bits must match the PC. */
208 bfd_elf_generic_reloc, /* special_function */
209 "R_MIPS_26", /* name */
210 true, /* partial_inplace */
211 0x3ffffff, /* src_mask */
212 0x3ffffff, /* dst_mask */
213 false), /* pcrel_offset */
215 /* High 16 bits of symbol value. */
216 HOWTO (R_MIPS_HI16, /* type */
218 2, /* size (0 = byte, 1 = short, 2 = long) */
220 false, /* pc_relative */
222 complain_overflow_dont, /* complain_on_overflow */
223 mips_elf_hi16_reloc, /* special_function */
224 "R_MIPS_HI16", /* name */
225 true, /* partial_inplace */
226 0xffff, /* src_mask */
227 0xffff, /* dst_mask */
228 false), /* pcrel_offset */
230 /* Low 16 bits of symbol value. */
231 HOWTO (R_MIPS_LO16, /* type */
233 2, /* size (0 = byte, 1 = short, 2 = long) */
235 false, /* pc_relative */
237 complain_overflow_dont, /* complain_on_overflow */
238 mips_elf_lo16_reloc, /* special_function */
239 "R_MIPS_LO16", /* name */
240 true, /* partial_inplace */
241 0xffff, /* src_mask */
242 0xffff, /* dst_mask */
243 false), /* pcrel_offset */
245 /* GP relative reference. */
246 HOWTO (R_MIPS_GPREL16, /* type */
248 2, /* size (0 = byte, 1 = short, 2 = long) */
250 false, /* pc_relative */
252 complain_overflow_signed, /* complain_on_overflow */
253 mips_elf_gprel16_reloc, /* special_function */
254 "R_MIPS_GPREL16", /* name */
255 true, /* partial_inplace */
256 0xffff, /* src_mask */
257 0xffff, /* dst_mask */
258 false), /* pcrel_offset */
260 /* Reference to literal section. */
261 HOWTO (R_MIPS_LITERAL, /* type */
263 2, /* size (0 = byte, 1 = short, 2 = long) */
265 false, /* pc_relative */
267 complain_overflow_signed, /* complain_on_overflow */
268 mips_elf_gprel16_reloc, /* special_function */
269 "R_MIPS_LITERAL", /* name */
270 true, /* partial_inplace */
271 0xffff, /* src_mask */
272 0xffff, /* dst_mask */
273 false), /* pcrel_offset */
275 /* Reference to global offset table. */
276 /* FIXME: This is not handled correctly. */
277 HOWTO (R_MIPS_GOT16, /* type */
279 2, /* size (0 = byte, 1 = short, 2 = long) */
281 false, /* pc_relative */
283 complain_overflow_signed, /* complain_on_overflow */
284 mips_elf_got16_reloc, /* special_function */
285 "R_MIPS_GOT16", /* name */
286 false, /* partial_inplace */
288 0xffff, /* dst_mask */
289 false), /* pcrel_offset */
291 /* 16 bit PC relative reference. */
292 HOWTO (R_MIPS_PC16, /* type */
294 2, /* size (0 = byte, 1 = short, 2 = long) */
296 true, /* pc_relative */
298 complain_overflow_signed, /* complain_on_overflow */
299 bfd_elf_generic_reloc, /* special_function */
300 "R_MIPS_PC16", /* name */
301 true, /* partial_inplace */
302 0xffff, /* src_mask */
303 0xffff, /* dst_mask */
304 false), /* pcrel_offset */
306 /* 16 bit call through global offset table. */
307 /* FIXME: This is not handled correctly. */
308 HOWTO (R_MIPS_CALL16, /* type */
310 2, /* size (0 = byte, 1 = short, 2 = long) */
312 false, /* pc_relative */
314 complain_overflow_signed, /* complain_on_overflow */
315 bfd_elf_generic_reloc, /* special_function */
316 "R_MIPS_CALL16", /* name */
317 false, /* partial_inplace */
319 0xffff, /* dst_mask */
320 false), /* pcrel_offset */
322 /* 32 bit GP relative reference. */
323 /* FIXME: This is not handled correctly. */
324 HOWTO (R_MIPS_GPREL32, /* type */
326 2, /* size (0 = byte, 1 = short, 2 = long) */
328 false, /* pc_relative */
330 complain_overflow_bitfield, /* complain_on_overflow */
331 bfd_elf_generic_reloc, /* special_function */
332 "R_MIPS_GPREL32", /* name */
333 true, /* partial_inplace */
334 0xffffffff, /* src_mask */
335 0xffffffff, /* dst_mask */
336 false), /* pcrel_offset */
338 /* The remaining relocs are defined on Irix 5, although they are
339 not defined by the ABI. */
344 /* A 5 bit shift field. */
345 HOWTO (R_MIPS_SHIFT5, /* type */
347 2, /* size (0 = byte, 1 = short, 2 = long) */
349 false, /* pc_relative */
351 complain_overflow_bitfield, /* complain_on_overflow */
352 bfd_elf_generic_reloc, /* special_function */
353 "R_MIPS_SHIFT5", /* name */
354 true, /* partial_inplace */
355 0x000007c0, /* src_mask */
356 0x000007c0, /* dst_mask */
357 false), /* pcrel_offset */
359 /* A 6 bit shift field. */
360 /* FIXME: This is not handled correctly; a special function is
361 needed to put the most significant bit in the right place. */
362 HOWTO (R_MIPS_SHIFT6, /* type */
364 2, /* size (0 = byte, 1 = short, 2 = long) */
366 false, /* pc_relative */
368 complain_overflow_bitfield, /* complain_on_overflow */
369 bfd_elf_generic_reloc, /* special_function */
370 "R_MIPS_SHIFT6", /* name */
371 true, /* partial_inplace */
372 0x000007c4, /* src_mask */
373 0x000007c4, /* dst_mask */
374 false), /* pcrel_offset */
376 /* A 64 bit relocation. Presumably not used in 32 bit ELF. */
379 /* Displacement in the global offset table. */
380 /* FIXME: Not handled correctly. */
381 HOWTO (R_MIPS_GOT_DISP, /* type */
383 2, /* size (0 = byte, 1 = short, 2 = long) */
385 false, /* pc_relative */
387 complain_overflow_bitfield, /* complain_on_overflow */
388 bfd_elf_generic_reloc, /* special_function */
389 "R_MIPS_GOT_DISP", /* name */
390 true, /* partial_inplace */
391 0x0000ffff, /* src_mask */
392 0x0000ffff, /* dst_mask */
393 false), /* pcrel_offset */
395 /* Displacement to page pointer in the global offset table. */
396 /* FIXME: Not handled correctly. */
397 HOWTO (R_MIPS_GOT_PAGE, /* type */
399 2, /* size (0 = byte, 1 = short, 2 = long) */
401 false, /* pc_relative */
403 complain_overflow_bitfield, /* complain_on_overflow */
404 bfd_elf_generic_reloc, /* special_function */
405 "R_MIPS_GOT_PAGE", /* name */
406 true, /* partial_inplace */
407 0x0000ffff, /* src_mask */
408 0x0000ffff, /* dst_mask */
409 false), /* pcrel_offset */
411 /* Offset from page pointer in the global offset table. */
412 /* FIXME: Not handled correctly. */
413 HOWTO (R_MIPS_GOT_OFST, /* type */
415 2, /* size (0 = byte, 1 = short, 2 = long) */
417 false, /* pc_relative */
419 complain_overflow_bitfield, /* complain_on_overflow */
420 bfd_elf_generic_reloc, /* special_function */
421 "R_MIPS_GOT_OFST", /* name */
422 true, /* partial_inplace */
423 0x0000ffff, /* src_mask */
424 0x0000ffff, /* dst_mask */
425 false), /* pcrel_offset */
427 /* High 16 bits of displacement in global offset table. */
428 /* FIXME: Not handled correctly. */
429 HOWTO (R_MIPS_GOT_HI16, /* type */
431 2, /* size (0 = byte, 1 = short, 2 = long) */
433 false, /* pc_relative */
435 complain_overflow_dont, /* complain_on_overflow */
436 bfd_elf_generic_reloc, /* special_function */
437 "R_MIPS_GOT_HI16", /* name */
438 true, /* partial_inplace */
439 0x0000ffff, /* src_mask */
440 0x0000ffff, /* dst_mask */
441 false), /* pcrel_offset */
443 /* Low 16 bits of displacement in global offset table. */
444 /* FIXME: Not handled correctly. */
445 HOWTO (R_MIPS_GOT_LO16, /* type */
447 2, /* size (0 = byte, 1 = short, 2 = long) */
449 false, /* pc_relative */
451 complain_overflow_dont, /* complain_on_overflow */
452 bfd_elf_generic_reloc, /* special_function */
453 "R_MIPS_GOT_LO16", /* name */
454 true, /* partial_inplace */
455 0x0000ffff, /* src_mask */
456 0x0000ffff, /* dst_mask */
457 false), /* pcrel_offset */
459 /* 64 bit subtraction. Presumably not used in 32 bit ELF. */
462 /* Used to cause the linker to insert and delete instructions? */
467 /* Get the higher values of a 64 bit addend. Presumably not used in
472 /* High 16 bits of displacement in global offset table. */
473 /* FIXME: Not handled correctly. */
474 HOWTO (R_MIPS_CALL_HI16, /* type */
476 2, /* size (0 = byte, 1 = short, 2 = long) */
478 false, /* pc_relative */
480 complain_overflow_dont, /* complain_on_overflow */
481 bfd_elf_generic_reloc, /* special_function */
482 "R_MIPS_CALL_HI16", /* name */
483 true, /* partial_inplace */
484 0x0000ffff, /* src_mask */
485 0x0000ffff, /* dst_mask */
486 false), /* pcrel_offset */
488 /* Low 16 bits of displacement in global offset table. */
489 /* FIXME: Not handled correctly. */
490 HOWTO (R_MIPS_CALL_LO16, /* type */
492 2, /* size (0 = byte, 1 = short, 2 = long) */
494 false, /* pc_relative */
496 complain_overflow_dont, /* complain_on_overflow */
497 bfd_elf_generic_reloc, /* special_function */
498 "R_MIPS_CALL_LO16", /* name */
499 true, /* partial_inplace */
500 0x0000ffff, /* src_mask */
501 0x0000ffff, /* dst_mask */
502 false) /* pcrel_offset */
505 /* Do a R_MIPS_HI16 relocation. This has to be done in combination
506 with a R_MIPS_LO16 reloc, because there is a carry from the LO16 to
507 the HI16. Here we just save the information we need; we do the
508 actual relocation when we see the LO16. MIPS ELF requires that the
509 LO16 immediately follow the HI16, so this ought to work. */
511 static bfd_byte *mips_hi16_addr;
512 static bfd_vma mips_hi16_addend;
514 static bfd_reloc_status_type
515 mips_elf_hi16_reloc (abfd,
523 arelent *reloc_entry;
526 asection *input_section;
528 char **error_message;
530 bfd_reloc_status_type ret;
533 /* If we're relocating, and this an external symbol, we don't want
534 to change anything. */
535 if (output_bfd != (bfd *) NULL
536 && (symbol->flags & BSF_SECTION_SYM) == 0
537 && reloc_entry->addend == 0)
539 reloc_entry->address += input_section->output_offset;
543 /* FIXME: The symbol _gp_disp requires special handling, which we do
545 if (strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0)
549 if (bfd_is_und_section (symbol->section)
550 && output_bfd == (bfd *) NULL)
551 ret = bfd_reloc_undefined;
553 if (bfd_is_com_section (symbol->section))
556 relocation = symbol->value;
558 relocation += symbol->section->output_section->vma;
559 relocation += symbol->section->output_offset;
560 relocation += reloc_entry->addend;
562 if (reloc_entry->address > input_section->_cooked_size)
563 return bfd_reloc_outofrange;
565 /* Save the information, and let LO16 do the actual relocation. */
566 mips_hi16_addr = (bfd_byte *) data + reloc_entry->address;
567 mips_hi16_addend = relocation;
569 if (output_bfd != (bfd *) NULL)
570 reloc_entry->address += input_section->output_offset;
575 /* Do a R_MIPS_LO16 relocation. This is a straightforward 16 bit
576 inplace relocation; this function exists in order to do the
577 R_MIPS_HI16 relocation described above. */
579 static bfd_reloc_status_type
580 mips_elf_lo16_reloc (abfd,
588 arelent *reloc_entry;
591 asection *input_section;
593 char **error_message;
595 /* FIXME: The symbol _gp_disp requires special handling, which we do
597 if (output_bfd == (bfd *) NULL
598 && strcmp (bfd_asymbol_name (symbol), "_gp_disp") == 0)
601 if (mips_hi16_addr != (bfd_byte *) NULL)
607 /* Do the HI16 relocation. Note that we actually don't need to
608 know anything about the LO16 itself, except where to find the
609 low 16 bits of the addend needed by the LO16. */
610 insn = bfd_get_32 (abfd, mips_hi16_addr);
611 vallo = (bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address)
613 val = ((insn & 0xffff) << 16) + vallo;
614 val += mips_hi16_addend;
616 /* The low order 16 bits are always treated as a signed value.
617 Therefore, a negative value in the low order bits requires an
618 adjustment in the high order bits. We need to make this
619 adjustment in two ways: once for the bits we took from the
620 data, and once for the bits we are putting back in to the
622 if ((vallo & 0x8000) != 0)
624 if ((val & 0x8000) != 0)
627 insn = (insn &~ 0xffff) | ((val >> 16) & 0xffff);
628 bfd_put_32 (abfd, insn, mips_hi16_addr);
630 mips_hi16_addr = (bfd_byte *) NULL;
633 /* Now do the LO16 reloc in the usual way. */
634 return bfd_elf_generic_reloc (abfd, reloc_entry, symbol, data,
635 input_section, output_bfd, error_message);
638 /* Do a R_MIPS_GOT16 reloc. This is a reloc against the global offset
639 table used for PIC code. If the symbol is an external symbol, the
640 instruction is modified to contain the offset of the appropriate
641 entry in the global offset table. If the symbol is a section
642 symbol, the next reloc is a R_MIPS_LO16 reloc. The two 16 bit
643 addends are combined to form the real addend against the section
644 symbol; the GOT16 is modified to contain the offset of an entry in
645 the global offset table, and the LO16 is modified to offset it
646 appropriately. Thus an offset larger than 16 bits requires a
647 modified value in the global offset table.
649 This implementation suffices for the assembler, but the linker does
650 not yet know how to create global offset tables. */
652 static bfd_reloc_status_type
653 mips_elf_got16_reloc (abfd,
661 arelent *reloc_entry;
664 asection *input_section;
666 char **error_message;
668 /* If we're relocating, and this an external symbol, we don't want
669 to change anything. */
670 if (output_bfd != (bfd *) NULL
671 && (symbol->flags & BSF_SECTION_SYM) == 0
672 && reloc_entry->addend == 0)
674 reloc_entry->address += input_section->output_offset;
678 /* If we're relocating, and this is a local symbol, we can handle it
680 if (output_bfd != (bfd *) NULL
681 && (symbol->flags & BSF_SECTION_SYM) != 0)
682 return mips_elf_hi16_reloc (abfd, reloc_entry, symbol, data,
683 input_section, output_bfd, error_message);
688 /* Do a R_MIPS_GPREL16 relocation. This is a 16 bit value which must
689 become the offset from the gp register. This function also handles
690 R_MIPS_LITERAL relocations, although those can be handled more
691 cleverly because the entries in the .lit8 and .lit4 sections can be
694 static bfd_reloc_status_type gprel16_with_gp PARAMS ((bfd *, asymbol *,
695 arelent *, asection *,
696 boolean, PTR, bfd_vma));
698 static bfd_reloc_status_type
699 mips_elf_gprel16_reloc (abfd,
707 arelent *reloc_entry;
710 asection *input_section;
712 char **error_message;
714 boolean relocateable;
716 /* If we're relocating, and this is an external symbol with no
717 addend, we don't want to change anything. We will only have an
718 addend if this is a newly created reloc, not read from an ELF
720 if (output_bfd != (bfd *) NULL
721 && (symbol->flags & BSF_SECTION_SYM) == 0
722 && reloc_entry->addend == 0)
724 reloc_entry->address += input_section->output_offset;
728 if (output_bfd != (bfd *) NULL)
732 relocateable = false;
733 output_bfd = symbol->section->output_section->owner;
736 if (bfd_is_und_section (symbol->section)
737 && relocateable == false)
738 return bfd_reloc_undefined;
740 /* Some of the code below assumes the output bfd is ELF too. */
741 if (output_bfd->xvec->flavour != bfd_target_elf_flavour)
744 /* We have to figure out the gp value, so that we can adjust the
745 symbol value correctly. We look up the symbol _gp in the output
746 BFD. If we can't find it, we're stuck. We cache it in the ELF
747 target data. We don't need to adjust the symbol value for an
748 external symbol if we are producing relocateable output. */
749 if (elf_gp (output_bfd) == 0
750 && (relocateable == false
751 || (symbol->flags & BSF_SECTION_SYM) != 0))
753 if (relocateable != false)
755 /* Make up a value. */
756 elf_gp (output_bfd) =
757 symbol->section->output_section->vma + 0x4000;
765 count = bfd_get_symcount (output_bfd);
766 sym = bfd_get_outsymbols (output_bfd);
768 if (sym == (asymbol **) NULL)
772 for (i = 0; i < count; i++, sym++)
774 register CONST char *name;
776 name = bfd_asymbol_name (*sym);
777 if (*name == '_' && strcmp (name, "_gp") == 0)
779 elf_gp (output_bfd) = bfd_asymbol_value (*sym);
787 /* Only get the error once. */
788 elf_gp (output_bfd) = 4;
790 (char *) "GP relative relocation when _gp not defined";
791 return bfd_reloc_dangerous;
796 return gprel16_with_gp (abfd, symbol, reloc_entry, input_section,
797 relocateable, data, elf_gp (output_bfd));
800 static bfd_reloc_status_type
801 gprel16_with_gp (abfd, symbol, reloc_entry, input_section, relocateable, data,
805 arelent *reloc_entry;
806 asection *input_section;
807 boolean relocateable;
815 if (bfd_is_com_section (symbol->section))
818 relocation = symbol->value;
820 relocation += symbol->section->output_section->vma;
821 relocation += symbol->section->output_offset;
823 if (reloc_entry->address > input_section->_cooked_size)
824 return bfd_reloc_outofrange;
826 insn = bfd_get_32 (abfd, (bfd_byte *) data + reloc_entry->address);
828 /* Set val to the offset into the section or symbol. */
829 val = ((insn & 0xffff) + reloc_entry->addend) & 0xffff;
833 /* Adjust val for the final section location and GP value. If we
834 are producing relocateable output, we don't want to do this for
835 an external symbol. */
836 if (relocateable == false
837 || (symbol->flags & BSF_SECTION_SYM) != 0)
838 val += relocation - gp;
840 insn = (insn &~ 0xffff) | (val & 0xffff);
841 bfd_put_32 (abfd, insn, (bfd_byte *) data + reloc_entry->address);
843 if (relocateable != false)
844 reloc_entry->address += input_section->output_offset;
846 /* Make sure it fit in 16 bits. */
847 if (val >= 0x8000 && val < 0xffff8000)
848 return bfd_reloc_overflow;
853 /* A mapping from BFD reloc types to MIPS ELF reloc types. */
855 struct elf_reloc_map {
856 bfd_reloc_code_real_type bfd_reloc_val;
857 enum reloc_type elf_reloc_val;
860 static CONST struct elf_reloc_map mips_reloc_map[] =
862 { BFD_RELOC_NONE, R_MIPS_NONE, },
863 { BFD_RELOC_16, R_MIPS_16 },
864 { BFD_RELOC_32, R_MIPS_32 },
865 { BFD_RELOC_CTOR, R_MIPS_32 },
866 { BFD_RELOC_32_PCREL, R_MIPS_REL32 },
867 { BFD_RELOC_MIPS_JMP, R_MIPS_26 },
868 { BFD_RELOC_HI16_S, R_MIPS_HI16 },
869 { BFD_RELOC_LO16, R_MIPS_LO16 },
870 { BFD_RELOC_MIPS_GPREL, R_MIPS_GPREL16 },
871 { BFD_RELOC_MIPS_LITERAL, R_MIPS_LITERAL },
872 { BFD_RELOC_MIPS_GOT16, R_MIPS_GOT16 },
873 { BFD_RELOC_16_PCREL, R_MIPS_PC16 },
874 { BFD_RELOC_MIPS_CALL16, R_MIPS_CALL16 },
875 { BFD_RELOC_MIPS_GPREL32, R_MIPS_GPREL32 }
878 /* Given a BFD reloc type, return a howto structure. */
880 static reloc_howto_type *
881 bfd_elf32_bfd_reloc_type_lookup (abfd, code)
883 bfd_reloc_code_real_type code;
887 for (i = 0; i < sizeof (mips_reloc_map) / sizeof (struct elf_reloc_map); i++)
889 if (mips_reloc_map[i].bfd_reloc_val == code)
890 return &elf_mips_howto_table[(int) mips_reloc_map[i].elf_reloc_val];
895 /* Given a MIPS reloc type, fill in an arelent structure. */
898 mips_info_to_howto_rel (abfd, cache_ptr, dst)
901 Elf32_Internal_Rel *dst;
905 r_type = ELF32_R_TYPE (dst->r_info);
906 BFD_ASSERT (r_type < (unsigned int) R_MIPS_max);
907 cache_ptr->howto = &elf_mips_howto_table[r_type];
909 /* The addend for a GPREL16 or LITERAL relocation comes from the GP
910 value for the object file. We get the addend now, rather than
911 when we do the relocation, because the symbol manipulations done
912 by the linker may cause us to lose track of the input BFD. */
913 if (((*cache_ptr->sym_ptr_ptr)->flags & BSF_SECTION_SYM) != 0
914 && (r_type == (unsigned int) R_MIPS_GPREL16
915 || r_type == (unsigned int) R_MIPS_LITERAL))
916 cache_ptr->addend = elf_gp (abfd);
919 /* A .reginfo section holds a single Elf32_RegInfo structure. These
920 routines swap this structure in and out. They are used outside of
921 BFD, so they are globally visible. */
924 bfd_mips_elf32_swap_reginfo_in (abfd, ex, in)
926 const Elf32_External_RegInfo *ex;
929 in->ri_gprmask = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gprmask);
930 in->ri_cprmask[0] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[0]);
931 in->ri_cprmask[1] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[1]);
932 in->ri_cprmask[2] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[2]);
933 in->ri_cprmask[3] = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_cprmask[3]);
934 in->ri_gp_value = bfd_h_get_32 (abfd, (bfd_byte *) ex->ri_gp_value);
938 bfd_mips_elf32_swap_reginfo_out (abfd, in, ex)
940 const Elf32_RegInfo *in;
941 Elf32_External_RegInfo *ex;
943 bfd_h_put_32 (abfd, (bfd_vma) in->ri_gprmask,
944 (bfd_byte *) ex->ri_gprmask);
945 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[0],
946 (bfd_byte *) ex->ri_cprmask[0]);
947 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[1],
948 (bfd_byte *) ex->ri_cprmask[1]);
949 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[2],
950 (bfd_byte *) ex->ri_cprmask[2]);
951 bfd_h_put_32 (abfd, (bfd_vma) in->ri_cprmask[3],
952 (bfd_byte *) ex->ri_cprmask[3]);
953 bfd_h_put_32 (abfd, (bfd_vma) in->ri_gp_value,
954 (bfd_byte *) ex->ri_gp_value);
957 /* Swap an entry in a .gptab section. Note that these routines rely
958 on the equivalence of the two elements of the union. */
961 bfd_mips_elf32_swap_gptab_in (abfd, ex, in)
963 const Elf32_External_gptab *ex;
966 in->gt_entry.gt_g_value = bfd_h_get_32 (abfd, ex->gt_entry.gt_g_value);
967 in->gt_entry.gt_bytes = bfd_h_get_32 (abfd, ex->gt_entry.gt_bytes);
971 bfd_mips_elf32_swap_gptab_out (abfd, in, ex)
973 const Elf32_gptab *in;
974 Elf32_External_gptab *ex;
976 bfd_h_put_32 (abfd, (bfd_vma) in->gt_entry.gt_g_value,
977 ex->gt_entry.gt_g_value);
978 bfd_h_put_32 (abfd, (bfd_vma) in->gt_entry.gt_bytes,
979 ex->gt_entry.gt_bytes);
982 /* Determine whether a symbol is global for the purposes of splitting
983 the symbol table into global symbols and local symbols. At least
984 on Irix 5, this split must be between section symbols and all other
985 symbols. On most ELF targets the split is between static symbols
986 and externally visible symbols. */
990 mips_elf_sym_is_global (abfd, sym)
994 return (sym->flags & BSF_SECTION_SYM) == 0 ? true : false;
997 /* Set the right machine number for a MIPS ELF file. */
1000 mips_elf_object_p (abfd)
1003 switch (elf_elfheader (abfd)->e_flags & EF_MIPS_ARCH)
1007 /* Just use the default, which was set in elfcode.h. */
1011 (void) bfd_default_set_arch_mach (abfd, bfd_arch_mips, 6000);
1015 (void) bfd_default_set_arch_mach (abfd, bfd_arch_mips, 4000);
1019 /* Irix 5 is broken. Object file symbol tables are not always
1020 sorted correctly such that local symbols precede global symbols,
1021 and the sh_info field in the symbol table is not always right. */
1022 elf_bad_symtab (abfd) = true;
1027 /* The final processing done just before writing out a MIPS ELF object
1028 file. This gets the MIPS architecture right based on the machine
1033 mips_elf_final_write_processing (abfd, linker)
1039 Elf_Internal_Shdr **hdrpp;
1041 switch (bfd_get_mach (abfd))
1044 val = E_MIPS_ARCH_1;
1048 val = E_MIPS_ARCH_2;
1052 val = E_MIPS_ARCH_3;
1059 elf_elfheader (abfd)->e_flags &=~ EF_MIPS_ARCH;
1060 elf_elfheader (abfd)->e_flags |= val;
1062 /* Set the sh_info field for .gptab sections. */
1063 for (i = 1, hdrpp = elf_elfsections (abfd) + 1;
1064 i < elf_elfheader (abfd)->e_shnum;
1067 if ((*hdrpp)->sh_type == SHT_MIPS_GPTAB)
1072 BFD_ASSERT ((*hdrpp)->bfd_section != NULL);
1073 name = bfd_get_section_name (abfd, (*hdrpp)->bfd_section);
1074 BFD_ASSERT (name != NULL
1075 && strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0);
1076 sec = bfd_get_section_by_name (abfd, name + sizeof ".gptab" - 1);
1077 BFD_ASSERT (sec != NULL);
1078 (*hdrpp)->sh_info = elf_section_data (sec)->this_idx;
1083 /* Handle a MIPS specific section when reading an object file. This
1084 is called when elfcode.h finds a section with an unknown type.
1085 FIXME: We need to handle the SHF_MIPS_GPREL flag, but I'm not sure
1089 mips_elf_section_from_shdr (abfd, hdr, name)
1091 Elf32_Internal_Shdr *hdr;
1096 /* There ought to be a place to keep ELF backend specific flags, but
1097 at the moment there isn't one. We just keep track of the
1098 sections by their name, instead. Fortunately, the ABI gives
1099 suggested names for all the MIPS specific sections, so we will
1100 probably get away with this. */
1101 switch (hdr->sh_type)
1103 case SHT_MIPS_LIBLIST:
1104 if (strcmp (name, ".liblist") != 0)
1108 if (strcmp (name, ".msym") != 0)
1111 case SHT_MIPS_CONFLICT:
1112 if (strcmp (name, ".conflict") != 0)
1115 case SHT_MIPS_GPTAB:
1116 if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) != 0)
1119 case SHT_MIPS_UCODE:
1120 if (strcmp (name, ".ucode") != 0)
1123 case SHT_MIPS_DEBUG:
1124 if (strcmp (name, ".mdebug") != 0)
1127 case SHT_MIPS_REGINFO:
1128 if (strcmp (name, ".reginfo") != 0
1129 || hdr->sh_size != sizeof (Elf32_External_RegInfo))
1132 case SHT_MIPS_OPTIONS:
1133 if (strcmp (name, ".options") != 0)
1136 case SHT_MIPS_DWARF:
1137 if (strncmp (name, ".debug_", sizeof ".debug_" - 1) != 0)
1140 case SHT_MIPS_EVENTS:
1141 if (strncmp (name, ".MIPS.events.", sizeof ".MIPS.events." - 1) != 0)
1148 if (! _bfd_elf_make_section_from_shdr (abfd, hdr, name))
1150 newsect = hdr->bfd_section;
1152 if (hdr->sh_type == SHT_MIPS_DEBUG)
1154 if (! bfd_set_section_flags (abfd, newsect,
1155 (bfd_get_section_flags (abfd, newsect)
1160 /* FIXME: We should record sh_info for a .gptab section. */
1162 /* For a .reginfo section, set the gp value in the tdata information
1163 from the contents of this section. We need the gp value while
1164 processing relocs, so we just get it now. */
1165 if (hdr->sh_type == SHT_MIPS_REGINFO)
1167 Elf32_External_RegInfo ext;
1170 if (! bfd_get_section_contents (abfd, newsect, (PTR) &ext,
1171 (file_ptr) 0, sizeof ext))
1173 bfd_mips_elf32_swap_reginfo_in (abfd, &ext, &s);
1174 elf_gp (abfd) = s.ri_gp_value;
1180 /* Set the correct type for a MIPS ELF section. We do this by the
1181 section name, which is a hack, but ought to work. */
1184 mips_elf_fake_sections (abfd, hdr, sec)
1186 Elf32_Internal_Shdr *hdr;
1189 register const char *name;
1191 name = bfd_get_section_name (abfd, sec);
1193 if (strcmp (name, ".liblist") == 0)
1195 hdr->sh_type = SHT_MIPS_LIBLIST;
1196 hdr->sh_info = sec->_raw_size / sizeof (Elf32_Lib);
1197 /* FIXME: Set the sh_link field. */
1199 else if (strcmp (name, ".msym") == 0)
1201 hdr->sh_type = SHT_MIPS_MSYM;
1202 hdr->sh_entsize = 8;
1203 /* FIXME: Set the sh_info field. */
1205 else if (strcmp (name, ".conflict") == 0)
1206 hdr->sh_type = SHT_MIPS_CONFLICT;
1207 else if (strncmp (name, ".gptab.", sizeof ".gptab." - 1) == 0)
1209 hdr->sh_type = SHT_MIPS_GPTAB;
1210 hdr->sh_entsize = sizeof (Elf32_External_gptab);
1211 /* The sh_info field is set in mips_elf_final_write_processing. */
1213 else if (strcmp (name, ".ucode") == 0)
1214 hdr->sh_type = SHT_MIPS_UCODE;
1215 else if (strcmp (name, ".mdebug") == 0)
1217 hdr->sh_type = SHT_MIPS_DEBUG;
1218 hdr->sh_entsize = 1;
1220 else if (strcmp (name, ".reginfo") == 0)
1222 hdr->sh_type = SHT_MIPS_REGINFO;
1223 hdr->sh_entsize = 1;
1225 /* Force the section size to the correct value, even if the
1226 linker thinks it is larger. The link routine below will only
1227 write out this much data for .reginfo. */
1228 hdr->sh_size = sec->_raw_size = sizeof (Elf32_External_RegInfo);
1230 else if (strcmp (name, ".options") == 0)
1232 hdr->sh_type = SHT_MIPS_OPTIONS;
1233 hdr->sh_entsize = 1;
1235 else if (strncmp (name, ".debug_", sizeof ".debug_" - 1) == 0)
1236 hdr->sh_type = SHT_MIPS_DWARF;
1237 else if (strncmp (name, ".MIPS.events.", sizeof ".MIPS.events." - 1) == 0)
1238 hdr->sh_type = SHT_MIPS_EVENTS;
1243 /* Given a BFD section, try to locate the corresponding ELF section
1247 mips_elf_section_from_bfd_section (abfd, hdr, sec, retval)
1249 Elf32_Internal_Shdr *hdr;
1253 if (strcmp (bfd_get_section_name (abfd, sec), ".scommon") == 0)
1255 *retval = SHN_MIPS_SCOMMON;
1258 if (strcmp (bfd_get_section_name (abfd, sec), ".acommon") == 0)
1260 *retval = SHN_MIPS_ACOMMON;
1266 /* Work over a section just before writing it out. We update the GP
1267 value in the .reginfo section based on the value we are using.
1268 FIXME: We recognize sections that need the SHF_MIPS_GPREL flag by
1269 name; there has to be a better way. */
1272 mips_elf_section_processing (abfd, hdr)
1274 Elf32_Internal_Shdr *hdr;
1276 if (hdr->sh_type == SHT_MIPS_REGINFO)
1280 BFD_ASSERT (hdr->sh_size == sizeof (Elf32_External_RegInfo));
1281 BFD_ASSERT (hdr->contents == NULL);
1284 hdr->sh_offset + sizeof (Elf32_External_RegInfo) - 4,
1287 bfd_h_put_32 (abfd, (bfd_vma) elf_gp (abfd), buf);
1288 if (bfd_write (buf, (bfd_size_type) 1, (bfd_size_type) 4, abfd) != 4)
1292 if (hdr->bfd_section != NULL)
1294 const char *name = bfd_get_section_name (abfd, hdr->bfd_section);
1296 if (strcmp (name, ".sdata") == 0)
1298 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
1299 hdr->sh_type = SHT_PROGBITS;
1301 else if (strcmp (name, ".sbss") == 0)
1303 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
1304 hdr->sh_type = SHT_NOBITS;
1306 else if (strcmp (name, ".lit8") == 0
1307 || strcmp (name, ".lit4") == 0)
1309 hdr->sh_flags |= SHF_ALLOC | SHF_WRITE | SHF_MIPS_GPREL;
1310 hdr->sh_type = SHT_PROGBITS;
1317 /* MIPS ELF uses two common sections. One is the usual one, and the
1318 other is for small objects. All the small objects are kept
1319 together, and then referenced via the gp pointer, which yields
1320 faster assembler code. This is what we use for the small common
1321 section. This approach is copied from ecoff.c. */
1322 static asection mips_elf_scom_section;
1323 static asymbol mips_elf_scom_symbol;
1324 static asymbol *mips_elf_scom_symbol_ptr;
1326 /* MIPS ELF also uses an acommon section, which represents an
1327 allocated common symbol which may be overridden by a
1328 definition in a shared library. */
1329 static asection mips_elf_acom_section;
1330 static asymbol mips_elf_acom_symbol;
1331 static asymbol *mips_elf_acom_symbol_ptr;
1333 /* Handle the special MIPS section numbers that a symbol may use. */
1336 mips_elf_symbol_processing (abfd, asym)
1340 elf_symbol_type *elfsym;
1342 elfsym = (elf_symbol_type *) asym;
1343 switch (elfsym->internal_elf_sym.st_shndx)
1345 case SHN_MIPS_ACOMMON:
1346 /* This section is used in a dynamically linked executable file.
1347 It is an allocated common section. The dynamic linker can
1348 either resolve these symbols to something in a shared
1349 library, or it can just leave them here. For our purposes,
1350 we can consider these symbols to be in a new section. */
1351 if (mips_elf_acom_section.name == NULL)
1353 /* Initialize the acommon section. */
1354 mips_elf_acom_section.name = ".acommon";
1355 mips_elf_acom_section.flags = SEC_ALLOC;
1356 mips_elf_acom_section.output_section = &mips_elf_acom_section;
1357 mips_elf_acom_section.symbol = &mips_elf_acom_symbol;
1358 mips_elf_acom_section.symbol_ptr_ptr = &mips_elf_acom_symbol_ptr;
1359 mips_elf_acom_symbol.name = ".acommon";
1360 mips_elf_acom_symbol.flags = BSF_SECTION_SYM;
1361 mips_elf_acom_symbol.section = &mips_elf_acom_section;
1362 mips_elf_acom_symbol_ptr = &mips_elf_acom_symbol;
1364 asym->section = &mips_elf_acom_section;
1368 /* Common symbols less than the GP size are automatically
1369 treated as SHN_MIPS_SCOMMON symbols. */
1370 if (asym->value > elf_gp_size (abfd))
1373 case SHN_MIPS_SCOMMON:
1374 if (mips_elf_scom_section.name == NULL)
1376 /* Initialize the small common section. */
1377 mips_elf_scom_section.name = ".scommon";
1378 mips_elf_scom_section.flags = SEC_IS_COMMON;
1379 mips_elf_scom_section.output_section = &mips_elf_scom_section;
1380 mips_elf_scom_section.symbol = &mips_elf_scom_symbol;
1381 mips_elf_scom_section.symbol_ptr_ptr = &mips_elf_scom_symbol_ptr;
1382 mips_elf_scom_symbol.name = ".scommon";
1383 mips_elf_scom_symbol.flags = BSF_SECTION_SYM;
1384 mips_elf_scom_symbol.section = &mips_elf_scom_section;
1385 mips_elf_scom_symbol_ptr = &mips_elf_scom_symbol;
1387 asym->section = &mips_elf_scom_section;
1388 asym->value = elfsym->internal_elf_sym.st_size;
1391 case SHN_MIPS_SUNDEFINED:
1392 asym->section = bfd_und_section_ptr;
1397 /* Read ECOFF debugging information from a .mdebug section into a
1398 ecoff_debug_info structure. */
1401 mips_elf_read_ecoff_info (abfd, section, debug)
1404 struct ecoff_debug_info *debug;
1407 const struct ecoff_debug_swap *swap;
1408 char *ext_hdr = NULL;
1410 swap = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1412 ext_hdr = (char *) malloc ((size_t) swap->external_hdr_size);
1413 if (ext_hdr == NULL && swap->external_hdr_size != 0)
1415 bfd_set_error (bfd_error_no_memory);
1419 if (bfd_get_section_contents (abfd, section, ext_hdr, (file_ptr) 0,
1420 swap->external_hdr_size)
1424 symhdr = &debug->symbolic_header;
1425 (*swap->swap_hdr_in) (abfd, ext_hdr, symhdr);
1427 /* The symbolic header contains absolute file offsets and sizes to
1429 #define READ(ptr, offset, count, size, type) \
1430 if (symhdr->count == 0) \
1431 debug->ptr = NULL; \
1434 debug->ptr = (type) malloc ((size_t) (size * symhdr->count)); \
1435 if (debug->ptr == NULL) \
1437 bfd_set_error (bfd_error_no_memory); \
1438 goto error_return; \
1440 if (bfd_seek (abfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
1441 || (bfd_read (debug->ptr, size, symhdr->count, \
1442 abfd) != size * symhdr->count)) \
1443 goto error_return; \
1446 READ (line, cbLineOffset, cbLine, sizeof (unsigned char), unsigned char *);
1447 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, PTR);
1448 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, PTR);
1449 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, PTR);
1450 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, PTR);
1451 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
1453 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
1454 READ (ssext, cbSsExtOffset, issExtMax, sizeof (char), char *);
1455 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, PTR);
1456 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, PTR);
1457 READ (external_ext, cbExtOffset, iextMax, swap->external_ext_size, PTR);
1461 debug->adjust = NULL;
1466 if (ext_hdr != NULL)
1468 if (debug->line != NULL)
1470 if (debug->external_dnr != NULL)
1471 free (debug->external_dnr);
1472 if (debug->external_pdr != NULL)
1473 free (debug->external_pdr);
1474 if (debug->external_sym != NULL)
1475 free (debug->external_sym);
1476 if (debug->external_opt != NULL)
1477 free (debug->external_opt);
1478 if (debug->external_aux != NULL)
1479 free (debug->external_aux);
1480 if (debug->ss != NULL)
1482 if (debug->ssext != NULL)
1483 free (debug->ssext);
1484 if (debug->external_fdr != NULL)
1485 free (debug->external_fdr);
1486 if (debug->external_rfd != NULL)
1487 free (debug->external_rfd);
1488 if (debug->external_ext != NULL)
1489 free (debug->external_ext);
1493 /* MIPS ELF local labels start with '$', not 'L'. */
1497 mips_elf_is_local_label (abfd, symbol)
1501 return symbol->name[0] == '$';
1504 /* MIPS ELF uses a special find_nearest_line routine in order the
1505 handle the ECOFF debugging information. */
1507 struct mips_elf_find_line
1509 struct ecoff_debug_info d;
1510 struct ecoff_find_line i;
1514 mips_elf_find_nearest_line (abfd, section, symbols, offset, filename_ptr,
1515 functionname_ptr, line_ptr)
1520 const char **filename_ptr;
1521 const char **functionname_ptr;
1522 unsigned int *line_ptr;
1526 msec = bfd_get_section_by_name (abfd, ".mdebug");
1530 struct mips_elf_find_line *fi;
1531 const struct ecoff_debug_swap * const swap =
1532 get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1534 /* If we are called during a link, mips_elf_final_link may have
1535 cleared the SEC_HAS_CONTENTS field. We force it back on here
1536 if appropriate (which it normally will be). */
1537 origflags = msec->flags;
1538 if (elf_section_data (msec)->this_hdr.sh_type != SHT_NOBITS)
1539 msec->flags |= SEC_HAS_CONTENTS;
1541 fi = elf_tdata (abfd)->find_line_info;
1544 bfd_size_type external_fdr_size;
1547 struct fdr *fdr_ptr;
1549 fi = ((struct mips_elf_find_line *)
1550 bfd_alloc (abfd, sizeof (struct mips_elf_find_line)));
1553 bfd_set_error (bfd_error_no_memory);
1554 msec->flags = origflags;
1558 memset (fi, 0, sizeof (struct mips_elf_find_line));
1560 if (! mips_elf_read_ecoff_info (abfd, msec, &fi->d))
1562 msec->flags = origflags;
1566 /* Swap in the FDR information. */
1567 fi->d.fdr = ((struct fdr *)
1569 (fi->d.symbolic_header.ifdMax *
1570 sizeof (struct fdr))));
1571 if (fi->d.fdr == NULL)
1573 bfd_set_error (bfd_error_no_memory);
1574 msec->flags = origflags;
1577 external_fdr_size = swap->external_fdr_size;
1578 fdr_ptr = fi->d.fdr;
1579 fraw_src = (char *) fi->d.external_fdr;
1580 fraw_end = (fraw_src
1581 + fi->d.symbolic_header.ifdMax * external_fdr_size);
1582 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
1583 (*swap->swap_fdr_in) (abfd, (PTR) fraw_src, fdr_ptr);
1585 elf_tdata (abfd)->find_line_info = fi;
1587 /* Note that we don't bother to ever free this information.
1588 find_nearest_line is either called all the time, as in
1589 objdump -l, so the information should be saved, or it is
1590 rarely called, as in ld error messages, so the memory
1591 wasted is unimportant. Still, it would probably be a
1592 good idea for free_cached_info to throw it away. */
1595 if (_bfd_ecoff_locate_line (abfd, section, offset, &fi->d, swap,
1596 &fi->i, filename_ptr, functionname_ptr,
1599 msec->flags = origflags;
1603 msec->flags = origflags;
1606 /* Fall back on the generic ELF find_nearest_line routine. */
1608 return _bfd_elf_find_nearest_line (abfd, section, symbols, offset,
1609 filename_ptr, functionname_ptr,
1613 /* The MIPS ELF linker needs additional information for each symbol in
1614 the global hash table. */
1616 struct mips_elf_link_hash_entry
1618 struct elf_link_hash_entry root;
1620 /* External symbol information. */
1624 /* MIPS ELF linker hash table. */
1626 struct mips_elf_link_hash_table
1628 struct elf_link_hash_table root;
1631 /* Look up an entry in a MIPS ELF linker hash table. */
1633 #define mips_elf_link_hash_lookup(table, string, create, copy, follow) \
1634 ((struct mips_elf_link_hash_entry *) \
1635 elf_link_hash_lookup (&(table)->root, (string), (create), \
1638 /* Traverse a MIPS ELF linker hash table. */
1640 #define mips_elf_link_hash_traverse(table, func, info) \
1641 (elf_link_hash_traverse \
1643 (boolean (*) PARAMS ((struct elf_link_hash_entry *, PTR))) (func), \
1646 /* Get the MIPS ELF linker hash table from a link_info structure. */
1648 #define mips_elf_hash_table(p) \
1649 ((struct mips_elf_link_hash_table *) ((p)->hash))
1651 static boolean mips_elf_output_extsym
1652 PARAMS ((struct mips_elf_link_hash_entry *, PTR));
1654 /* Create an entry in a MIPS ELF linker hash table. */
1656 static struct bfd_hash_entry *
1657 mips_elf_link_hash_newfunc (entry, table, string)
1658 struct bfd_hash_entry *entry;
1659 struct bfd_hash_table *table;
1662 struct mips_elf_link_hash_entry *ret =
1663 (struct mips_elf_link_hash_entry *) entry;
1665 /* Allocate the structure if it has not already been allocated by a
1667 if (ret == (struct mips_elf_link_hash_entry *) NULL)
1668 ret = ((struct mips_elf_link_hash_entry *)
1669 bfd_hash_allocate (table,
1670 sizeof (struct mips_elf_link_hash_entry)));
1671 if (ret == (struct mips_elf_link_hash_entry *) NULL)
1673 bfd_set_error (bfd_error_no_memory);
1674 return (struct bfd_hash_entry *) ret;
1677 /* Call the allocation method of the superclass. */
1678 ret = ((struct mips_elf_link_hash_entry *)
1679 _bfd_elf_link_hash_newfunc ((struct bfd_hash_entry *) ret,
1681 if (ret != (struct mips_elf_link_hash_entry *) NULL)
1683 /* Set local fields. */
1684 memset (&ret->esym, 0, sizeof (EXTR));
1685 /* We use -2 as a marker to indicate that the information has
1686 not been set. -1 means there is no associated ifd. */
1690 return (struct bfd_hash_entry *) ret;
1693 /* Create a MIPS ELF linker hash table. */
1695 static struct bfd_link_hash_table *
1696 mips_elf_link_hash_table_create (abfd)
1699 struct mips_elf_link_hash_table *ret;
1701 ret = ((struct mips_elf_link_hash_table *)
1702 bfd_alloc (abfd, sizeof (struct mips_elf_link_hash_table)));
1703 if (ret == (struct mips_elf_link_hash_table *) NULL)
1705 bfd_set_error (bfd_error_no_memory);
1709 if (! _bfd_elf_link_hash_table_init (&ret->root, abfd,
1710 mips_elf_link_hash_newfunc))
1712 bfd_release (abfd, ret);
1716 return &ret->root.root;
1719 /* Hook called by the linker routine which adds symbols from an object
1720 file. We must handle the special MIPS section numbers here. */
1724 mips_elf_add_symbol_hook (abfd, info, sym, namep, flagsp, secp, valp)
1726 struct bfd_link_info *info;
1727 const Elf_Internal_Sym *sym;
1733 switch (sym->st_shndx)
1736 /* Common symbols less than the GP size are automatically
1737 treated as SHN_MIPS_SCOMMON symbols. */
1738 if (sym->st_size > elf_gp_size (abfd))
1741 case SHN_MIPS_SCOMMON:
1742 *secp = bfd_make_section_old_way (abfd, ".scommon");
1743 (*secp)->flags |= SEC_IS_COMMON;
1744 *valp = sym->st_size;
1747 case SHN_MIPS_SUNDEFINED:
1748 *secp = bfd_und_section_ptr;
1755 /* Structure used to pass information to mips_elf_output_extsym. */
1760 struct bfd_link_info *info;
1761 struct ecoff_debug_info *debug;
1762 const struct ecoff_debug_swap *swap;
1766 /* This routine is used to write out ECOFF debugging external symbol
1767 information. It is called via mips_elf_link_hash_traverse. The
1768 ECOFF external symbol information must match the ELF external
1769 symbol information. Unfortunately, at this point we don't know
1770 whether a symbol is required by reloc information, so the two
1771 tables may wind up being different. We must sort out the external
1772 symbol information before we can set the final size of the .mdebug
1773 section, and we must set the size of the .mdebug section before we
1774 can relocate any sections, and we can't know which symbols are
1775 required by relocation until we relocate the sections.
1776 Fortunately, it is relatively unlikely that any symbol will be
1777 stripped but required by a reloc. In particular, it can not happen
1778 when generating a final executable. */
1781 mips_elf_output_extsym (h, data)
1782 struct mips_elf_link_hash_entry *h;
1785 struct extsym_info *einfo = (struct extsym_info *) data;
1788 if (h->root.indx == -2)
1790 else if (((h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_DYNAMIC) != 0
1791 || (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_DYNAMIC) != 0)
1792 && (h->root.elf_link_hash_flags & ELF_LINK_HASH_DEF_REGULAR) == 0
1793 && (h->root.elf_link_hash_flags & ELF_LINK_HASH_REF_REGULAR) == 0)
1795 else if (einfo->info->strip == strip_all
1796 || (einfo->info->strip == strip_some
1797 && bfd_hash_lookup (einfo->info->keep_hash,
1798 h->root.root.root.string,
1799 false, false) == NULL))
1807 if (h->esym.ifd == -2)
1810 h->esym.cobol_main = 0;
1811 h->esym.weakext = 0;
1812 h->esym.reserved = 0;
1813 h->esym.ifd = ifdNil;
1814 h->esym.asym.value = 0;
1815 h->esym.asym.st = stGlobal;
1817 if (h->root.root.type != bfd_link_hash_defined
1818 && h->root.root.type != bfd_link_hash_defweak)
1819 h->esym.asym.sc = scAbs;
1822 asection *output_section;
1825 output_section = h->root.root.u.def.section->output_section;
1826 name = bfd_section_name (output_section->owner, output_section);
1828 if (strcmp (name, ".text") == 0)
1829 h->esym.asym.sc = scText;
1830 else if (strcmp (name, ".data") == 0)
1831 h->esym.asym.sc = scData;
1832 else if (strcmp (name, ".sdata") == 0)
1833 h->esym.asym.sc = scSData;
1834 else if (strcmp (name, ".rodata") == 0
1835 || strcmp (name, ".rdata") == 0)
1836 h->esym.asym.sc = scRData;
1837 else if (strcmp (name, ".bss") == 0)
1838 h->esym.asym.sc = scBss;
1839 else if (strcmp (name, ".sbss") == 0)
1840 h->esym.asym.sc = scSBss;
1841 else if (strcmp (name, ".init") == 0)
1842 h->esym.asym.sc = scInit;
1843 else if (strcmp (name, ".fini") == 0)
1844 h->esym.asym.sc = scFini;
1846 h->esym.asym.sc = scAbs;
1849 h->esym.asym.reserved = 0;
1850 h->esym.asym.index = indexNil;
1853 if (h->root.root.type == bfd_link_hash_common)
1854 h->esym.asym.value = h->root.root.u.c.size;
1855 else if (h->root.root.type == bfd_link_hash_defined
1856 || h->root.root.type == bfd_link_hash_defweak)
1860 if (h->esym.asym.sc == scCommon)
1861 h->esym.asym.sc = scBss;
1862 else if (h->esym.asym.sc == scSCommon)
1863 h->esym.asym.sc = scSBss;
1865 sec = h->root.root.u.def.section;
1866 h->esym.asym.value = (h->root.root.u.def.value
1867 + sec->output_offset
1868 + sec->output_section->vma);
1871 if (! bfd_ecoff_debug_one_external (einfo->abfd, einfo->debug, einfo->swap,
1872 h->root.root.root.string,
1875 einfo->failed = true;
1882 /* A comparison routine used to sort .gptab entries. */
1885 gptab_compare (p1, p2)
1889 const Elf32_gptab *a1 = (const Elf32_gptab *) p1;
1890 const Elf32_gptab *a2 = (const Elf32_gptab *) p2;
1892 return a1->gt_entry.gt_g_value - a2->gt_entry.gt_g_value;
1895 /* We need to use a special link routine to handle the .reginfo and
1896 the .mdebug sections. We need to merge all instances of these
1897 sections together, not write them all out sequentially. */
1900 mips_elf_final_link (abfd, info)
1902 struct bfd_link_info *info;
1906 struct bfd_link_order *p;
1907 asection *reginfo_sec, *mdebug_sec, *gptab_data_sec, *gptab_bss_sec;
1908 Elf32_RegInfo reginfo;
1909 struct ecoff_debug_info debug;
1910 const struct ecoff_debug_swap *swap
1911 = get_elf_backend_data (abfd)->elf_backend_ecoff_debug_swap;
1912 HDRR *symhdr = &debug.symbolic_header;
1913 PTR mdebug_handle = NULL;
1915 /* Drop the .options section, since it has special semantics which I
1916 haven't bothered to figure out. */
1917 for (secpp = &abfd->sections; *secpp != NULL; secpp = &(*secpp)->next)
1919 if (strcmp ((*secpp)->name, ".options") == 0)
1921 for (p = (*secpp)->link_order_head; p != NULL; p = p->next)
1922 if (p->type == bfd_indirect_link_order)
1923 p->u.indirect.section->flags &=~ SEC_HAS_CONTENTS;
1924 (*secpp)->link_order_head = NULL;
1925 *secpp = (*secpp)->next;
1926 --abfd->section_count;
1931 /* Go through the sections and collect the .reginfo and .mdebug
1935 gptab_data_sec = NULL;
1936 gptab_bss_sec = NULL;
1937 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
1939 if (strcmp (o->name, ".reginfo") == 0)
1941 memset (®info, 0, sizeof reginfo);
1943 /* We have found the .reginfo section in the output file.
1944 Look through all the link_orders comprising it and merge
1945 the information together. */
1946 for (p = o->link_order_head;
1947 p != (struct bfd_link_order *) NULL;
1950 asection *input_section;
1952 Elf32_External_RegInfo ext;
1955 if (p->type != bfd_indirect_link_order)
1957 if (p->type == bfd_fill_link_order)
1962 input_section = p->u.indirect.section;
1963 input_bfd = input_section->owner;
1965 /* The linker emulation code has probably clobbered the
1966 size to be zero bytes. */
1967 if (input_section->_raw_size == 0)
1968 input_section->_raw_size = sizeof (Elf32_External_RegInfo);
1970 if (! bfd_get_section_contents (input_bfd, input_section,
1976 bfd_mips_elf32_swap_reginfo_in (input_bfd, &ext, &sub);
1978 reginfo.ri_gprmask |= sub.ri_gprmask;
1979 reginfo.ri_cprmask[0] |= sub.ri_cprmask[0];
1980 reginfo.ri_cprmask[1] |= sub.ri_cprmask[1];
1981 reginfo.ri_cprmask[2] |= sub.ri_cprmask[2];
1982 reginfo.ri_cprmask[3] |= sub.ri_cprmask[3];
1984 /* ri_gp_value is set by the function
1985 mips_elf_section_processing when the section is
1986 finally written out. */
1988 /* Hack: reset the SEC_HAS_CONTENTS flag so that
1989 elf_link_input_bfd ignores this section. */
1990 input_section->flags &=~ SEC_HAS_CONTENTS;
1993 /* Force the section size to the value we want. */
1994 o->_raw_size = sizeof (Elf32_External_RegInfo);
1996 /* Skip this section later on (I don't think this currently
1997 matters, but someday it might). */
1998 o->link_order_head = (struct bfd_link_order *) NULL;
2003 if (strcmp (o->name, ".mdebug") == 0)
2005 struct extsym_info einfo;
2007 /* We have found the .mdebug section in the output file.
2008 Look through all the link_orders comprising it and merge
2009 the information together. */
2010 symhdr->magic = swap->sym_magic;
2011 /* FIXME: What should the version stamp be? */
2013 symhdr->ilineMax = 0;
2017 symhdr->isymMax = 0;
2018 symhdr->ioptMax = 0;
2019 symhdr->iauxMax = 0;
2021 symhdr->issExtMax = 0;
2024 symhdr->iextMax = 0;
2026 /* We accumulate the debugging information itself in the
2027 debug_info structure. */
2029 debug.external_dnr = NULL;
2030 debug.external_pdr = NULL;
2031 debug.external_sym = NULL;
2032 debug.external_opt = NULL;
2033 debug.external_aux = NULL;
2035 debug.ssext = debug.ssext_end = NULL;
2036 debug.external_fdr = NULL;
2037 debug.external_rfd = NULL;
2038 debug.external_ext = debug.external_ext_end = NULL;
2040 mdebug_handle = bfd_ecoff_debug_init (abfd, &debug, swap, info);
2041 if (mdebug_handle == (PTR) NULL)
2044 for (p = o->link_order_head;
2045 p != (struct bfd_link_order *) NULL;
2048 asection *input_section;
2050 const struct ecoff_debug_swap *input_swap;
2051 struct ecoff_debug_info input_debug;
2055 if (p->type != bfd_indirect_link_order)
2057 if (p->type == bfd_fill_link_order)
2062 input_section = p->u.indirect.section;
2063 input_bfd = input_section->owner;
2065 if (bfd_get_flavour (input_bfd) != bfd_target_elf_flavour
2066 || (get_elf_backend_data (input_bfd)
2067 ->elf_backend_ecoff_debug_swap) == NULL)
2069 /* I don't know what a non MIPS ELF bfd would be
2070 doing with a .mdebug section, but I don't really
2071 want to deal with it. */
2075 input_swap = (get_elf_backend_data (input_bfd)
2076 ->elf_backend_ecoff_debug_swap);
2078 BFD_ASSERT (p->size == input_section->_raw_size);
2080 /* The ECOFF linking code expects that we have already
2081 read in the debugging information and set up an
2082 ecoff_debug_info structure, so we do that now. */
2083 if (! mips_elf_read_ecoff_info (input_bfd, input_section,
2087 if (! (bfd_ecoff_debug_accumulate
2088 (mdebug_handle, abfd, &debug, swap, input_bfd,
2089 &input_debug, input_swap, info)))
2092 /* Loop through the external symbols. For each one with
2093 interesting information, try to find the symbol in
2094 the linker global hash table and save the information
2095 for the output external symbols. */
2096 eraw_src = input_debug.external_ext;
2097 eraw_end = (eraw_src
2098 + (input_debug.symbolic_header.iextMax
2099 * input_swap->external_ext_size));
2101 eraw_src < eraw_end;
2102 eraw_src += input_swap->external_ext_size)
2106 struct mips_elf_link_hash_entry *h;
2108 (*input_swap->swap_ext_in) (input_bfd, (PTR) eraw_src, &ext);
2109 if (ext.asym.sc == scNil
2110 || ext.asym.sc == scUndefined
2111 || ext.asym.sc == scSUndefined)
2114 name = input_debug.ssext + ext.asym.iss;
2115 h = mips_elf_link_hash_lookup (mips_elf_hash_table (info),
2116 name, false, false, true);
2117 if (h == NULL || h->esym.ifd != -2)
2123 < input_debug.symbolic_header.ifdMax);
2124 ext.ifd = input_debug.ifdmap[ext.ifd];
2130 /* Free up the information we just read. */
2131 free (input_debug.line);
2132 free (input_debug.external_dnr);
2133 free (input_debug.external_pdr);
2134 free (input_debug.external_sym);
2135 free (input_debug.external_opt);
2136 free (input_debug.external_aux);
2137 free (input_debug.ss);
2138 free (input_debug.ssext);
2139 free (input_debug.external_fdr);
2140 free (input_debug.external_rfd);
2141 free (input_debug.external_ext);
2143 /* Hack: reset the SEC_HAS_CONTENTS flag so that
2144 elf_link_input_bfd ignores this section. */
2145 input_section->flags &=~ SEC_HAS_CONTENTS;
2148 /* Build the external symbol information. */
2151 einfo.debug = &debug;
2153 einfo.failed = false;
2154 mips_elf_link_hash_traverse (mips_elf_hash_table (info),
2155 mips_elf_output_extsym,
2160 /* Set the size of the .mdebug section. */
2161 o->_raw_size = bfd_ecoff_debug_size (abfd, &debug, swap);
2163 /* Skip this section later on (I don't think this currently
2164 matters, but someday it might). */
2165 o->link_order_head = (struct bfd_link_order *) NULL;
2170 if (strncmp (o->name, ".gptab.", sizeof ".gptab." - 1) == 0)
2172 const char *subname;
2175 Elf32_External_gptab *ext_tab;
2178 /* The .gptab.sdata and .gptab.sbss sections hold
2179 information describing how the small data area would
2180 change depending upon the -G switch. These sections
2181 not used in executables files. */
2182 if (! info->relocateable)
2186 for (p = o->link_order_head;
2187 p != (struct bfd_link_order *) NULL;
2190 asection *input_section;
2192 if (p->type != bfd_indirect_link_order)
2194 if (p->type == bfd_fill_link_order)
2199 input_section = p->u.indirect.section;
2201 /* Hack: reset the SEC_HAS_CONTENTS flag so that
2202 elf_link_input_bfd ignores this section. */
2203 input_section->flags &=~ SEC_HAS_CONTENTS;
2206 /* Skip this section later on (I don't think this
2207 currently matters, but someday it might). */
2208 o->link_order_head = (struct bfd_link_order *) NULL;
2210 /* Really remove the section. */
2211 for (secpp = &abfd->sections;
2213 secpp = &(*secpp)->next)
2215 *secpp = (*secpp)->next;
2216 --abfd->section_count;
2221 /* There is one gptab for initialized data, and one for
2222 uninitialized data. */
2223 if (strcmp (o->name, ".gptab.sdata") == 0)
2225 else if (strcmp (o->name, ".gptab.sbss") == 0)
2229 bfd_set_error (bfd_error_nonrepresentable_section);
2233 /* The linker script always combines .gptab.data and
2234 .gptab.sdata into .gptab.sdata, and likewise for
2235 .gptab.bss and .gptab.sbss. It is possible that there is
2236 no .sdata or .sbss section in the output file, in which
2237 case we must change the name of the output section. */
2238 subname = o->name + sizeof ".gptab" - 1;
2239 if (bfd_get_section_by_name (abfd, subname) == NULL)
2241 if (o == gptab_data_sec)
2242 o->name = ".gptab.data";
2244 o->name = ".gptab.bss";
2245 subname = o->name + sizeof ".gptab" - 1;
2246 BFD_ASSERT (bfd_get_section_by_name (abfd, subname) != NULL);
2249 /* Set up the first entry. */
2251 tab = (Elf32_gptab *) malloc (c * sizeof (Elf32_gptab));
2254 bfd_set_error (bfd_error_no_memory);
2257 tab[0].gt_header.gt_current_g_value = elf_gp_size (abfd);
2258 tab[0].gt_header.gt_unused = 0;
2260 /* Combine the input sections. */
2261 for (p = o->link_order_head;
2262 p != (struct bfd_link_order *) NULL;
2265 asection *input_section;
2269 bfd_size_type gpentry;
2271 if (p->type != bfd_indirect_link_order)
2273 if (p->type == bfd_fill_link_order)
2278 input_section = p->u.indirect.section;
2279 input_bfd = input_section->owner;
2281 /* Combine the gptab entries for this input section one
2282 by one. We know that the input gptab entries are
2283 sorted by ascending -G value. */
2284 size = bfd_section_size (input_bfd, input_section);
2286 for (gpentry = sizeof (Elf32_External_gptab);
2288 gpentry += sizeof (Elf32_External_gptab))
2290 Elf32_External_gptab ext_gptab;
2291 Elf32_gptab int_gptab;
2297 if (! (bfd_get_section_contents
2298 (input_bfd, input_section, (PTR) &ext_gptab,
2299 gpentry, sizeof (Elf32_External_gptab))))
2305 bfd_mips_elf32_swap_gptab_in (input_bfd, &ext_gptab,
2307 val = int_gptab.gt_entry.gt_g_value;
2308 add = int_gptab.gt_entry.gt_bytes - last;
2311 for (look = 1; look < c; look++)
2313 if (tab[look].gt_entry.gt_g_value >= val)
2314 tab[look].gt_entry.gt_bytes += add;
2316 if (tab[look].gt_entry.gt_g_value == val)
2322 Elf32_gptab *new_tab;
2325 /* We need a new table entry. */
2326 new_tab = ((Elf32_gptab *)
2328 (c + 1) * sizeof (Elf32_gptab)));
2329 if (new_tab == NULL)
2331 bfd_set_error (bfd_error_no_memory);
2336 tab[c].gt_entry.gt_g_value = val;
2337 tab[c].gt_entry.gt_bytes = add;
2339 /* Merge in the size for the next smallest -G
2340 value, since that will be implied by this new
2343 for (look = 1; look < c; look++)
2345 if (tab[look].gt_entry.gt_g_value < val
2347 || (tab[look].gt_entry.gt_g_value
2348 > tab[max].gt_entry.gt_g_value)))
2352 tab[c].gt_entry.gt_bytes +=
2353 tab[max].gt_entry.gt_bytes;
2358 last = int_gptab.gt_entry.gt_bytes;
2361 /* Hack: reset the SEC_HAS_CONTENTS flag so that
2362 elf_link_input_bfd ignores this section. */
2363 input_section->flags &=~ SEC_HAS_CONTENTS;
2366 /* The table must be sorted by -G value. */
2368 qsort (tab + 1, c - 1, sizeof (tab[0]), gptab_compare);
2370 /* Swap out the table. */
2371 ext_tab = ((Elf32_External_gptab *)
2372 bfd_alloc (abfd, c * sizeof (Elf32_External_gptab)));
2373 if (ext_tab == NULL)
2375 bfd_set_error (bfd_error_no_memory);
2380 for (i = 0; i < c; i++)
2381 bfd_mips_elf32_swap_gptab_out (abfd, tab + i, ext_tab + i);
2384 o->_raw_size = c * sizeof (Elf32_External_gptab);
2385 o->contents = (bfd_byte *) ext_tab;
2387 /* Skip this section later on (I don't think this currently
2388 matters, but someday it might). */
2389 o->link_order_head = (struct bfd_link_order *) NULL;
2393 /* Get a value for the GP register. */
2394 if (elf_gp (abfd) == 0)
2396 struct bfd_link_hash_entry *h;
2398 h = bfd_link_hash_lookup (info->hash, "_gp", false, false, true);
2399 if (h != (struct bfd_link_hash_entry *) NULL
2400 && h->type == bfd_link_hash_defined)
2401 elf_gp (abfd) = (h->u.def.value
2402 + h->u.def.section->output_section->vma
2403 + h->u.def.section->output_offset);
2404 else if (info->relocateable)
2408 /* Make up a value. */
2410 for (o = abfd->sections; o != (asection *) NULL; o = o->next)
2413 && (strcmp (o->name, ".sbss") == 0
2414 || strcmp (o->name, ".sdata") == 0
2415 || strcmp (o->name, ".lit4") == 0
2416 || strcmp (o->name, ".lit8") == 0))
2419 elf_gp (abfd) = lo + 0x8000;
2423 /* If the relocate_section function needs to do a reloc
2424 involving the GP value, it should make a reloc_dangerous
2425 callback to warn that GP is not defined. */
2429 /* Invoke the regular ELF backend linker to do all the work. */
2430 if (! bfd_elf32_bfd_final_link (abfd, info))
2433 /* Now write out the computed sections. */
2435 if (reginfo_sec != (asection *) NULL)
2437 Elf32_External_RegInfo ext;
2439 bfd_mips_elf32_swap_reginfo_out (abfd, ®info, &ext);
2440 if (! bfd_set_section_contents (abfd, reginfo_sec, (PTR) &ext,
2441 (file_ptr) 0, sizeof ext))
2445 if (mdebug_sec != (asection *) NULL)
2447 BFD_ASSERT (abfd->output_has_begun);
2448 if (! bfd_ecoff_write_accumulated_debug (mdebug_handle, abfd, &debug,
2450 mdebug_sec->filepos))
2453 bfd_ecoff_debug_free (mdebug_handle, abfd, &debug, swap, info);
2456 if (gptab_data_sec != (asection *) NULL)
2458 if (! bfd_set_section_contents (abfd, gptab_data_sec,
2459 gptab_data_sec->contents,
2461 gptab_data_sec->_raw_size))
2465 if (gptab_bss_sec != (asection *) NULL)
2467 if (! bfd_set_section_contents (abfd, gptab_bss_sec,
2468 gptab_bss_sec->contents,
2470 gptab_bss_sec->_raw_size))
2477 /* Handle a MIPS ELF HI16 reloc. */
2480 mips_elf_relocate_hi16 (input_bfd, relhi, rello, contents, addend)
2482 Elf_Internal_Rela *relhi;
2483 Elf_Internal_Rela *rello;
2490 insn = bfd_get_32 (input_bfd, contents + relhi->r_offset);
2492 addlo = bfd_get_32 (input_bfd, contents + rello->r_offset);
2495 addend += ((insn & 0xffff) << 16) + addlo;
2497 if ((addlo & 0x8000) != 0)
2499 if ((addend & 0x8000) != 0)
2502 bfd_put_32 (input_bfd,
2503 (insn & 0xffff0000) | ((addend >> 16) & 0xffff),
2504 contents + relhi->r_offset);
2507 /* Relocate a MIPS ELF section. */
2510 mips_elf_relocate_section (output_bfd, info, input_bfd, input_section,
2511 contents, relocs, local_syms, local_sections)
2513 struct bfd_link_info *info;
2515 asection *input_section;
2517 Elf_Internal_Rela *relocs;
2518 Elf_Internal_Sym *local_syms;
2519 asection **local_sections;
2521 Elf_Internal_Shdr *symtab_hdr;
2524 Elf_Internal_Rela *rel;
2525 Elf_Internal_Rela *relend;
2527 symtab_hdr = &elf_tdata (input_bfd)->symtab_hdr;
2529 if (elf_bad_symtab (input_bfd))
2531 locsymcount = symtab_hdr->sh_size / sizeof (Elf32_External_Sym);
2536 locsymcount = symtab_hdr->sh_info;
2537 extsymoff = symtab_hdr->sh_info;
2541 relend = relocs + input_section->reloc_count;
2542 for (; rel < relend; rel++)
2545 reloc_howto_type *howto;
2546 unsigned long r_symndx;
2548 struct elf_link_hash_entry *h;
2550 Elf_Internal_Sym *sym;
2551 bfd_reloc_status_type r;
2553 r_type = ELF32_R_TYPE (rel->r_info);
2554 if (r_type < 0 || r_type >= (int) R_MIPS_max)
2556 bfd_set_error (bfd_error_bad_value);
2559 howto = elf_mips_howto_table + r_type;
2561 r_symndx = ELF32_R_SYM (rel->r_info);
2563 /* Mix in the change in GP address for a GP relative reloc. */
2564 if (r_type != R_MIPS_GPREL16
2565 && r_type != R_MIPS_LITERAL
2566 && r_type != R_MIPS_GPREL32)
2570 if (elf_gp (output_bfd) == 0)
2572 if (! ((*info->callbacks->reloc_dangerous)
2574 "GP relative relocation when GP not defined",
2575 input_bfd, input_section,
2578 /* Only give the error once per link. */
2579 elf_gp (output_bfd) = 4;
2582 if (r_symndx < extsymoff
2583 || (elf_bad_symtab (input_bfd)
2584 && local_sections[r_symndx] != NULL))
2586 /* This is a relocation against a section. The current
2587 addend in the instruction is the difference between
2588 INPUT_SECTION->vma and the GP value of INPUT_BFD. We
2589 must change this to be the difference between the
2590 final definition (which will end up in RELOCATION)
2591 and the GP value of OUTPUT_BFD (which is in GP). */
2592 addend = elf_gp (input_bfd) - elf_gp (output_bfd);
2594 else if (! info->relocateable)
2596 /* We are doing a final link. The current addend in the
2597 instruction is simply the desired offset into the
2598 symbol (normally zero). We want the instruction to
2599 hold the difference between the final definition of
2600 the symbol (which will end up in RELOCATION) and the
2601 GP value of OUTPUT_BFD (which is in GP). */
2602 addend = - elf_gp (output_bfd);
2606 /* We are generating relocateable output, and we aren't
2607 going to define this symbol, so we just leave the
2608 instruction alone. */
2616 if (info->relocateable)
2618 /* This is a relocateable link. We don't have to change
2619 anything, unless the reloc is against a section symbol,
2620 in which case we have to adjust according to where the
2621 section symbol winds up in the output section. */
2622 if (r_symndx >= locsymcount
2623 || (elf_bad_symtab (input_bfd)
2624 && local_sections[r_symndx] == NULL))
2628 sym = local_syms + r_symndx;
2629 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2633 sec = local_sections[r_symndx];
2635 /* It would be logical to add sym->st_value here,
2636 but Irix 5 sometimes generates a garbage symbol
2638 addend += sec->output_offset;
2640 /* If this is HI16 with an associated LO16, adjust
2641 the addend accordingly. Otherwise, just
2643 if (r_type != R_MIPS_HI16
2644 || (rel + 1) >= relend
2645 || ELF32_R_TYPE ((rel + 1)->r_info) != R_MIPS_LO16)
2646 r = _bfd_relocate_contents (howto, input_bfd,
2648 contents + rel->r_offset);
2651 mips_elf_relocate_hi16 (input_bfd, rel, rel + 1,
2662 /* This is a final link. */
2664 if (r_symndx < extsymoff
2665 || (elf_bad_symtab (input_bfd)
2666 && local_sections[r_symndx] != NULL))
2668 sym = local_syms + r_symndx;
2669 sec = local_sections[r_symndx];
2670 relocation = (sec->output_section->vma
2671 + sec->output_offset);
2673 /* It would be logical to always add sym->st_value here,
2674 but Irix 5 sometimes generates a garbage symbol
2676 if (ELF_ST_TYPE (sym->st_info) != STT_SECTION)
2677 relocation += sym->st_value;
2683 indx = r_symndx - extsymoff;
2684 h = elf_sym_hashes (input_bfd)[indx];
2685 if (h->root.type == bfd_link_hash_defined
2686 || h->root.type == bfd_link_hash_defweak)
2688 sec = h->root.u.def.section;
2689 relocation = (h->root.u.def.value
2690 + sec->output_section->vma
2691 + sec->output_offset);
2693 else if (h->root.type == bfd_link_hash_undefweak)
2697 if (! ((*info->callbacks->undefined_symbol)
2698 (info, h->root.root.string, input_bfd,
2699 input_section, rel->r_offset)))
2705 if (r_type != R_MIPS_HI16
2706 || (rel + 1) >= relend
2707 || ELF32_R_TYPE ((rel + 1)->r_info) != R_MIPS_LO16)
2708 r = _bfd_final_link_relocate (howto, input_bfd, input_section,
2709 contents, rel->r_offset,
2710 relocation, addend);
2713 mips_elf_relocate_hi16 (input_bfd, rel, rel + 1,
2714 contents, relocation + addend);
2719 if (r != bfd_reloc_ok)
2724 case bfd_reloc_outofrange:
2726 case bfd_reloc_overflow:
2731 name = h->root.root.string;
2734 name = bfd_elf_string_from_elf_section (input_bfd,
2735 symtab_hdr->sh_link,
2740 name = bfd_section_name (input_bfd, sec);
2742 if (! ((*info->callbacks->reloc_overflow)
2743 (info, name, howto->name, (bfd_vma) 0,
2744 input_bfd, input_section, rel->r_offset)))
2755 /* This is almost identical to bfd_generic_get_... except that some
2756 MIPS relocations need to be handled specially. Sigh. */
2758 elf32_mips_get_relocated_section_contents (abfd, link_info, link_order, data,
2759 relocateable, symbols)
2761 struct bfd_link_info *link_info;
2762 struct bfd_link_order *link_order;
2764 boolean relocateable;
2767 /* Get enough memory to hold the stuff */
2768 bfd *input_bfd = link_order->u.indirect.section->owner;
2769 asection *input_section = link_order->u.indirect.section;
2771 long reloc_size = bfd_get_reloc_upper_bound (input_bfd, input_section);
2772 arelent **reloc_vector = NULL;
2778 reloc_vector = (arelent **) malloc (reloc_size);
2779 if (reloc_vector == NULL && reloc_size != 0)
2781 bfd_set_error (bfd_error_no_memory);
2785 /* read in the section */
2786 if (!bfd_get_section_contents (input_bfd,
2790 input_section->_raw_size))
2793 /* We're not relaxing the section, so just copy the size info */
2794 input_section->_cooked_size = input_section->_raw_size;
2795 input_section->reloc_done = true;
2797 reloc_count = bfd_canonicalize_reloc (input_bfd,
2801 if (reloc_count < 0)
2804 if (reloc_count > 0)
2809 bfd_vma gp = 0x12345678; /* initialize just to shut gcc up */
2812 struct bfd_hash_entry *h;
2813 struct bfd_link_hash_entry *lh;
2814 /* Skip all this stuff if we aren't mixing formats. */
2815 if (abfd && input_bfd
2816 && abfd->xvec == input_bfd->xvec)
2820 h = bfd_hash_lookup (&link_info->hash->table, "_gp", false, false);
2821 lh = (struct bfd_link_hash_entry *) h;
2828 case bfd_link_hash_undefined:
2829 case bfd_link_hash_undefweak:
2830 case bfd_link_hash_common:
2833 case bfd_link_hash_defined:
2834 case bfd_link_hash_defweak:
2836 gp = lh->u.def.value;
2838 case bfd_link_hash_indirect:
2839 case bfd_link_hash_warning:
2841 /* @@FIXME ignoring warning for now */
2843 case bfd_link_hash_new:
2852 for (parent = reloc_vector; *parent != (arelent *) NULL;
2855 char *error_message = (char *) NULL;
2856 bfd_reloc_status_type r;
2858 /* Specific to MIPS: Deal with relocation types that require
2859 knowing the gp of the output bfd. */
2860 asymbol *sym = *(*parent)->sym_ptr_ptr;
2861 if (bfd_is_abs_section (sym->section) && abfd)
2863 /* The special_function wouldn't get called anyways. */
2867 /* The gp isn't there; let the special function code
2868 fall over on its own. */
2870 else if ((*parent)->howto->special_function == mips_elf_gprel16_reloc)
2872 /* bypass special_function call */
2873 r = gprel16_with_gp (input_bfd, sym, *parent, input_section,
2874 relocateable, (PTR) data, gp);
2875 goto skip_bfd_perform_relocation;
2877 /* end mips specific stuff */
2879 r = bfd_perform_relocation (input_bfd,
2883 relocateable ? abfd : (bfd *) NULL,
2885 skip_bfd_perform_relocation:
2889 asection *os = input_section->output_section;
2891 /* A partial link, so keep the relocs */
2892 os->orelocation[os->reloc_count] = *parent;
2896 if (r != bfd_reloc_ok)
2900 case bfd_reloc_undefined:
2901 if (!((*link_info->callbacks->undefined_symbol)
2902 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
2903 input_bfd, input_section, (*parent)->address)))
2906 case bfd_reloc_dangerous:
2907 BFD_ASSERT (error_message != (char *) NULL);
2908 if (!((*link_info->callbacks->reloc_dangerous)
2909 (link_info, error_message, input_bfd, input_section,
2910 (*parent)->address)))
2913 case bfd_reloc_overflow:
2914 if (!((*link_info->callbacks->reloc_overflow)
2915 (link_info, bfd_asymbol_name (*(*parent)->sym_ptr_ptr),
2916 (*parent)->howto->name, (*parent)->addend,
2917 input_bfd, input_section, (*parent)->address)))
2920 case bfd_reloc_outofrange:
2929 if (reloc_vector != NULL)
2930 free (reloc_vector);
2934 if (reloc_vector != NULL)
2935 free (reloc_vector);
2938 #define bfd_elf32_bfd_get_relocated_section_contents elf32_mips_get_relocated_section_contents
2940 /* ECOFF swapping routines. These are used when dealing with the
2941 .mdebug section, which is in the ECOFF debugging format. */
2942 static const struct ecoff_debug_swap mips_elf_ecoff_debug_swap =
2944 /* Symbol table magic number. */
2946 /* Alignment of debugging information. E.g., 4. */
2948 /* Sizes of external symbolic information. */
2949 sizeof (struct hdr_ext),
2950 sizeof (struct dnr_ext),
2951 sizeof (struct pdr_ext),
2952 sizeof (struct sym_ext),
2953 sizeof (struct opt_ext),
2954 sizeof (struct fdr_ext),
2955 sizeof (struct rfd_ext),
2956 sizeof (struct ext_ext),
2957 /* Functions to swap in external symbolic data. */
2966 _bfd_ecoff_swap_tir_in,
2967 _bfd_ecoff_swap_rndx_in,
2968 /* Functions to swap out external symbolic data. */
2977 _bfd_ecoff_swap_tir_out,
2978 _bfd_ecoff_swap_rndx_out,
2979 /* Function to read in symbolic data. */
2980 mips_elf_read_ecoff_info
2983 #define TARGET_LITTLE_SYM bfd_elf32_littlemips_vec
2984 #define TARGET_LITTLE_NAME "elf32-littlemips"
2985 #define TARGET_BIG_SYM bfd_elf32_bigmips_vec
2986 #define TARGET_BIG_NAME "elf32-bigmips"
2987 #define ELF_ARCH bfd_arch_mips
2988 #define ELF_MACHINE_CODE EM_MIPS
2989 #define ELF_MAXPAGESIZE 0x10000
2990 #define elf_backend_collect true
2991 #define elf_info_to_howto 0
2992 #define elf_info_to_howto_rel mips_info_to_howto_rel
2993 #define elf_backend_sym_is_global mips_elf_sym_is_global
2994 #define elf_backend_object_p mips_elf_object_p
2995 #define elf_backend_section_from_shdr mips_elf_section_from_shdr
2996 #define elf_backend_fake_sections mips_elf_fake_sections
2997 #define elf_backend_section_from_bfd_section \
2998 mips_elf_section_from_bfd_section
2999 #define elf_backend_section_processing mips_elf_section_processing
3000 #define elf_backend_symbol_processing mips_elf_symbol_processing
3001 #define elf_backend_final_write_processing \
3002 mips_elf_final_write_processing
3003 #define elf_backend_ecoff_debug_swap &mips_elf_ecoff_debug_swap
3005 #define bfd_elf32_bfd_is_local_label mips_elf_is_local_label
3006 #define bfd_elf32_find_nearest_line mips_elf_find_nearest_line
3008 #define bfd_elf32_bfd_link_hash_table_create \
3009 mips_elf_link_hash_table_create
3010 #define bfd_elf32_bfd_final_link mips_elf_final_link
3011 #define elf_backend_relocate_section mips_elf_relocate_section
3012 #define elf_backend_add_symbol_hook mips_elf_add_symbol_hook
3014 #include "elf32-target.h"