1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright 1990, 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
3 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
4 Free Software Foundation, Inc.
5 Original version by Per Bothner.
6 Full support added by Ian Lance Taylor, ian@cygnus.com.
8 This file is part of BFD, the Binary File Descriptor library.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
23 MA 02110-1301, USA. */
30 #include "aout/stab_gnu.h"
32 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
33 some other stuff which we don't want and which conflicts with stuff
36 #include "aout/aout64.h"
39 #undef obj_sym_filepos
41 #include "coff/internal.h"
43 #include "coff/symconst.h"
44 #include "coff/ecoff.h"
47 #include "libiberty.h"
49 #define streq(a, b) (strcmp ((a), (b)) == 0)
50 #define strneq(a, b, n) (strncmp ((a), (b), (n)) == 0)
53 /* This stuff is somewhat copied from coffcode.h. */
54 static asection bfd_debug_section =
56 /* name, id, index, next, prev, flags, user_set_vma, */
57 "*DEBUG*", 0, 0, NULL, NULL, 0, 0,
58 /* linker_mark, linker_has_input, gc_mark, compress_status, */
60 /* segment_mark, sec_info_type, use_rela_p, */
62 /* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */
64 /* vma, lma, size, rawsize, compressed_size, relax, relax_count, */
66 /* output_offset, output_section, alignment_power, */
68 /* relocation, orelocation, reloc_count, filepos, rel_filepos, */
70 /* line_filepos, userdata, contents, lineno, lineno_count, */
71 0, NULL, NULL, NULL, 0,
72 /* entsize, kept_section, moving_line_filepos, */
74 /* target_index, used_by_bfd, constructor_chain, owner, */
80 /* map_head, map_tail */
84 /* Create an ECOFF object. */
87 _bfd_ecoff_mkobject (bfd *abfd)
89 bfd_size_type amt = sizeof (ecoff_data_type);
91 abfd->tdata.ecoff_obj_data = (struct ecoff_tdata *) bfd_zalloc (abfd, amt);
92 if (abfd->tdata.ecoff_obj_data == NULL)
98 /* This is a hook called by coff_real_object_p to create any backend
99 specific information. */
102 _bfd_ecoff_mkobject_hook (bfd *abfd, void * filehdr, void * aouthdr)
104 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
105 struct internal_aouthdr *internal_a = (struct internal_aouthdr *) aouthdr;
106 ecoff_data_type *ecoff;
108 if (! _bfd_ecoff_mkobject (abfd))
111 ecoff = ecoff_data (abfd);
113 ecoff->sym_filepos = internal_f->f_symptr;
115 if (internal_a != NULL)
119 ecoff->text_start = internal_a->text_start;
120 ecoff->text_end = internal_a->text_start + internal_a->tsize;
121 ecoff->gp = internal_a->gp_value;
122 ecoff->gprmask = internal_a->gprmask;
123 for (i = 0; i < 4; i++)
124 ecoff->cprmask[i] = internal_a->cprmask[i];
125 ecoff->fprmask = internal_a->fprmask;
126 if (internal_a->magic == ECOFF_AOUT_ZMAGIC)
127 abfd->flags |= D_PAGED;
129 abfd->flags &=~ D_PAGED;
132 /* It turns out that no special action is required by the MIPS or
133 Alpha ECOFF backends. They have different information in the
134 a.out header, but we just copy it all (e.g., gprmask, cprmask and
135 fprmask) and let the swapping routines ensure that only relevant
136 information is written out. */
138 return (void *) ecoff;
141 /* Initialize a new section. */
144 _bfd_ecoff_new_section_hook (bfd *abfd, asection *section)
154 { _TEXT, SEC_ALLOC | SEC_CODE | SEC_LOAD },
155 { _INIT, SEC_ALLOC | SEC_CODE | SEC_LOAD },
156 { _FINI, SEC_ALLOC | SEC_CODE | SEC_LOAD },
157 { _DATA, SEC_ALLOC | SEC_DATA | SEC_LOAD },
158 { _SDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD },
159 { _RDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY},
160 { _LIT8, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY},
161 { _LIT4, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY},
162 { _RCONST, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY},
163 { _PDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY},
166 /* An Irix 4 shared libary. */
167 { _LIB, SEC_COFF_SHARED_LIBRARY}
170 section->alignment_power = 4;
172 for (i = 0; i < ARRAY_SIZE (section_flags); i++)
173 if (streq (section->name, section_flags[i].name))
175 section->flags |= section_flags[i].flags;
180 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
181 uncertain about .init on some systems and I don't know how shared
184 return _bfd_generic_new_section_hook (abfd, section);
187 /* Determine the machine architecture and type. This is called from
188 the generic COFF routines. It is the inverse of ecoff_get_magic,
189 below. This could be an ECOFF backend routine, with one version
190 for each target, but there aren't all that many ECOFF targets. */
193 _bfd_ecoff_set_arch_mach_hook (bfd *abfd, void * filehdr)
195 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
196 enum bfd_architecture arch;
199 switch (internal_f->f_magic)
202 case MIPS_MAGIC_LITTLE:
204 arch = bfd_arch_mips;
205 mach = bfd_mach_mips3000;
208 case MIPS_MAGIC_LITTLE2:
209 case MIPS_MAGIC_BIG2:
210 /* MIPS ISA level 2: the r6000. */
211 arch = bfd_arch_mips;
212 mach = bfd_mach_mips6000;
215 case MIPS_MAGIC_LITTLE3:
216 case MIPS_MAGIC_BIG3:
217 /* MIPS ISA level 3: the r4000. */
218 arch = bfd_arch_mips;
219 mach = bfd_mach_mips4000;
223 arch = bfd_arch_alpha;
228 arch = bfd_arch_obscure;
233 return bfd_default_set_arch_mach (abfd, arch, mach);
237 _bfd_ecoff_no_long_sections (bfd *abfd, int enable)
244 /* Get the magic number to use based on the architecture and machine.
245 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
248 ecoff_get_magic (bfd *abfd)
252 switch (bfd_get_arch (abfd))
255 switch (bfd_get_mach (abfd))
259 case bfd_mach_mips3000:
260 big = MIPS_MAGIC_BIG;
261 little = MIPS_MAGIC_LITTLE;
264 case bfd_mach_mips6000:
265 big = MIPS_MAGIC_BIG2;
266 little = MIPS_MAGIC_LITTLE2;
269 case bfd_mach_mips4000:
270 big = MIPS_MAGIC_BIG3;
271 little = MIPS_MAGIC_LITTLE3;
275 return bfd_big_endian (abfd) ? big : little;
286 /* Get the section s_flags to use for a section. */
289 ecoff_sec_to_styp_flags (const char *name, flagword flags)
299 { _TEXT, STYP_TEXT },
300 { _DATA, STYP_DATA },
301 { _SDATA, STYP_SDATA },
302 { _RDATA, STYP_RDATA },
303 { _LITA, STYP_LITA },
304 { _LIT8, STYP_LIT8 },
305 { _LIT4, STYP_LIT4 },
307 { _SBSS, STYP_SBSS },
308 { _INIT, STYP_ECOFF_INIT },
309 { _FINI, STYP_ECOFF_FINI },
310 { _PDATA, STYP_PDATA },
311 { _XDATA, STYP_XDATA },
312 { _LIB, STYP_ECOFF_LIB },
314 { _HASH, STYP_HASH },
315 { _DYNAMIC, STYP_DYNAMIC },
316 { _LIBLIST, STYP_LIBLIST },
317 { _RELDYN, STYP_RELDYN },
318 { _CONFLIC, STYP_CONFLIC },
319 { _DYNSTR, STYP_DYNSTR },
320 { _DYNSYM, STYP_DYNSYM },
321 { _RCONST, STYP_RCONST }
325 for (i = 0; i < ARRAY_SIZE (styp_flags); i++)
326 if (streq (name, styp_flags[i].name))
328 styp = styp_flags[i].flags;
334 if (streq (name, _COMMENT))
337 flags &=~ SEC_NEVER_LOAD;
339 else if (flags & SEC_CODE)
341 else if (flags & SEC_DATA)
343 else if (flags & SEC_READONLY)
345 else if (flags & SEC_LOAD)
351 if (flags & SEC_NEVER_LOAD)
357 /* Get the BFD flags to use for a section. */
360 _bfd_ecoff_styp_to_sec_flags (bfd *abfd ATTRIBUTE_UNUSED,
362 const char *name ATTRIBUTE_UNUSED,
363 asection *section ATTRIBUTE_UNUSED,
364 flagword * flags_ptr)
366 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
367 long styp_flags = internal_s->s_flags;
368 flagword sec_flags = 0;
370 if (styp_flags & STYP_NOLOAD)
371 sec_flags |= SEC_NEVER_LOAD;
373 /* For 386 COFF, at least, an unloadable text or data section is
374 actually a shared library section. */
375 if ((styp_flags & STYP_TEXT)
376 || (styp_flags & STYP_ECOFF_INIT)
377 || (styp_flags & STYP_ECOFF_FINI)
378 || (styp_flags & STYP_DYNAMIC)
379 || (styp_flags & STYP_LIBLIST)
380 || (styp_flags & STYP_RELDYN)
381 || styp_flags == STYP_CONFLIC
382 || (styp_flags & STYP_DYNSTR)
383 || (styp_flags & STYP_DYNSYM)
384 || (styp_flags & STYP_HASH))
386 if (sec_flags & SEC_NEVER_LOAD)
387 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
389 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
391 else if ((styp_flags & STYP_DATA)
392 || (styp_flags & STYP_RDATA)
393 || (styp_flags & STYP_SDATA)
394 || styp_flags == STYP_PDATA
395 || styp_flags == STYP_XDATA
396 || (styp_flags & STYP_GOT)
397 || styp_flags == STYP_RCONST)
399 if (sec_flags & SEC_NEVER_LOAD)
400 sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
402 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
403 if ((styp_flags & STYP_RDATA)
404 || styp_flags == STYP_PDATA
405 || styp_flags == STYP_RCONST)
406 sec_flags |= SEC_READONLY;
408 else if ((styp_flags & STYP_BSS)
409 || (styp_flags & STYP_SBSS))
410 sec_flags |= SEC_ALLOC;
411 else if ((styp_flags & STYP_INFO) || styp_flags == STYP_COMMENT)
412 sec_flags |= SEC_NEVER_LOAD;
413 else if ((styp_flags & STYP_LITA)
414 || (styp_flags & STYP_LIT8)
415 || (styp_flags & STYP_LIT4))
416 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY;
417 else if (styp_flags & STYP_ECOFF_LIB)
418 sec_flags |= SEC_COFF_SHARED_LIBRARY;
420 sec_flags |= SEC_ALLOC | SEC_LOAD;
422 * flags_ptr = sec_flags;
426 /* Read in the symbolic header for an ECOFF object file. */
429 ecoff_slurp_symbolic_header (bfd *abfd)
431 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
432 bfd_size_type external_hdr_size;
434 HDRR *internal_symhdr;
436 /* See if we've already read it in. */
437 if (ecoff_data (abfd)->debug_info.symbolic_header.magic ==
438 backend->debug_swap.sym_magic)
441 /* See whether there is a symbolic header. */
442 if (ecoff_data (abfd)->sym_filepos == 0)
444 bfd_get_symcount (abfd) = 0;
448 /* At this point bfd_get_symcount (abfd) holds the number of symbols
449 as read from the file header, but on ECOFF this is always the
450 size of the symbolic information header. It would be cleaner to
451 handle this when we first read the file in coffgen.c. */
452 external_hdr_size = backend->debug_swap.external_hdr_size;
453 if (bfd_get_symcount (abfd) != external_hdr_size)
455 bfd_set_error (bfd_error_bad_value);
459 /* Read the symbolic information header. */
460 raw = bfd_malloc (external_hdr_size);
464 if (bfd_seek (abfd, ecoff_data (abfd)->sym_filepos, SEEK_SET) != 0
465 || bfd_bread (raw, external_hdr_size, abfd) != external_hdr_size)
467 internal_symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
468 (*backend->debug_swap.swap_hdr_in) (abfd, raw, internal_symhdr);
470 if (internal_symhdr->magic != backend->debug_swap.sym_magic)
472 bfd_set_error (bfd_error_bad_value);
476 /* Now we can get the correct number of symbols. */
477 bfd_get_symcount (abfd) = (internal_symhdr->isymMax
478 + internal_symhdr->iextMax);
489 /* Read in and swap the important symbolic information for an ECOFF
490 object file. This is called by gdb via the read_debug_info entry
491 point in the backend structure. */
494 _bfd_ecoff_slurp_symbolic_info (bfd *abfd,
495 asection *ignore ATTRIBUTE_UNUSED,
496 struct ecoff_debug_info *debug)
498 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
499 HDRR *internal_symhdr;
500 bfd_size_type raw_base;
501 bfd_size_type raw_size;
503 bfd_size_type external_fdr_size;
507 bfd_size_type raw_end;
508 bfd_size_type cb_end;
512 BFD_ASSERT (debug == &ecoff_data (abfd)->debug_info);
514 /* Check whether we've already gotten it, and whether there's any to
516 if (ecoff_data (abfd)->raw_syments != NULL)
518 if (ecoff_data (abfd)->sym_filepos == 0)
520 bfd_get_symcount (abfd) = 0;
524 if (! ecoff_slurp_symbolic_header (abfd))
527 internal_symhdr = &debug->symbolic_header;
529 /* Read all the symbolic information at once. */
530 raw_base = (ecoff_data (abfd)->sym_filepos
531 + backend->debug_swap.external_hdr_size);
533 /* Alpha ecoff makes the determination of raw_size difficult. It has
534 an undocumented debug data section between the symhdr and the first
535 documented section. And the ordering of the sections varies between
536 statically and dynamically linked executables.
537 If bfd supports SEEK_END someday, this code could be simplified. */
540 #define UPDATE_RAW_END(start, count, size) \
541 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
542 if (cb_end > raw_end) \
545 UPDATE_RAW_END (cbLineOffset, cbLine, sizeof (unsigned char));
546 UPDATE_RAW_END (cbDnOffset, idnMax, backend->debug_swap.external_dnr_size);
547 UPDATE_RAW_END (cbPdOffset, ipdMax, backend->debug_swap.external_pdr_size);
548 UPDATE_RAW_END (cbSymOffset, isymMax, backend->debug_swap.external_sym_size);
549 /* eraxxon@alumni.rice.edu: ioptMax refers to the size of the
550 optimization symtab, not the number of entries. */
551 UPDATE_RAW_END (cbOptOffset, ioptMax, sizeof (char));
552 UPDATE_RAW_END (cbAuxOffset, iauxMax, sizeof (union aux_ext));
553 UPDATE_RAW_END (cbSsOffset, issMax, sizeof (char));
554 UPDATE_RAW_END (cbSsExtOffset, issExtMax, sizeof (char));
555 UPDATE_RAW_END (cbFdOffset, ifdMax, backend->debug_swap.external_fdr_size);
556 UPDATE_RAW_END (cbRfdOffset, crfd, backend->debug_swap.external_rfd_size);
557 UPDATE_RAW_END (cbExtOffset, iextMax, backend->debug_swap.external_ext_size);
559 #undef UPDATE_RAW_END
561 raw_size = raw_end - raw_base;
564 ecoff_data (abfd)->sym_filepos = 0;
567 raw = bfd_alloc (abfd, raw_size);
571 pos = ecoff_data (abfd)->sym_filepos;
572 pos += backend->debug_swap.external_hdr_size;
573 if (bfd_seek (abfd, pos, SEEK_SET) != 0
574 || bfd_bread (raw, raw_size, abfd) != raw_size)
576 bfd_release (abfd, raw);
580 ecoff_data (abfd)->raw_syments = raw;
582 /* Get pointers for the numeric offsets in the HDRR structure. */
583 #define FIX(off1, off2, type) \
584 if (internal_symhdr->off1 == 0) \
585 debug->off2 = NULL; \
587 debug->off2 = (type) ((char *) raw \
588 + (internal_symhdr->off1 \
591 FIX (cbLineOffset, line, unsigned char *);
592 FIX (cbDnOffset, external_dnr, void *);
593 FIX (cbPdOffset, external_pdr, void *);
594 FIX (cbSymOffset, external_sym, void *);
595 FIX (cbOptOffset, external_opt, void *);
596 FIX (cbAuxOffset, external_aux, union aux_ext *);
597 FIX (cbSsOffset, ss, char *);
598 FIX (cbSsExtOffset, ssext, char *);
599 FIX (cbFdOffset, external_fdr, void *);
600 FIX (cbRfdOffset, external_rfd, void *);
601 FIX (cbExtOffset, external_ext, void *);
604 /* I don't want to always swap all the data, because it will just
605 waste time and most programs will never look at it. The only
606 time the linker needs most of the debugging information swapped
607 is when linking big-endian and little-endian MIPS object files
608 together, which is not a common occurrence.
610 We need to look at the fdr to deal with a lot of information in
611 the symbols, so we swap them here. */
612 amt = internal_symhdr->ifdMax;
613 amt *= sizeof (struct fdr);
614 debug->fdr = (FDR *) bfd_alloc (abfd, amt);
615 if (debug->fdr == NULL)
617 external_fdr_size = backend->debug_swap.external_fdr_size;
618 fdr_ptr = debug->fdr;
619 fraw_src = (char *) debug->external_fdr;
620 fraw_end = fraw_src + internal_symhdr->ifdMax * external_fdr_size;
621 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
622 (*backend->debug_swap.swap_fdr_in) (abfd, (void *) fraw_src, fdr_ptr);
627 /* ECOFF symbol table routines. The ECOFF symbol table is described
628 in gcc/mips-tfile.c. */
630 /* ECOFF uses two common sections. One is the usual one, and the
631 other is for small objects. All the small objects are kept
632 together, and then referenced via the gp pointer, which yields
633 faster assembler code. This is what we use for the small common
635 static asection ecoff_scom_section;
636 static asymbol ecoff_scom_symbol;
637 static asymbol *ecoff_scom_symbol_ptr;
639 /* Create an empty symbol. */
642 _bfd_ecoff_make_empty_symbol (bfd *abfd)
644 ecoff_symbol_type *new_symbol;
645 bfd_size_type amt = sizeof (ecoff_symbol_type);
647 new_symbol = (ecoff_symbol_type *) bfd_zalloc (abfd, amt);
648 if (new_symbol == NULL)
650 new_symbol->symbol.section = NULL;
651 new_symbol->fdr = NULL;
652 new_symbol->local = FALSE;
653 new_symbol->native = NULL;
654 new_symbol->symbol.the_bfd = abfd;
655 return &new_symbol->symbol;
658 /* Set the BFD flags and section for an ECOFF symbol. */
661 ecoff_set_symbol_info (bfd *abfd,
667 asym->the_bfd = abfd;
668 asym->value = ecoff_sym->value;
669 asym->section = &bfd_debug_section;
672 /* Most symbol types are just for debugging. */
673 switch (ecoff_sym->st)
682 if (ECOFF_IS_STAB (ecoff_sym))
684 asym->flags = BSF_DEBUGGING;
689 asym->flags = BSF_DEBUGGING;
694 asym->flags = BSF_EXPORT | BSF_WEAK;
696 asym->flags = BSF_EXPORT | BSF_GLOBAL;
699 asym->flags = BSF_LOCAL;
700 /* Normally, a local stProc symbol will have a corresponding
701 external symbol. We mark the local symbol as a debugging
702 symbol, in order to prevent nm from printing both out.
703 Similarly, we mark stLabel and stabs symbols as debugging
704 symbols. In both cases, we do want to set the value
705 correctly based on the symbol class. */
706 if (ecoff_sym->st == stProc
707 || ecoff_sym->st == stLabel
708 || ECOFF_IS_STAB (ecoff_sym))
709 asym->flags |= BSF_DEBUGGING;
712 if (ecoff_sym->st == stProc || ecoff_sym->st == stStaticProc)
713 asym->flags |= BSF_FUNCTION;
715 switch (ecoff_sym->sc)
718 /* Used for compiler generated labels. Leave them in the
719 debugging section, and mark them as local. If BSF_DEBUGGING
720 is set, then nm does not display them for some reason. If no
721 flags are set then the linker whines about them. */
722 asym->flags = BSF_LOCAL;
725 asym->section = bfd_make_section_old_way (abfd, _TEXT);
726 asym->value -= asym->section->vma;
729 asym->section = bfd_make_section_old_way (abfd, _DATA);
730 asym->value -= asym->section->vma;
733 asym->section = bfd_make_section_old_way (abfd, _BSS);
734 asym->value -= asym->section->vma;
737 asym->flags = BSF_DEBUGGING;
740 asym->section = bfd_abs_section_ptr;
743 asym->section = bfd_und_section_ptr;
753 asym->flags = BSF_DEBUGGING;
756 asym->section = bfd_make_section_old_way (abfd, ".sdata");
757 asym->value -= asym->section->vma;
760 asym->section = bfd_make_section_old_way (abfd, ".sbss");
761 asym->value -= asym->section->vma;
764 asym->section = bfd_make_section_old_way (abfd, ".rdata");
765 asym->value -= asym->section->vma;
768 asym->flags = BSF_DEBUGGING;
771 if (asym->value > ecoff_data (abfd)->gp_size)
773 asym->section = bfd_com_section_ptr;
779 if (ecoff_scom_section.name == NULL)
781 /* Initialize the small common section. */
782 ecoff_scom_section.name = SCOMMON;
783 ecoff_scom_section.flags = SEC_IS_COMMON;
784 ecoff_scom_section.output_section = &ecoff_scom_section;
785 ecoff_scom_section.symbol = &ecoff_scom_symbol;
786 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
787 ecoff_scom_symbol.name = SCOMMON;
788 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
789 ecoff_scom_symbol.section = &ecoff_scom_section;
790 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
792 asym->section = &ecoff_scom_section;
797 asym->flags = BSF_DEBUGGING;
800 asym->section = bfd_und_section_ptr;
805 asym->section = bfd_make_section_old_way (abfd, ".init");
806 asym->value -= asym->section->vma;
811 asym->flags = BSF_DEBUGGING;
814 asym->section = bfd_make_section_old_way (abfd, ".fini");
815 asym->value -= asym->section->vma;
818 asym->section = bfd_make_section_old_way (abfd, ".rconst");
819 asym->value -= asym->section->vma;
825 /* Look for special constructors symbols and make relocation entries
826 in a special construction section. These are produced by the
827 -fgnu-linker argument to g++. */
828 if (ECOFF_IS_STAB (ecoff_sym))
830 switch (ECOFF_UNMARK_STAB (ecoff_sym->index))
839 /* Mark the symbol as a constructor. */
840 asym->flags |= BSF_CONSTRUCTOR;
847 /* Read an ECOFF symbol table. */
850 _bfd_ecoff_slurp_symbol_table (bfd *abfd)
852 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
853 const bfd_size_type external_ext_size
854 = backend->debug_swap.external_ext_size;
855 const bfd_size_type external_sym_size
856 = backend->debug_swap.external_sym_size;
857 void (* const swap_ext_in) (bfd *, void *, EXTR *)
858 = backend->debug_swap.swap_ext_in;
859 void (* const swap_sym_in) (bfd *, void *, SYMR *)
860 = backend->debug_swap.swap_sym_in;
861 bfd_size_type internal_size;
862 ecoff_symbol_type *internal;
863 ecoff_symbol_type *internal_ptr;
869 /* If we've already read in the symbol table, do nothing. */
870 if (ecoff_data (abfd)->canonical_symbols != NULL)
873 /* Get the symbolic information. */
874 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL,
875 &ecoff_data (abfd)->debug_info))
877 if (bfd_get_symcount (abfd) == 0)
880 internal_size = bfd_get_symcount (abfd);
881 internal_size *= sizeof (ecoff_symbol_type);
882 internal = (ecoff_symbol_type *) bfd_alloc (abfd, internal_size);
883 if (internal == NULL)
886 internal_ptr = internal;
887 eraw_src = (char *) ecoff_data (abfd)->debug_info.external_ext;
889 + (ecoff_data (abfd)->debug_info.symbolic_header.iextMax
890 * external_ext_size));
891 for (; eraw_src < eraw_end; eraw_src += external_ext_size, internal_ptr++)
895 (*swap_ext_in) (abfd, (void *) eraw_src, &internal_esym);
896 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ssext
897 + internal_esym.asym.iss);
898 if (!ecoff_set_symbol_info (abfd, &internal_esym.asym,
899 &internal_ptr->symbol, 1,
900 internal_esym.weakext))
902 /* The alpha uses a negative ifd field for section symbols. */
903 if (internal_esym.ifd >= 0)
904 internal_ptr->fdr = (ecoff_data (abfd)->debug_info.fdr
905 + internal_esym.ifd);
907 internal_ptr->fdr = NULL;
908 internal_ptr->local = FALSE;
909 internal_ptr->native = (void *) eraw_src;
912 /* The local symbols must be accessed via the fdr's, because the
913 string and aux indices are relative to the fdr information. */
914 fdr_ptr = ecoff_data (abfd)->debug_info.fdr;
915 fdr_end = fdr_ptr + ecoff_data (abfd)->debug_info.symbolic_header.ifdMax;
916 for (; fdr_ptr < fdr_end; fdr_ptr++)
921 lraw_src = ((char *) ecoff_data (abfd)->debug_info.external_sym
922 + fdr_ptr->isymBase * external_sym_size);
923 lraw_end = lraw_src + fdr_ptr->csym * external_sym_size;
926 lraw_src += external_sym_size, internal_ptr++)
930 (*swap_sym_in) (abfd, (void *) lraw_src, &internal_sym);
931 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ss
934 if (!ecoff_set_symbol_info (abfd, &internal_sym,
935 &internal_ptr->symbol, 0, 0))
937 internal_ptr->fdr = fdr_ptr;
938 internal_ptr->local = TRUE;
939 internal_ptr->native = (void *) lraw_src;
943 ecoff_data (abfd)->canonical_symbols = internal;
948 /* Return the amount of space needed for the canonical symbols. */
951 _bfd_ecoff_get_symtab_upper_bound (bfd *abfd)
953 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL,
954 &ecoff_data (abfd)->debug_info))
957 if (bfd_get_symcount (abfd) == 0)
960 return (bfd_get_symcount (abfd) + 1) * (sizeof (ecoff_symbol_type *));
963 /* Get the canonical symbols. */
966 _bfd_ecoff_canonicalize_symtab (bfd *abfd, asymbol **alocation)
968 unsigned int counter = 0;
969 ecoff_symbol_type *symbase;
970 ecoff_symbol_type **location = (ecoff_symbol_type **) alocation;
972 if (! _bfd_ecoff_slurp_symbol_table (abfd))
974 if (bfd_get_symcount (abfd) == 0)
977 symbase = ecoff_data (abfd)->canonical_symbols;
978 while (counter < bfd_get_symcount (abfd))
980 *(location++) = symbase++;
984 return bfd_get_symcount (abfd);
987 /* Turn ECOFF type information into a printable string.
988 ecoff_emit_aggregate and ecoff_type_to_string are from
989 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
991 /* Write aggregate information to a string. */
994 ecoff_emit_aggregate (bfd *abfd,
1001 const struct ecoff_debug_swap * const debug_swap =
1002 &ecoff_backend (abfd)->debug_swap;
1003 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
1004 unsigned int ifd = rndx->rfd;
1005 unsigned int indx = rndx->index;
1011 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1012 struct return type of a procedure compiled without -g. */
1013 if (ifd == 0xffffffff
1014 || (rndx->rfd == 0xfff && indx == 0))
1015 name = "<undefined>";
1016 else if (indx == indexNil)
1022 if (debug_info->external_rfd == NULL)
1023 fdr = debug_info->fdr + ifd;
1028 (*debug_swap->swap_rfd_in) (abfd,
1029 ((char *) debug_info->external_rfd
1030 + ((fdr->rfdBase + ifd)
1031 * debug_swap->external_rfd_size)),
1033 fdr = debug_info->fdr + rfd;
1036 indx += fdr->isymBase;
1038 (*debug_swap->swap_sym_in) (abfd,
1039 ((char *) debug_info->external_sym
1040 + indx * debug_swap->external_sym_size),
1043 name = debug_info->ss + fdr->issBase + sym.iss;
1047 "%s %s { ifd = %u, index = %lu }",
1049 ((unsigned long) indx
1050 + debug_info->symbolic_header.iextMax));
1053 /* Convert the type information to string format. */
1056 ecoff_type_to_string (bfd *abfd, FDR *fdr, unsigned int indx)
1058 union aux_ext *aux_ptr;
1068 unsigned int basic_type;
1071 static char buffer2[1024];
1076 aux_ptr = ecoff_data (abfd)->debug_info.external_aux + fdr->iauxBase;
1077 bigendian = fdr->fBigendian;
1079 for (i = 0; i < 7; i++)
1081 qualifiers[i].low_bound = 0;
1082 qualifiers[i].high_bound = 0;
1083 qualifiers[i].stride = 0;
1086 if (AUX_GET_ISYM (bigendian, &aux_ptr[indx]) == (bfd_vma) -1)
1087 return "-1 (no type)";
1088 _bfd_ecoff_swap_tir_in (bigendian, &aux_ptr[indx++].a_ti, &u.ti);
1090 basic_type = u.ti.bt;
1091 qualifiers[0].type = u.ti.tq0;
1092 qualifiers[1].type = u.ti.tq1;
1093 qualifiers[2].type = u.ti.tq2;
1094 qualifiers[3].type = u.ti.tq3;
1095 qualifiers[4].type = u.ti.tq4;
1096 qualifiers[5].type = u.ti.tq5;
1097 qualifiers[6].type = tqNil;
1099 /* Go get the basic type. */
1102 case btNil: /* Undefined. */
1106 case btAdr: /* Address - integer same size as pointer. */
1107 strcpy (p1, "address");
1110 case btChar: /* Character. */
1111 strcpy (p1, "char");
1114 case btUChar: /* Unsigned character. */
1115 strcpy (p1, "unsigned char");
1118 case btShort: /* Short. */
1119 strcpy (p1, "short");
1122 case btUShort: /* Unsigned short. */
1123 strcpy (p1, "unsigned short");
1126 case btInt: /* Int. */
1130 case btUInt: /* Unsigned int. */
1131 strcpy (p1, "unsigned int");
1134 case btLong: /* Long. */
1135 strcpy (p1, "long");
1138 case btULong: /* Unsigned long. */
1139 strcpy (p1, "unsigned long");
1142 case btFloat: /* Float (real). */
1143 strcpy (p1, "float");
1146 case btDouble: /* Double (real). */
1147 strcpy (p1, "double");
1150 /* Structures add 1-2 aux words:
1151 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1152 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1154 case btStruct: /* Structure (Record). */
1155 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1156 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1157 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1159 indx++; /* Skip aux words. */
1162 /* Unions add 1-2 aux words:
1163 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1164 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1166 case btUnion: /* Union. */
1167 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1168 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1169 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1171 indx++; /* Skip aux words. */
1174 /* Enumerations add 1-2 aux words:
1175 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1176 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1178 case btEnum: /* Enumeration. */
1179 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1180 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1181 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1183 indx++; /* Skip aux words. */
1186 case btTypedef: /* Defined via a typedef, isymRef points. */
1187 strcpy (p1, "typedef");
1190 case btRange: /* Subrange of int. */
1191 strcpy (p1, "subrange");
1194 case btSet: /* Pascal sets. */
1198 case btComplex: /* Fortran complex. */
1199 strcpy (p1, "complex");
1202 case btDComplex: /* Fortran double complex. */
1203 strcpy (p1, "double complex");
1206 case btIndirect: /* Forward or unnamed typedef. */
1207 strcpy (p1, "forward/unamed typedef");
1210 case btFixedDec: /* Fixed Decimal. */
1211 strcpy (p1, "fixed decimal");
1214 case btFloatDec: /* Float Decimal. */
1215 strcpy (p1, "float decimal");
1218 case btString: /* Varying Length Character String. */
1219 strcpy (p1, "string");
1222 case btBit: /* Aligned Bit String. */
1226 case btPicture: /* Picture. */
1227 strcpy (p1, "picture");
1230 case btVoid: /* Void. */
1231 strcpy (p1, "void");
1235 sprintf (p1, _("Unknown basic type %d"), (int) basic_type);
1239 p1 += strlen (buffer1);
1241 /* If this is a bitfield, get the bitsize. */
1246 bitsize = AUX_GET_WIDTH (bigendian, &aux_ptr[indx++]);
1247 sprintf (p1, " : %d", bitsize);
1248 p1 += strlen (buffer1);
1251 /* Deal with any qualifiers. */
1252 if (qualifiers[0].type != tqNil)
1254 /* Snarf up any array bounds in the correct order. Arrays
1255 store 5 successive words in the aux. table:
1256 word 0 RNDXR to type of the bounds (ie, int)
1257 word 1 Current file descriptor index
1259 word 3 high bound (or -1 if [])
1260 word 4 stride size in bits. */
1261 for (i = 0; i < 7; i++)
1263 if (qualifiers[i].type == tqArray)
1265 qualifiers[i].low_bound =
1266 AUX_GET_DNLOW (bigendian, &aux_ptr[indx+2]);
1267 qualifiers[i].high_bound =
1268 AUX_GET_DNHIGH (bigendian, &aux_ptr[indx+3]);
1269 qualifiers[i].stride =
1270 AUX_GET_WIDTH (bigendian, &aux_ptr[indx+4]);
1275 /* Now print out the qualifiers. */
1276 for (i = 0; i < 6; i++)
1278 switch (qualifiers[i].type)
1285 strcpy (p2, "ptr to ");
1286 p2 += sizeof ("ptr to ")-1;
1290 strcpy (p2, "volatile ");
1291 p2 += sizeof ("volatile ")-1;
1295 strcpy (p2, "far ");
1296 p2 += sizeof ("far ")-1;
1300 strcpy (p2, "func. ret. ");
1301 p2 += sizeof ("func. ret. ");
1306 int first_array = i;
1309 /* Print array bounds reversed (ie, in the order the C
1310 programmer writes them). C is such a fun language.... */
1311 while (i < 5 && qualifiers[i+1].type == tqArray)
1314 for (j = i; j >= first_array; j--)
1316 strcpy (p2, "array [");
1317 p2 += sizeof ("array [")-1;
1318 if (qualifiers[j].low_bound != 0)
1320 "%ld:%ld {%ld bits}",
1321 (long) qualifiers[j].low_bound,
1322 (long) qualifiers[j].high_bound,
1323 (long) qualifiers[j].stride);
1325 else if (qualifiers[j].high_bound != -1)
1328 (long) (qualifiers[j].high_bound + 1),
1329 (long) (qualifiers[j].stride));
1332 sprintf (p2, " {%ld bits}", (long) (qualifiers[j].stride));
1335 strcpy (p2, "] of ");
1336 p2 += sizeof ("] of ")-1;
1344 strcpy (p2, buffer1);
1348 /* Return information about ECOFF symbol SYMBOL in RET. */
1351 _bfd_ecoff_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
1355 bfd_symbol_info (symbol, ret);
1358 /* Return whether this is a local label. */
1361 _bfd_ecoff_bfd_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
1364 return name[0] == '$';
1367 /* Print information about an ECOFF symbol. */
1370 _bfd_ecoff_print_symbol (bfd *abfd,
1373 bfd_print_symbol_type how)
1375 const struct ecoff_debug_swap * const debug_swap
1376 = &ecoff_backend (abfd)->debug_swap;
1377 FILE *file = (FILE *)filep;
1381 case bfd_print_symbol_name:
1382 fprintf (file, "%s", symbol->name);
1384 case bfd_print_symbol_more:
1385 if (ecoffsymbol (symbol)->local)
1389 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native,
1391 fprintf (file, "ecoff local ");
1392 fprintf_vma (file, (bfd_vma) ecoff_sym.value);
1393 fprintf (file, " %x %x", (unsigned) ecoff_sym.st,
1394 (unsigned) ecoff_sym.sc);
1400 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native,
1402 fprintf (file, "ecoff extern ");
1403 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value);
1404 fprintf (file, " %x %x", (unsigned) ecoff_ext.asym.st,
1405 (unsigned) ecoff_ext.asym.sc);
1408 case bfd_print_symbol_all:
1409 /* Print out the symbols in a reasonable way. */
1418 if (ecoffsymbol (symbol)->local)
1420 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native,
1423 pos = ((((char *) ecoffsymbol (symbol)->native
1424 - (char *) ecoff_data (abfd)->debug_info.external_sym)
1425 / debug_swap->external_sym_size)
1426 + ecoff_data (abfd)->debug_info.symbolic_header.iextMax);
1433 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native,
1436 pos = (((char *) ecoffsymbol (symbol)->native
1437 - (char *) ecoff_data (abfd)->debug_info.external_ext)
1438 / debug_swap->external_ext_size);
1439 jmptbl = ecoff_ext.jmptbl ? 'j' : ' ';
1440 cobol_main = ecoff_ext.cobol_main ? 'c' : ' ';
1441 weakext = ecoff_ext.weakext ? 'w' : ' ';
1444 fprintf (file, "[%3d] %c ",
1446 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value);
1447 fprintf (file, " st %x sc %x indx %x %c%c%c %s",
1448 (unsigned) ecoff_ext.asym.st,
1449 (unsigned) ecoff_ext.asym.sc,
1450 (unsigned) ecoff_ext.asym.index,
1451 jmptbl, cobol_main, weakext,
1454 if (ecoffsymbol (symbol)->fdr != NULL
1455 && ecoff_ext.asym.index != indexNil)
1460 bfd_size_type sym_base;
1461 union aux_ext *aux_base;
1463 fdr = ecoffsymbol (symbol)->fdr;
1464 indx = ecoff_ext.asym.index;
1466 /* sym_base is used to map the fdr relative indices which
1467 appear in the file to the position number which we are
1469 sym_base = fdr->isymBase;
1470 if (ecoffsymbol (symbol)->local)
1472 ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
1474 /* aux_base is the start of the aux entries for this file;
1475 asym.index is an offset from this. */
1476 aux_base = (ecoff_data (abfd)->debug_info.external_aux
1479 /* The aux entries are stored in host byte order; the
1480 order is indicated by a bit in the fdr. */
1481 bigendian = fdr->fBigendian;
1483 /* This switch is basically from gcc/mips-tdump.c. */
1484 switch (ecoff_ext.asym.st)
1492 fprintf (file, _("\n End+1 symbol: %ld"),
1493 (long) (indx + sym_base));
1497 if (ecoff_ext.asym.sc == scText
1498 || ecoff_ext.asym.sc == scInfo)
1499 fprintf (file, _("\n First symbol: %ld"),
1500 (long) (indx + sym_base));
1502 fprintf (file, _("\n First symbol: %ld"),
1504 (AUX_GET_ISYM (bigendian,
1505 &aux_base[ecoff_ext.asym.index])
1511 if (ECOFF_IS_STAB (&ecoff_ext.asym))
1513 else if (ecoffsymbol (symbol)->local)
1514 fprintf (file, _("\n End+1 symbol: %-7ld Type: %s"),
1516 (AUX_GET_ISYM (bigendian,
1517 &aux_base[ecoff_ext.asym.index])
1519 ecoff_type_to_string (abfd, fdr, indx + 1));
1521 fprintf (file, _("\n Local symbol: %ld"),
1524 + (ecoff_data (abfd)
1525 ->debug_info.symbolic_header.iextMax)));
1529 fprintf (file, _("\n struct; End+1 symbol: %ld"),
1530 (long) (indx + sym_base));
1534 fprintf (file, _("\n union; End+1 symbol: %ld"),
1535 (long) (indx + sym_base));
1539 fprintf (file, _("\n enum; End+1 symbol: %ld"),
1540 (long) (indx + sym_base));
1544 if (! ECOFF_IS_STAB (&ecoff_ext.asym))
1545 fprintf (file, _("\n Type: %s"),
1546 ecoff_type_to_string (abfd, fdr, indx));
1555 /* Read in the relocs for a section. */
1558 ecoff_slurp_reloc_table (bfd *abfd,
1562 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
1563 arelent *internal_relocs;
1564 bfd_size_type external_reloc_size;
1566 char *external_relocs;
1570 if (section->relocation != NULL
1571 || section->reloc_count == 0
1572 || (section->flags & SEC_CONSTRUCTOR) != 0)
1575 if (! _bfd_ecoff_slurp_symbol_table (abfd))
1578 amt = section->reloc_count;
1579 amt *= sizeof (arelent);
1580 internal_relocs = (arelent *) bfd_alloc (abfd, amt);
1582 external_reloc_size = backend->external_reloc_size;
1583 amt = external_reloc_size * section->reloc_count;
1584 external_relocs = (char *) bfd_alloc (abfd, amt);
1585 if (internal_relocs == NULL || external_relocs == NULL)
1587 if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0)
1589 if (bfd_bread (external_relocs, amt, abfd) != amt)
1592 for (i = 0, rptr = internal_relocs; i < section->reloc_count; i++, rptr++)
1594 struct internal_reloc intern;
1596 (*backend->swap_reloc_in) (abfd,
1597 external_relocs + i * external_reloc_size,
1600 if (intern.r_extern)
1602 /* r_symndx is an index into the external symbols. */
1603 BFD_ASSERT (intern.r_symndx >= 0
1605 < (ecoff_data (abfd)
1606 ->debug_info.symbolic_header.iextMax)));
1607 rptr->sym_ptr_ptr = symbols + intern.r_symndx;
1610 else if (intern.r_symndx == RELOC_SECTION_NONE
1611 || intern.r_symndx == RELOC_SECTION_ABS)
1613 rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1618 const char *sec_name;
1621 /* r_symndx is a section key. */
1622 switch (intern.r_symndx)
1624 case RELOC_SECTION_TEXT: sec_name = _TEXT; break;
1625 case RELOC_SECTION_RDATA: sec_name = _RDATA; break;
1626 case RELOC_SECTION_DATA: sec_name = _DATA; break;
1627 case RELOC_SECTION_SDATA: sec_name = _SDATA; break;
1628 case RELOC_SECTION_SBSS: sec_name = _SBSS; break;
1629 case RELOC_SECTION_BSS: sec_name = _BSS; break;
1630 case RELOC_SECTION_INIT: sec_name = _INIT; break;
1631 case RELOC_SECTION_LIT8: sec_name = _LIT8; break;
1632 case RELOC_SECTION_LIT4: sec_name = _LIT4; break;
1633 case RELOC_SECTION_XDATA: sec_name = _XDATA; break;
1634 case RELOC_SECTION_PDATA: sec_name = _PDATA; break;
1635 case RELOC_SECTION_FINI: sec_name = _FINI; break;
1636 case RELOC_SECTION_LITA: sec_name = _LITA; break;
1637 case RELOC_SECTION_RCONST: sec_name = _RCONST; break;
1641 sec = bfd_get_section_by_name (abfd, sec_name);
1644 rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
1646 rptr->addend = - bfd_get_section_vma (abfd, sec);
1649 rptr->address = intern.r_vaddr - bfd_get_section_vma (abfd, section);
1651 /* Let the backend select the howto field and do any other
1652 required processing. */
1653 (*backend->adjust_reloc_in) (abfd, &intern, rptr);
1656 bfd_release (abfd, external_relocs);
1658 section->relocation = internal_relocs;
1663 /* Get a canonical list of relocs. */
1666 _bfd_ecoff_canonicalize_reloc (bfd *abfd,
1673 if (section->flags & SEC_CONSTRUCTOR)
1675 arelent_chain *chain;
1677 /* This section has relocs made up by us, not the file, so take
1678 them out of their chain and place them into the data area
1680 for (count = 0, chain = section->constructor_chain;
1681 count < section->reloc_count;
1682 count++, chain = chain->next)
1683 *relptr++ = &chain->relent;
1689 if (! ecoff_slurp_reloc_table (abfd, section, symbols))
1692 tblptr = section->relocation;
1694 for (count = 0; count < section->reloc_count; count++)
1695 *relptr++ = tblptr++;
1700 return section->reloc_count;
1703 /* Provided a BFD, a section and an offset into the section, calculate
1704 and return the name of the source file and the line nearest to the
1708 _bfd_ecoff_find_nearest_line (bfd *abfd,
1710 asymbol **ignore_symbols ATTRIBUTE_UNUSED,
1712 const char **filename_ptr,
1713 const char **functionname_ptr,
1714 unsigned int *retline_ptr)
1716 const struct ecoff_debug_swap * const debug_swap
1717 = &ecoff_backend (abfd)->debug_swap;
1718 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
1719 struct ecoff_find_line *line_info;
1721 /* Make sure we have the FDR's. */
1722 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL, debug_info)
1723 || bfd_get_symcount (abfd) == 0)
1726 if (ecoff_data (abfd)->find_line_info == NULL)
1728 bfd_size_type amt = sizeof (struct ecoff_find_line);
1730 ecoff_data (abfd)->find_line_info =
1731 (struct ecoff_find_line *) bfd_zalloc (abfd, amt);
1732 if (ecoff_data (abfd)->find_line_info == NULL)
1735 line_info = ecoff_data (abfd)->find_line_info;
1737 return _bfd_ecoff_locate_line (abfd, section, offset, debug_info,
1738 debug_swap, line_info, filename_ptr,
1739 functionname_ptr, retline_ptr);
1742 /* Copy private BFD data. This is called by objcopy and strip. We
1743 use it to copy the ECOFF debugging information from one BFD to the
1744 other. It would be theoretically possible to represent the ECOFF
1745 debugging information in the symbol table. However, it would be a
1746 lot of work, and there would be little gain (gas, gdb, and ld
1747 already access the ECOFF debugging information via the
1748 ecoff_debug_info structure, and that structure would have to be
1749 retained in order to support ECOFF debugging in MIPS ELF).
1751 The debugging information for the ECOFF external symbols comes from
1752 the symbol table, so this function only handles the other debugging
1756 _bfd_ecoff_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
1758 struct ecoff_debug_info *iinfo = &ecoff_data (ibfd)->debug_info;
1759 struct ecoff_debug_info *oinfo = &ecoff_data (obfd)->debug_info;
1761 asymbol **sym_ptr_ptr;
1765 /* We only want to copy information over if both BFD's use ECOFF
1767 if (bfd_get_flavour (ibfd) != bfd_target_ecoff_flavour
1768 || bfd_get_flavour (obfd) != bfd_target_ecoff_flavour)
1771 /* Copy the GP value and the register masks. */
1772 ecoff_data (obfd)->gp = ecoff_data (ibfd)->gp;
1773 ecoff_data (obfd)->gprmask = ecoff_data (ibfd)->gprmask;
1774 ecoff_data (obfd)->fprmask = ecoff_data (ibfd)->fprmask;
1775 for (i = 0; i < 3; i++)
1776 ecoff_data (obfd)->cprmask[i] = ecoff_data (ibfd)->cprmask[i];
1778 /* Copy the version stamp. */
1779 oinfo->symbolic_header.vstamp = iinfo->symbolic_header.vstamp;
1781 /* If there are no symbols, don't copy any debugging information. */
1782 c = bfd_get_symcount (obfd);
1783 sym_ptr_ptr = bfd_get_outsymbols (obfd);
1784 if (c == 0 || sym_ptr_ptr == NULL)
1787 /* See if there are any local symbols. */
1789 for (; c > 0; c--, sym_ptr_ptr++)
1791 if (ecoffsymbol (*sym_ptr_ptr)->local)
1800 /* There are some local symbols. We just bring over all the
1801 debugging information. FIXME: This is not quite the right
1802 thing to do. If the user has asked us to discard all
1803 debugging information, then we are probably going to wind up
1804 keeping it because there will probably be some local symbol
1805 which objcopy did not discard. We should actually break
1806 apart the debugging information and only keep that which
1807 applies to the symbols we want to keep. */
1808 oinfo->symbolic_header.ilineMax = iinfo->symbolic_header.ilineMax;
1809 oinfo->symbolic_header.cbLine = iinfo->symbolic_header.cbLine;
1810 oinfo->line = iinfo->line;
1812 oinfo->symbolic_header.idnMax = iinfo->symbolic_header.idnMax;
1813 oinfo->external_dnr = iinfo->external_dnr;
1815 oinfo->symbolic_header.ipdMax = iinfo->symbolic_header.ipdMax;
1816 oinfo->external_pdr = iinfo->external_pdr;
1818 oinfo->symbolic_header.isymMax = iinfo->symbolic_header.isymMax;
1819 oinfo->external_sym = iinfo->external_sym;
1821 oinfo->symbolic_header.ioptMax = iinfo->symbolic_header.ioptMax;
1822 oinfo->external_opt = iinfo->external_opt;
1824 oinfo->symbolic_header.iauxMax = iinfo->symbolic_header.iauxMax;
1825 oinfo->external_aux = iinfo->external_aux;
1827 oinfo->symbolic_header.issMax = iinfo->symbolic_header.issMax;
1828 oinfo->ss = iinfo->ss;
1830 oinfo->symbolic_header.ifdMax = iinfo->symbolic_header.ifdMax;
1831 oinfo->external_fdr = iinfo->external_fdr;
1833 oinfo->symbolic_header.crfd = iinfo->symbolic_header.crfd;
1834 oinfo->external_rfd = iinfo->external_rfd;
1838 /* We are discarding all the local symbol information. Look
1839 through the external symbols and remove all references to FDR
1840 or aux information. */
1841 c = bfd_get_symcount (obfd);
1842 sym_ptr_ptr = bfd_get_outsymbols (obfd);
1843 for (; c > 0; c--, sym_ptr_ptr++)
1847 (*(ecoff_backend (obfd)->debug_swap.swap_ext_in))
1848 (obfd, ecoffsymbol (*sym_ptr_ptr)->native, &esym);
1850 esym.asym.index = indexNil;
1851 (*(ecoff_backend (obfd)->debug_swap.swap_ext_out))
1852 (obfd, &esym, ecoffsymbol (*sym_ptr_ptr)->native);
1859 /* Set the architecture. The supported architecture is stored in the
1860 backend pointer. We always set the architecture anyhow, since many
1861 callers ignore the return value. */
1864 _bfd_ecoff_set_arch_mach (bfd *abfd,
1865 enum bfd_architecture arch,
1866 unsigned long machine)
1868 bfd_default_set_arch_mach (abfd, arch, machine);
1869 return arch == ecoff_backend (abfd)->arch;
1872 /* Get the size of the section headers. */
1875 _bfd_ecoff_sizeof_headers (bfd *abfd,
1876 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1883 for (current = abfd->sections;
1885 current = current->next)
1888 ret = (bfd_coff_filhsz (abfd)
1889 + bfd_coff_aoutsz (abfd)
1890 + c * bfd_coff_scnhsz (abfd));
1891 return BFD_ALIGN (ret, 16);
1894 /* Get the contents of a section. */
1897 _bfd_ecoff_get_section_contents (bfd *abfd,
1901 bfd_size_type count)
1903 return _bfd_generic_get_section_contents (abfd, section, location,
1907 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
1908 called via qsort. */
1911 ecoff_sort_hdrs (const void * arg1, const void * arg2)
1913 const asection *hdr1 = *(const asection **) arg1;
1914 const asection *hdr2 = *(const asection **) arg2;
1916 if ((hdr1->flags & SEC_ALLOC) != 0)
1918 if ((hdr2->flags & SEC_ALLOC) == 0)
1923 if ((hdr2->flags & SEC_ALLOC) != 0)
1926 if (hdr1->vma < hdr2->vma)
1928 else if (hdr1->vma > hdr2->vma)
1934 /* Calculate the file position for each section, and set
1938 ecoff_compute_section_file_positions (bfd *abfd)
1940 file_ptr sofar, file_sofar;
1941 asection **sorted_hdrs;
1945 bfd_boolean rdata_in_text;
1946 bfd_boolean first_data, first_nonalloc;
1947 const bfd_vma round = ecoff_backend (abfd)->round;
1950 sofar = _bfd_ecoff_sizeof_headers (abfd, NULL);
1953 /* Sort the sections by VMA. */
1954 amt = abfd->section_count;
1955 amt *= sizeof (asection *);
1956 sorted_hdrs = (asection **) bfd_malloc (amt);
1957 if (sorted_hdrs == NULL)
1959 for (current = abfd->sections, i = 0;
1961 current = current->next, i++)
1962 sorted_hdrs[i] = current;
1963 BFD_ASSERT (i == abfd->section_count);
1965 qsort (sorted_hdrs, abfd->section_count, sizeof (asection *),
1968 /* Some versions of the OSF linker put the .rdata section in the
1969 text segment, and some do not. */
1970 rdata_in_text = ecoff_backend (abfd)->rdata_in_text;
1973 for (i = 0; i < abfd->section_count; i++)
1975 current = sorted_hdrs[i];
1976 if (streq (current->name, _RDATA))
1978 if ((current->flags & SEC_CODE) == 0
1979 && ! streq (current->name, _PDATA)
1980 && ! streq (current->name, _RCONST))
1982 rdata_in_text = FALSE;
1987 ecoff_data (abfd)->rdata_in_text = rdata_in_text;
1990 first_nonalloc = TRUE;
1991 for (i = 0; i < abfd->section_count; i++)
1993 unsigned int alignment_power;
1995 current = sorted_hdrs[i];
1997 /* For the Alpha ECOFF .pdata section the lnnoptr field is
1998 supposed to indicate the number of .pdata entries that are
1999 really in the section. Each entry is 8 bytes. We store this
2000 away in line_filepos before increasing the section size. */
2001 if (streq (current->name, _PDATA))
2002 current->line_filepos = current->size / 8;
2004 alignment_power = current->alignment_power;
2006 /* On Ultrix, the data sections in an executable file must be
2007 aligned to a page boundary within the file. This does not
2008 affect the section size, though. FIXME: Does this work for
2009 other platforms? It requires some modification for the
2010 Alpha, because .rdata on the Alpha goes with the text, not
2012 if ((abfd->flags & EXEC_P) != 0
2013 && (abfd->flags & D_PAGED) != 0
2015 && (current->flags & SEC_CODE) == 0
2017 || ! streq (current->name, _RDATA))
2018 && ! streq (current->name, _PDATA)
2019 && ! streq (current->name, _RCONST))
2021 sofar = (sofar + round - 1) &~ (round - 1);
2022 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2025 else if (streq (current->name, _LIB))
2027 /* On Irix 4, the location of contents of the .lib section
2028 from a shared library section is also rounded up to a
2031 sofar = (sofar + round - 1) &~ (round - 1);
2032 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2034 else if (first_nonalloc
2035 && (current->flags & SEC_ALLOC) == 0
2036 && (abfd->flags & D_PAGED) != 0)
2038 /* Skip up to the next page for an unallocated section, such
2039 as the .comment section on the Alpha. This leaves room
2040 for the .bss section. */
2041 first_nonalloc = FALSE;
2042 sofar = (sofar + round - 1) &~ (round - 1);
2043 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2046 /* Align the sections in the file to the same boundary on
2047 which they are aligned in virtual memory. */
2048 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2049 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2050 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
2052 if ((abfd->flags & D_PAGED) != 0
2053 && (current->flags & SEC_ALLOC) != 0)
2055 sofar += (current->vma - sofar) % round;
2056 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2057 file_sofar += (current->vma - file_sofar) % round;
2060 if ((current->flags & (SEC_HAS_CONTENTS | SEC_LOAD)) != 0)
2061 current->filepos = file_sofar;
2063 sofar += current->size;
2064 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2065 file_sofar += current->size;
2067 /* Make sure that this section is of the right size too. */
2069 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2070 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2071 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
2072 current->size += sofar - old_sofar;
2078 ecoff_data (abfd)->reloc_filepos = file_sofar;
2083 /* Determine the location of the relocs for all the sections in the
2084 output file, as well as the location of the symbolic debugging
2087 static bfd_size_type
2088 ecoff_compute_reloc_file_positions (bfd *abfd)
2090 const bfd_size_type external_reloc_size =
2091 ecoff_backend (abfd)->external_reloc_size;
2092 file_ptr reloc_base;
2093 bfd_size_type reloc_size;
2097 if (! abfd->output_has_begun)
2099 if (! ecoff_compute_section_file_positions (abfd))
2101 abfd->output_has_begun = TRUE;
2104 reloc_base = ecoff_data (abfd)->reloc_filepos;
2107 for (current = abfd->sections;
2109 current = current->next)
2111 if (current->reloc_count == 0)
2112 current->rel_filepos = 0;
2115 bfd_size_type relsize;
2117 current->rel_filepos = reloc_base;
2118 relsize = current->reloc_count * external_reloc_size;
2119 reloc_size += relsize;
2120 reloc_base += relsize;
2124 sym_base = ecoff_data (abfd)->reloc_filepos + reloc_size;
2126 /* At least on Ultrix, the symbol table of an executable file must
2127 be aligned to a page boundary. FIXME: Is this true on other
2129 if ((abfd->flags & EXEC_P) != 0
2130 && (abfd->flags & D_PAGED) != 0)
2131 sym_base = ((sym_base + ecoff_backend (abfd)->round - 1)
2132 &~ (ecoff_backend (abfd)->round - 1));
2134 ecoff_data (abfd)->sym_filepos = sym_base;
2139 /* Set the contents of a section. */
2142 _bfd_ecoff_set_section_contents (bfd *abfd,
2144 const void * location,
2146 bfd_size_type count)
2150 /* This must be done first, because bfd_set_section_contents is
2151 going to set output_has_begun to TRUE. */
2152 if (! abfd->output_has_begun
2153 && ! ecoff_compute_section_file_positions (abfd))
2156 /* Handle the .lib section specially so that Irix 4 shared libraries
2157 work out. See coff_set_section_contents in coffcode.h. */
2158 if (streq (section->name, _LIB))
2160 bfd_byte *rec, *recend;
2162 rec = (bfd_byte *) location;
2163 recend = rec + count;
2164 while (rec < recend)
2167 rec += bfd_get_32 (abfd, rec) * 4;
2170 BFD_ASSERT (rec == recend);
2176 pos = section->filepos + offset;
2177 if (bfd_seek (abfd, pos, SEEK_SET) != 0
2178 || bfd_bwrite (location, count, abfd) != count)
2184 /* Get the GP value for an ECOFF file. This is a hook used by
2188 bfd_ecoff_get_gp_value (bfd *abfd)
2190 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2191 || bfd_get_format (abfd) != bfd_object)
2193 bfd_set_error (bfd_error_invalid_operation);
2197 return ecoff_data (abfd)->gp;
2200 /* Set the GP value for an ECOFF file. This is a hook used by the
2204 bfd_ecoff_set_gp_value (bfd *abfd, bfd_vma gp_value)
2206 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2207 || bfd_get_format (abfd) != bfd_object)
2209 bfd_set_error (bfd_error_invalid_operation);
2213 ecoff_data (abfd)->gp = gp_value;
2218 /* Set the register masks for an ECOFF file. This is a hook used by
2222 bfd_ecoff_set_regmasks (bfd *abfd,
2223 unsigned long gprmask,
2224 unsigned long fprmask,
2225 unsigned long *cprmask)
2227 ecoff_data_type *tdata;
2229 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2230 || bfd_get_format (abfd) != bfd_object)
2232 bfd_set_error (bfd_error_invalid_operation);
2236 tdata = ecoff_data (abfd);
2237 tdata->gprmask = gprmask;
2238 tdata->fprmask = fprmask;
2239 if (cprmask != NULL)
2243 for (i = 0; i < 3; i++)
2244 tdata->cprmask[i] = cprmask[i];
2250 /* Get ECOFF EXTR information for an external symbol. This function
2251 is passed to bfd_ecoff_debug_externals. */
2254 ecoff_get_extr (asymbol *sym, EXTR *esym)
2256 ecoff_symbol_type *ecoff_sym_ptr;
2259 if (bfd_asymbol_flavour (sym) != bfd_target_ecoff_flavour
2260 || ecoffsymbol (sym)->native == NULL)
2262 /* Don't include debugging, local, or section symbols. */
2263 if ((sym->flags & BSF_DEBUGGING) != 0
2264 || (sym->flags & BSF_LOCAL) != 0
2265 || (sym->flags & BSF_SECTION_SYM) != 0)
2269 esym->cobol_main = 0;
2270 esym->weakext = (sym->flags & BSF_WEAK) != 0;
2273 /* FIXME: we can do better than this for st and sc. */
2274 esym->asym.st = stGlobal;
2275 esym->asym.sc = scAbs;
2276 esym->asym.reserved = 0;
2277 esym->asym.index = indexNil;
2281 ecoff_sym_ptr = ecoffsymbol (sym);
2283 if (ecoff_sym_ptr->local)
2286 input_bfd = bfd_asymbol_bfd (sym);
2287 (*(ecoff_backend (input_bfd)->debug_swap.swap_ext_in))
2288 (input_bfd, ecoff_sym_ptr->native, esym);
2290 /* If the symbol was defined by the linker, then esym will be
2291 undefined but sym will not be. Get a better class for such a
2293 if ((esym->asym.sc == scUndefined
2294 || esym->asym.sc == scSUndefined)
2295 && ! bfd_is_und_section (bfd_get_section (sym)))
2296 esym->asym.sc = scAbs;
2298 /* Adjust the FDR index for the symbol by that used for the input
2300 if (esym->ifd != -1)
2302 struct ecoff_debug_info *input_debug;
2304 input_debug = &ecoff_data (input_bfd)->debug_info;
2305 BFD_ASSERT (esym->ifd < input_debug->symbolic_header.ifdMax);
2306 if (input_debug->ifdmap != NULL)
2307 esym->ifd = input_debug->ifdmap[esym->ifd];
2313 /* Set the external symbol index. This routine is passed to
2314 bfd_ecoff_debug_externals. */
2317 ecoff_set_index (asymbol *sym, bfd_size_type indx)
2319 ecoff_set_sym_index (sym, indx);
2322 /* Write out an ECOFF file. */
2325 _bfd_ecoff_write_object_contents (bfd *abfd)
2327 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
2328 const bfd_vma round = backend->round;
2329 const bfd_size_type filhsz = bfd_coff_filhsz (abfd);
2330 const bfd_size_type aoutsz = bfd_coff_aoutsz (abfd);
2331 const bfd_size_type scnhsz = bfd_coff_scnhsz (abfd);
2332 const bfd_size_type external_hdr_size
2333 = backend->debug_swap.external_hdr_size;
2334 const bfd_size_type external_reloc_size = backend->external_reloc_size;
2335 void (* const adjust_reloc_out) (bfd *, const arelent *, struct internal_reloc *)
2336 = backend->adjust_reloc_out;
2337 void (* const swap_reloc_out) (bfd *, const struct internal_reloc *, void *)
2338 = backend->swap_reloc_out;
2339 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
2340 HDRR * const symhdr = &debug->symbolic_header;
2343 bfd_size_type reloc_size;
2344 bfd_size_type text_size;
2346 bfd_boolean set_text_start;
2347 bfd_size_type data_size;
2349 bfd_boolean set_data_start;
2350 bfd_size_type bss_size;
2352 void * reloc_buff = NULL;
2353 struct internal_filehdr internal_f;
2354 struct internal_aouthdr internal_a;
2357 /* Determine where the sections and relocs will go in the output
2359 reloc_size = ecoff_compute_reloc_file_positions (abfd);
2362 for (current = abfd->sections;
2364 current = current->next)
2366 current->target_index = count;
2370 if ((abfd->flags & D_PAGED) != 0)
2371 text_size = _bfd_ecoff_sizeof_headers (abfd, NULL);
2375 set_text_start = FALSE;
2378 set_data_start = FALSE;
2381 /* Write section headers to the file. */
2383 /* Allocate buff big enough to hold a section header,
2384 file header, or a.out header. */
2393 buff = bfd_malloc (siz);
2398 internal_f.f_nscns = 0;
2399 if (bfd_seek (abfd, (file_ptr) (filhsz + aoutsz), SEEK_SET) != 0)
2402 for (current = abfd->sections;
2404 current = current->next)
2406 struct internal_scnhdr section;
2409 ++internal_f.f_nscns;
2411 strncpy (section.s_name, current->name, sizeof section.s_name);
2413 /* This seems to be correct for Irix 4 shared libraries. */
2414 vma = bfd_get_section_vma (abfd, current);
2415 if (streq (current->name, _LIB))
2416 section.s_vaddr = 0;
2418 section.s_vaddr = vma;
2420 section.s_paddr = current->lma;
2421 section.s_size = current->size;
2423 /* If this section is unloadable then the scnptr will be 0. */
2424 if ((current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
2425 section.s_scnptr = 0;
2427 section.s_scnptr = current->filepos;
2428 section.s_relptr = current->rel_filepos;
2430 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2431 object file produced by the assembler is supposed to point to
2432 information about how much room is required by objects of
2433 various different sizes. I think this only matters if we
2434 want the linker to compute the best size to use, or
2435 something. I don't know what happens if the information is
2437 if (! streq (current->name, _PDATA))
2438 section.s_lnnoptr = 0;
2441 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2442 hold the number of entries in the section (each entry is
2443 8 bytes). We stored this in the line_filepos field in
2444 ecoff_compute_section_file_positions. */
2445 section.s_lnnoptr = current->line_filepos;
2448 section.s_nreloc = current->reloc_count;
2449 section.s_nlnno = 0;
2450 section.s_flags = ecoff_sec_to_styp_flags (current->name,
2453 if (bfd_coff_swap_scnhdr_out (abfd, (void *) §ion, buff) == 0
2454 || bfd_bwrite (buff, scnhsz, abfd) != scnhsz)
2457 if ((section.s_flags & STYP_TEXT) != 0
2458 || ((section.s_flags & STYP_RDATA) != 0
2459 && ecoff_data (abfd)->rdata_in_text)
2460 || section.s_flags == STYP_PDATA
2461 || (section.s_flags & STYP_DYNAMIC) != 0
2462 || (section.s_flags & STYP_LIBLIST) != 0
2463 || (section.s_flags & STYP_RELDYN) != 0
2464 || section.s_flags == STYP_CONFLIC
2465 || (section.s_flags & STYP_DYNSTR) != 0
2466 || (section.s_flags & STYP_DYNSYM) != 0
2467 || (section.s_flags & STYP_HASH) != 0
2468 || (section.s_flags & STYP_ECOFF_INIT) != 0
2469 || (section.s_flags & STYP_ECOFF_FINI) != 0
2470 || section.s_flags == STYP_RCONST)
2472 text_size += current->size;
2473 if (! set_text_start || text_start > vma)
2476 set_text_start = TRUE;
2479 else if ((section.s_flags & STYP_RDATA) != 0
2480 || (section.s_flags & STYP_DATA) != 0
2481 || (section.s_flags & STYP_LITA) != 0
2482 || (section.s_flags & STYP_LIT8) != 0
2483 || (section.s_flags & STYP_LIT4) != 0
2484 || (section.s_flags & STYP_SDATA) != 0
2485 || section.s_flags == STYP_XDATA
2486 || (section.s_flags & STYP_GOT) != 0)
2488 data_size += current->size;
2489 if (! set_data_start || data_start > vma)
2492 set_data_start = TRUE;
2495 else if ((section.s_flags & STYP_BSS) != 0
2496 || (section.s_flags & STYP_SBSS) != 0)
2497 bss_size += current->size;
2498 else if (section.s_flags == 0
2499 || (section.s_flags & STYP_ECOFF_LIB) != 0
2500 || section.s_flags == STYP_COMMENT)
2506 /* Set up the file header. */
2507 internal_f.f_magic = ecoff_get_magic (abfd);
2509 /* We will NOT put a fucking timestamp in the header here. Every
2510 time you put it back, I will come in and take it out again. I'm
2511 sorry. This field does not belong here. We fill it with a 0 so
2512 it compares the same but is not a reasonable time. --
2514 internal_f.f_timdat = 0;
2516 if (bfd_get_symcount (abfd) != 0)
2518 /* The ECOFF f_nsyms field is not actually the number of
2519 symbols, it's the size of symbolic information header. */
2520 internal_f.f_nsyms = external_hdr_size;
2521 internal_f.f_symptr = ecoff_data (abfd)->sym_filepos;
2525 internal_f.f_nsyms = 0;
2526 internal_f.f_symptr = 0;
2529 internal_f.f_opthdr = aoutsz;
2531 internal_f.f_flags = F_LNNO;
2532 if (reloc_size == 0)
2533 internal_f.f_flags |= F_RELFLG;
2534 if (bfd_get_symcount (abfd) == 0)
2535 internal_f.f_flags |= F_LSYMS;
2536 if (abfd->flags & EXEC_P)
2537 internal_f.f_flags |= F_EXEC;
2539 if (bfd_little_endian (abfd))
2540 internal_f.f_flags |= F_AR32WR;
2542 internal_f.f_flags |= F_AR32W;
2544 /* Set up the ``optional'' header. */
2545 if ((abfd->flags & D_PAGED) != 0)
2546 internal_a.magic = ECOFF_AOUT_ZMAGIC;
2548 internal_a.magic = ECOFF_AOUT_OMAGIC;
2550 /* FIXME: Is this really correct? */
2551 internal_a.vstamp = symhdr->vstamp;
2553 /* At least on Ultrix, these have to be rounded to page boundaries.
2554 FIXME: Is this true on other platforms? */
2555 if ((abfd->flags & D_PAGED) != 0)
2557 internal_a.tsize = (text_size + round - 1) &~ (round - 1);
2558 internal_a.text_start = text_start &~ (round - 1);
2559 internal_a.dsize = (data_size + round - 1) &~ (round - 1);
2560 internal_a.data_start = data_start &~ (round - 1);
2564 internal_a.tsize = text_size;
2565 internal_a.text_start = text_start;
2566 internal_a.dsize = data_size;
2567 internal_a.data_start = data_start;
2570 /* On Ultrix, the initial portions of the .sbss and .bss segments
2571 are at the end of the data section. The bsize field in the
2572 optional header records how many bss bytes are required beyond
2573 those in the data section. The value is not rounded to a page
2575 if (bss_size < internal_a.dsize - data_size)
2578 bss_size -= internal_a.dsize - data_size;
2579 internal_a.bsize = bss_size;
2580 internal_a.bss_start = internal_a.data_start + internal_a.dsize;
2582 internal_a.entry = bfd_get_start_address (abfd);
2584 internal_a.gp_value = ecoff_data (abfd)->gp;
2586 internal_a.gprmask = ecoff_data (abfd)->gprmask;
2587 internal_a.fprmask = ecoff_data (abfd)->fprmask;
2588 for (i = 0; i < 4; i++)
2589 internal_a.cprmask[i] = ecoff_data (abfd)->cprmask[i];
2591 /* Let the backend adjust the headers if necessary. */
2592 if (backend->adjust_headers)
2594 if (! (*backend->adjust_headers) (abfd, &internal_f, &internal_a))
2598 /* Write out the file header and the optional header. */
2599 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
2602 bfd_coff_swap_filehdr_out (abfd, (void *) &internal_f, buff);
2603 if (bfd_bwrite (buff, filhsz, abfd) != filhsz)
2606 bfd_coff_swap_aouthdr_out (abfd, (void *) &internal_a, buff);
2607 if (bfd_bwrite (buff, aoutsz, abfd) != aoutsz)
2610 /* Build the external symbol information. This must be done before
2611 writing out the relocs so that we know the symbol indices. We
2612 don't do this if this BFD was created by the backend linker,
2613 since it will have already handled the symbols and relocs. */
2614 if (! ecoff_data (abfd)->linker)
2616 symhdr->iextMax = 0;
2617 symhdr->issExtMax = 0;
2618 debug->external_ext = debug->external_ext_end = NULL;
2619 debug->ssext = debug->ssext_end = NULL;
2620 if (! bfd_ecoff_debug_externals (abfd, debug, &backend->debug_swap,
2621 (abfd->flags & EXEC_P) == 0,
2622 ecoff_get_extr, ecoff_set_index))
2625 /* Write out the relocs. */
2626 for (current = abfd->sections;
2628 current = current->next)
2630 arelent **reloc_ptr_ptr;
2631 arelent **reloc_end;
2635 if (current->reloc_count == 0)
2638 amt = current->reloc_count * external_reloc_size;
2639 reloc_buff = bfd_alloc (abfd, amt);
2640 if (reloc_buff == NULL)
2643 reloc_ptr_ptr = current->orelocation;
2644 reloc_end = reloc_ptr_ptr + current->reloc_count;
2645 out_ptr = (char *) reloc_buff;
2648 reloc_ptr_ptr < reloc_end;
2649 reloc_ptr_ptr++, out_ptr += external_reloc_size)
2653 struct internal_reloc in;
2655 memset ((void *) &in, 0, sizeof in);
2657 reloc = *reloc_ptr_ptr;
2658 sym = *reloc->sym_ptr_ptr;
2660 /* If the howto field has not been initialised then skip this reloc.
2661 This assumes that an error message has been issued elsewhere. */
2662 if (reloc->howto == NULL)
2665 in.r_vaddr = (reloc->address
2666 + bfd_get_section_vma (abfd, current));
2667 in.r_type = reloc->howto->type;
2669 if ((sym->flags & BSF_SECTION_SYM) == 0)
2671 in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr);
2685 { _TEXT, RELOC_SECTION_TEXT },
2686 { _RDATA, RELOC_SECTION_RDATA },
2687 { _DATA, RELOC_SECTION_DATA },
2688 { _SDATA, RELOC_SECTION_SDATA },
2689 { _SBSS, RELOC_SECTION_SBSS },
2690 { _BSS, RELOC_SECTION_BSS },
2691 { _INIT, RELOC_SECTION_INIT },
2692 { _LIT8, RELOC_SECTION_LIT8 },
2693 { _LIT4, RELOC_SECTION_LIT4 },
2694 { _XDATA, RELOC_SECTION_XDATA },
2695 { _PDATA, RELOC_SECTION_PDATA },
2696 { _FINI, RELOC_SECTION_FINI },
2697 { _LITA, RELOC_SECTION_LITA },
2698 { "*ABS*", RELOC_SECTION_ABS },
2699 { _RCONST, RELOC_SECTION_RCONST }
2702 name = bfd_get_section_name (abfd, bfd_get_section (sym));
2704 for (j = 0; j < ARRAY_SIZE (section_symndx); j++)
2705 if (streq (name, section_symndx[j].name))
2707 in.r_symndx = section_symndx[j].r_symndx;
2711 if (j == ARRAY_SIZE (section_symndx))
2716 (*adjust_reloc_out) (abfd, reloc, &in);
2718 (*swap_reloc_out) (abfd, &in, (void *) out_ptr);
2721 if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0)
2723 amt = current->reloc_count * external_reloc_size;
2724 if (bfd_bwrite (reloc_buff, amt, abfd) != amt)
2726 bfd_release (abfd, reloc_buff);
2730 /* Write out the symbolic debugging information. */
2731 if (bfd_get_symcount (abfd) > 0)
2733 /* Write out the debugging information. */
2734 if (! bfd_ecoff_write_debug (abfd, debug, &backend->debug_swap,
2735 ecoff_data (abfd)->sym_filepos))
2740 /* The .bss section of a demand paged executable must receive an
2741 entire page. If there are symbols, the symbols will start on the
2742 next page. If there are no symbols, we must fill out the page by
2744 if (bfd_get_symcount (abfd) == 0
2745 && (abfd->flags & EXEC_P) != 0
2746 && (abfd->flags & D_PAGED) != 0)
2750 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2753 if (bfd_bread (&c, (bfd_size_type) 1, abfd) == 0)
2755 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2758 if (bfd_bwrite (&c, (bfd_size_type) 1, abfd) != 1)
2762 if (reloc_buff != NULL)
2763 bfd_release (abfd, reloc_buff);
2768 if (reloc_buff != NULL)
2769 bfd_release (abfd, reloc_buff);
2775 /* Archive handling. ECOFF uses what appears to be a unique type of
2776 archive header (armap). The byte ordering of the armap and the
2777 contents are encoded in the name of the armap itself. At least for
2778 now, we only support archives with the same byte ordering in the
2779 armap and the contents.
2781 The first four bytes in the armap are the number of symbol
2782 definitions. This is always a power of two.
2784 This is followed by the symbol definitions. Each symbol definition
2785 occupies 8 bytes. The first four bytes are the offset from the
2786 start of the armap strings to the null-terminated string naming
2787 this symbol. The second four bytes are the file offset to the
2788 archive member which defines this symbol. If the second four bytes
2789 are 0, then this is not actually a symbol definition, and it should
2792 The symbols are hashed into the armap with a closed hashing scheme.
2793 See the functions below for the details of the algorithm.
2795 After the symbol definitions comes four bytes holding the size of
2796 the string table, followed by the string table itself. */
2798 /* The name of an archive headers looks like this:
2799 __________E[BL]E[BL]_ (with a trailing space).
2800 The trailing space is changed to an X if the archive is changed to
2801 indicate that the armap is out of date.
2803 The Alpha seems to use ________64E[BL]E[BL]_. */
2805 #define ARMAP_BIG_ENDIAN 'B'
2806 #define ARMAP_LITTLE_ENDIAN 'L'
2807 #define ARMAP_MARKER 'E'
2808 #define ARMAP_START_LENGTH 10
2809 #define ARMAP_HEADER_MARKER_INDEX 10
2810 #define ARMAP_HEADER_ENDIAN_INDEX 11
2811 #define ARMAP_OBJECT_MARKER_INDEX 12
2812 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2813 #define ARMAP_END_INDEX 14
2814 #define ARMAP_END "_ "
2816 /* This is a magic number used in the hashing algorithm. */
2817 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2819 /* This returns the hash value to use for a string. It also sets
2820 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2821 is the number of entries in the hash table, and HLOG is the log
2825 ecoff_armap_hash (const char *s,
2826 unsigned int *rehash,
2836 hash = ((hash >> 27) | (hash << 5)) + *s++;
2837 hash *= ARMAP_HASH_MAGIC;
2838 *rehash = (hash & (size - 1)) | 1;
2839 return hash >> (32 - hlog);
2842 /* Read in the armap. */
2845 _bfd_ecoff_slurp_armap (bfd *abfd)
2849 struct areltdata *mapdata;
2850 bfd_size_type parsed_size;
2852 struct artdata *ardata;
2859 /* Get the name of the first element. */
2860 i = bfd_bread ((void *) nextname, (bfd_size_type) 16, abfd);
2866 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
2869 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2870 standard COFF armap. We could move the ECOFF armap stuff into
2871 bfd_slurp_armap, but that seems inappropriate since no other
2872 target uses this format. Instead, we check directly for a COFF
2874 if (CONST_STRNEQ (nextname, "/ "))
2875 return bfd_slurp_armap (abfd);
2877 /* See if the first element is an armap. */
2878 if (! strneq (nextname, ecoff_backend (abfd)->armap_start, ARMAP_START_LENGTH)
2879 || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER
2880 || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
2881 && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
2882 || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER
2883 || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
2884 && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
2885 || ! strneq (nextname + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1))
2887 bfd_has_map (abfd) = FALSE;
2891 /* Make sure we have the right byte ordering. */
2892 if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
2893 ^ (bfd_header_big_endian (abfd)))
2894 || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
2895 ^ (bfd_big_endian (abfd))))
2897 bfd_set_error (bfd_error_wrong_format);
2901 /* Read in the armap. */
2902 ardata = bfd_ardata (abfd);
2903 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
2904 if (mapdata == NULL)
2906 parsed_size = mapdata->parsed_size;
2909 raw_armap = (char *) bfd_alloc (abfd, parsed_size);
2910 if (raw_armap == NULL)
2913 if (bfd_bread ((void *) raw_armap, parsed_size, abfd) != parsed_size)
2915 if (bfd_get_error () != bfd_error_system_call)
2916 bfd_set_error (bfd_error_malformed_archive);
2917 bfd_release (abfd, (void *) raw_armap);
2921 ardata->tdata = (void *) raw_armap;
2923 count = H_GET_32 (abfd, raw_armap);
2925 ardata->symdef_count = 0;
2926 ardata->cache = NULL;
2928 /* This code used to overlay the symdefs over the raw archive data,
2929 but that doesn't work on a 64 bit host. */
2930 stringbase = raw_armap + count * 8 + 8;
2932 #ifdef CHECK_ARMAP_HASH
2936 /* Double check that I have the hashing algorithm right by making
2937 sure that every symbol can be looked up successfully. */
2939 for (i = 1; i < count; i <<= 1)
2941 BFD_ASSERT (i == count);
2943 raw_ptr = raw_armap + 4;
2944 for (i = 0; i < count; i++, raw_ptr += 8)
2946 unsigned int name_offset, file_offset;
2947 unsigned int hash, rehash, srch;
2949 name_offset = H_GET_32 (abfd, raw_ptr);
2950 file_offset = H_GET_32 (abfd, (raw_ptr + 4));
2951 if (file_offset == 0)
2953 hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count,
2958 /* See if we can rehash to this location. */
2959 for (srch = (hash + rehash) & (count - 1);
2960 srch != hash && srch != i;
2961 srch = (srch + rehash) & (count - 1))
2962 BFD_ASSERT (H_GET_32 (abfd, (raw_armap + 8 + srch * 8)) != 0);
2963 BFD_ASSERT (srch == i);
2967 #endif /* CHECK_ARMAP_HASH */
2969 raw_ptr = raw_armap + 4;
2970 for (i = 0; i < count; i++, raw_ptr += 8)
2971 if (H_GET_32 (abfd, (raw_ptr + 4)) != 0)
2972 ++ardata->symdef_count;
2974 amt = ardata->symdef_count;
2975 amt *= sizeof (carsym);
2976 symdef_ptr = (carsym *) bfd_alloc (abfd, amt);
2980 ardata->symdefs = symdef_ptr;
2982 raw_ptr = raw_armap + 4;
2983 for (i = 0; i < count; i++, raw_ptr += 8)
2985 unsigned int name_offset, file_offset;
2987 file_offset = H_GET_32 (abfd, (raw_ptr + 4));
2988 if (file_offset == 0)
2990 name_offset = H_GET_32 (abfd, raw_ptr);
2991 symdef_ptr->name = stringbase + name_offset;
2992 symdef_ptr->file_offset = file_offset;
2996 ardata->first_file_filepos = bfd_tell (abfd);
2997 /* Pad to an even boundary. */
2998 ardata->first_file_filepos += ardata->first_file_filepos % 2;
3000 bfd_has_map (abfd) = TRUE;
3005 /* Write out an armap. */
3008 _bfd_ecoff_write_armap (bfd *abfd,
3009 unsigned int elength,
3011 unsigned int orl_count,
3014 unsigned int hashsize, hashlog;
3015 bfd_size_type symdefsize;
3017 unsigned int stringsize;
3018 unsigned int mapsize;
3021 struct stat statbuf;
3024 bfd_byte *hashtable;
3028 /* Ultrix appears to use as a hash table size the least power of two
3029 greater than twice the number of entries. */
3030 for (hashlog = 0; ((unsigned int) 1 << hashlog) <= 2 * orl_count; hashlog++)
3032 hashsize = 1 << hashlog;
3034 symdefsize = hashsize * 8;
3036 stringsize = stridx + padit;
3038 /* Include 8 bytes to store symdefsize and stringsize in output. */
3039 mapsize = symdefsize + stringsize + 8;
3041 firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength;
3043 memset ((void *) &hdr, 0, sizeof hdr);
3045 /* Work out the ECOFF armap name. */
3046 strcpy (hdr.ar_name, ecoff_backend (abfd)->armap_start);
3047 hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER;
3048 hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] =
3049 (bfd_header_big_endian (abfd)
3051 : ARMAP_LITTLE_ENDIAN);
3052 hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER;
3053 hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] =
3054 bfd_big_endian (abfd) ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN;
3055 memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1);
3057 /* Write the timestamp of the archive header to be just a little bit
3058 later than the timestamp of the file, otherwise the linker will
3059 complain that the index is out of date. Actually, the Ultrix
3060 linker just checks the archive name; the GNU linker may check the
3062 stat (abfd->filename, &statbuf);
3063 _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
3064 (long) (statbuf.st_mtime + 60));
3066 /* The DECstation uses zeroes for the uid, gid and mode of the
3068 hdr.ar_uid[0] = '0';
3069 hdr.ar_gid[0] = '0';
3070 /* Building gcc ends up extracting the armap as a file - twice. */
3071 hdr.ar_mode[0] = '6';
3072 hdr.ar_mode[1] = '4';
3073 hdr.ar_mode[2] = '4';
3075 _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld", mapsize);
3077 hdr.ar_fmag[0] = '`';
3078 hdr.ar_fmag[1] = '\012';
3080 /* Turn all null bytes in the header into spaces. */
3081 for (i = 0; i < sizeof (struct ar_hdr); i++)
3082 if (((char *) (&hdr))[i] == '\0')
3083 (((char *) (&hdr))[i]) = ' ';
3085 if (bfd_bwrite ((void *) &hdr, (bfd_size_type) sizeof (struct ar_hdr), abfd)
3086 != sizeof (struct ar_hdr))
3089 H_PUT_32 (abfd, hashsize, temp);
3090 if (bfd_bwrite ((void *) temp, (bfd_size_type) 4, abfd) != 4)
3093 hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize);
3097 current = abfd->archive_head;
3099 for (i = 0; i < orl_count; i++)
3101 unsigned int hash, rehash = 0;
3103 /* Advance firstreal to the file position of this archive
3105 if (map[i].u.abfd != last_elt)
3109 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
3110 firstreal += firstreal % 2;
3111 current = current->archive_next;
3113 while (current != map[i].u.abfd);
3118 hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog);
3119 if (H_GET_32 (abfd, (hashtable + (hash * 8) + 4)) != 0)
3123 /* The desired slot is already taken. */
3124 for (srch = (hash + rehash) & (hashsize - 1);
3126 srch = (srch + rehash) & (hashsize - 1))
3127 if (H_GET_32 (abfd, (hashtable + (srch * 8) + 4)) == 0)
3130 BFD_ASSERT (srch != hash);
3135 H_PUT_32 (abfd, map[i].namidx, (hashtable + hash * 8));
3136 H_PUT_32 (abfd, firstreal, (hashtable + hash * 8 + 4));
3139 if (bfd_bwrite ((void *) hashtable, symdefsize, abfd) != symdefsize)
3142 bfd_release (abfd, hashtable);
3144 /* Now write the strings. */
3145 H_PUT_32 (abfd, stringsize, temp);
3146 if (bfd_bwrite ((void *) temp, (bfd_size_type) 4, abfd) != 4)
3148 for (i = 0; i < orl_count; i++)
3152 len = strlen (*map[i].name) + 1;
3153 if (bfd_bwrite ((void *) (*map[i].name), len, abfd) != len)
3157 /* The spec sez this should be a newline. But in order to be
3158 bug-compatible for DECstation ar we use a null. */
3161 if (bfd_bwrite ("", (bfd_size_type) 1, abfd) != 1)
3168 /* ECOFF linker code. */
3170 /* Routine to create an entry in an ECOFF link hash table. */
3172 static struct bfd_hash_entry *
3173 ecoff_link_hash_newfunc (struct bfd_hash_entry *entry,
3174 struct bfd_hash_table *table,
3177 struct ecoff_link_hash_entry *ret = (struct ecoff_link_hash_entry *) entry;
3179 /* Allocate the structure if it has not already been allocated by a
3182 ret = ((struct ecoff_link_hash_entry *)
3183 bfd_hash_allocate (table, sizeof (struct ecoff_link_hash_entry)));
3187 /* Call the allocation method of the superclass. */
3188 ret = ((struct ecoff_link_hash_entry *)
3189 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3194 /* Set local fields. */
3200 memset ((void *) &ret->esym, 0, sizeof ret->esym);
3202 return (struct bfd_hash_entry *) ret;
3205 /* Create an ECOFF link hash table. */
3207 struct bfd_link_hash_table *
3208 _bfd_ecoff_bfd_link_hash_table_create (bfd *abfd)
3210 struct ecoff_link_hash_table *ret;
3211 bfd_size_type amt = sizeof (struct ecoff_link_hash_table);
3213 ret = (struct ecoff_link_hash_table *) bfd_malloc (amt);
3216 if (!_bfd_link_hash_table_init (&ret->root, abfd,
3217 ecoff_link_hash_newfunc,
3218 sizeof (struct ecoff_link_hash_entry)))
3226 /* Look up an entry in an ECOFF link hash table. */
3228 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3229 ((struct ecoff_link_hash_entry *) \
3230 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3232 /* Get the ECOFF link hash table from the info structure. This is
3235 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3237 /* Add the external symbols of an object file to the global linker
3238 hash table. The external symbols and strings we are passed are
3239 just allocated on the stack, and will be discarded. We must
3240 explicitly save any information we may need later on in the link.
3241 We do not want to read the external symbol information again. */
3244 ecoff_link_add_externals (bfd *abfd,
3245 struct bfd_link_info *info,
3246 void * external_ext,
3249 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3250 void (* const swap_ext_in) (bfd *, void *, EXTR *)
3251 = backend->debug_swap.swap_ext_in;
3252 bfd_size_type external_ext_size = backend->debug_swap.external_ext_size;
3253 unsigned long ext_count;
3254 struct bfd_link_hash_entry **sym_hash;
3259 ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
3262 amt *= sizeof (struct bfd_link_hash_entry *);
3263 sym_hash = (struct bfd_link_hash_entry **) bfd_alloc (abfd, amt);
3266 ecoff_data (abfd)->sym_hashes = (struct ecoff_link_hash_entry **) sym_hash;
3268 ext_ptr = (char *) external_ext;
3269 ext_end = ext_ptr + ext_count * external_ext_size;
3270 for (; ext_ptr < ext_end; ext_ptr += external_ext_size, sym_hash++)
3277 struct ecoff_link_hash_entry *h;
3281 (*swap_ext_in) (abfd, (void *) ext_ptr, &esym);
3283 /* Skip debugging symbols. */
3285 switch (esym.asym.st)
3301 /* Get the information for this symbol. */
3302 value = esym.asym.value;
3303 switch (esym.asym.sc)
3323 section = bfd_make_section_old_way (abfd, _TEXT);
3324 value -= section->vma;
3327 section = bfd_make_section_old_way (abfd, _DATA);
3328 value -= section->vma;
3331 section = bfd_make_section_old_way (abfd, _BSS);
3332 value -= section->vma;
3335 section = bfd_abs_section_ptr;
3338 section = bfd_und_section_ptr;
3341 section = bfd_make_section_old_way (abfd, _SDATA);
3342 value -= section->vma;
3345 section = bfd_make_section_old_way (abfd, _SBSS);
3346 value -= section->vma;
3349 section = bfd_make_section_old_way (abfd, _RDATA);
3350 value -= section->vma;
3353 if (value > ecoff_data (abfd)->gp_size)
3355 section = bfd_com_section_ptr;
3360 if (ecoff_scom_section.name == NULL)
3362 /* Initialize the small common section. */
3363 ecoff_scom_section.name = SCOMMON;
3364 ecoff_scom_section.flags = SEC_IS_COMMON;
3365 ecoff_scom_section.output_section = &ecoff_scom_section;
3366 ecoff_scom_section.symbol = &ecoff_scom_symbol;
3367 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
3368 ecoff_scom_symbol.name = SCOMMON;
3369 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
3370 ecoff_scom_symbol.section = &ecoff_scom_section;
3371 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
3373 section = &ecoff_scom_section;
3376 section = bfd_und_section_ptr;
3379 section = bfd_make_section_old_way (abfd, _INIT);
3380 value -= section->vma;
3383 section = bfd_make_section_old_way (abfd, _FINI);
3384 value -= section->vma;
3387 section = bfd_make_section_old_way (abfd, _RCONST);
3388 value -= section->vma;
3392 if (section == NULL)
3395 name = ssext + esym.asym.iss;
3397 if (! (_bfd_generic_link_add_one_symbol
3399 (flagword) (esym.weakext ? BSF_WEAK : BSF_GLOBAL),
3400 section, value, NULL, TRUE, TRUE, sym_hash)))
3403 h = (struct ecoff_link_hash_entry *) *sym_hash;
3405 /* If we are building an ECOFF hash table, save the external
3406 symbol information. */
3407 if (bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd))
3410 || (! bfd_is_und_section (section)
3411 && (! bfd_is_com_section (section)
3412 || (h->root.type != bfd_link_hash_defined
3413 && h->root.type != bfd_link_hash_defweak))))
3419 /* Remember whether this symbol was small undefined. */
3420 if (esym.asym.sc == scSUndefined)
3423 /* If this symbol was ever small undefined, it needs to wind
3424 up in a GP relative section. We can't control the
3425 section of a defined symbol, but we can control the
3426 section of a common symbol. This case is actually needed
3427 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
3429 && h->root.type == bfd_link_hash_common
3430 && streq (h->root.u.c.p->section->name, SCOMMON))
3432 h->root.u.c.p->section = bfd_make_section_old_way (abfd,
3434 h->root.u.c.p->section->flags = SEC_ALLOC;
3435 if (h->esym.asym.sc == scCommon)
3436 h->esym.asym.sc = scSCommon;
3444 /* Add symbols from an ECOFF object file to the global linker hash
3448 ecoff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
3451 bfd_size_type external_ext_size;
3452 void * external_ext = NULL;
3453 bfd_size_type esize;
3457 if (! ecoff_slurp_symbolic_header (abfd))
3460 /* If there are no symbols, we don't want it. */
3461 if (bfd_get_symcount (abfd) == 0)
3464 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3466 /* Read in the external symbols and external strings. */
3467 external_ext_size = ecoff_backend (abfd)->debug_swap.external_ext_size;
3468 esize = symhdr->iextMax * external_ext_size;
3469 external_ext = bfd_malloc (esize);
3470 if (external_ext == NULL && esize != 0)
3473 if (bfd_seek (abfd, (file_ptr) symhdr->cbExtOffset, SEEK_SET) != 0
3474 || bfd_bread (external_ext, esize, abfd) != esize)
3477 ssext = (char *) bfd_malloc ((bfd_size_type) symhdr->issExtMax);
3478 if (ssext == NULL && symhdr->issExtMax != 0)
3481 if (bfd_seek (abfd, (file_ptr) symhdr->cbSsExtOffset, SEEK_SET) != 0
3482 || (bfd_bread (ssext, (bfd_size_type) symhdr->issExtMax, abfd)
3483 != (bfd_size_type) symhdr->issExtMax))
3486 result = ecoff_link_add_externals (abfd, info, external_ext, ssext);
3490 if (external_ext != NULL)
3491 free (external_ext);
3497 if (external_ext != NULL)
3498 free (external_ext);
3502 /* Factored out from ecoff_link_check_archive_element. */
3505 read_ext_syms_and_strs (HDRR **symhdr, bfd_size_type *external_ext_size,
3506 bfd_size_type *esize, void **external_ext, char **ssext, bfd *abfd,
3507 const struct ecoff_backend_data * const backend)
3509 if (! ecoff_slurp_symbolic_header (abfd))
3512 /* If there are no symbols, we don't want it. */
3513 if (bfd_get_symcount (abfd) == 0)
3516 *symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3518 *external_ext_size = backend->debug_swap.external_ext_size;
3519 *esize = (*symhdr)->iextMax * *external_ext_size;
3520 *external_ext = bfd_malloc (*esize);
3521 if (*external_ext == NULL && *esize != 0)
3524 if (bfd_seek (abfd, (file_ptr) (*symhdr)->cbExtOffset, SEEK_SET) != 0
3525 || bfd_bread (*external_ext, *esize, abfd) != *esize)
3528 *ssext = (char *) bfd_malloc ((bfd_size_type) (*symhdr)->issExtMax);
3529 if (*ssext == NULL && (*symhdr)->issExtMax != 0)
3532 if (bfd_seek (abfd, (file_ptr) (*symhdr)->cbSsExtOffset, SEEK_SET) != 0
3533 || (bfd_bread (*ssext, (bfd_size_type) (*symhdr)->issExtMax, abfd)
3534 != (bfd_size_type) (*symhdr)->issExtMax))
3540 reread_ext_syms_and_strs (HDRR **symhdr, bfd_size_type *external_ext_size,
3541 bfd_size_type *esize, void **external_ext, char **ssext, bfd *abfd,
3542 const struct ecoff_backend_data * const backend)
3544 if (*external_ext != NULL)
3545 free (*external_ext);
3546 *external_ext = NULL;
3550 return read_ext_syms_and_strs (symhdr, external_ext_size, esize,
3551 external_ext, ssext, abfd, backend);
3554 /* This is called if we used _bfd_generic_link_add_archive_symbols
3555 because we were not dealing with an ECOFF archive. */
3558 ecoff_link_check_archive_element (bfd *abfd,
3559 struct bfd_link_info *info,
3560 bfd_boolean *pneeded)
3562 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3563 void (* const swap_ext_in) (bfd *, void *, EXTR *)
3564 = backend->debug_swap.swap_ext_in;
3566 bfd_size_type external_ext_size;
3567 void * external_ext = NULL;
3568 bfd_size_type esize;
3575 /* Read in the external symbols and external strings. */
3576 if (!read_ext_syms_and_strs (&symhdr, &external_ext_size, &esize,
3577 &external_ext, &ssext, abfd, backend))
3580 /* If there are no symbols, we don't want it. */
3581 if (bfd_get_symcount (abfd) == 0)
3582 goto successful_return;
3584 /* Look through the external symbols to see if they define some
3585 symbol that is currently undefined. */
3586 ext_ptr = (char *) external_ext;
3587 ext_end = ext_ptr + esize;
3588 for (; ext_ptr < ext_end; ext_ptr += external_ext_size)
3594 struct bfd_link_hash_entry *h;
3596 (*swap_ext_in) (abfd, (void *) ext_ptr, &esym);
3598 /* See if this symbol defines something. */
3599 if (esym.asym.st != stGlobal
3600 && esym.asym.st != stLabel
3601 && esym.asym.st != stProc)
3604 switch (esym.asym.sc)
3628 name = ssext + esym.asym.iss;
3629 h = bfd_link_hash_lookup (info->hash, name, FALSE, FALSE, TRUE);
3631 /* Unlike the generic linker, we do not pull in elements because
3632 of common symbols. */
3634 || h->type != bfd_link_hash_undefined)
3637 /* Include this element. */
3639 if (!(*info->callbacks
3640 ->add_archive_element) (info, abfd, name, &abfd))
3642 /* Potentially, the add_archive_element hook may have set a
3643 substitute BFD for us. */
3645 && !reread_ext_syms_and_strs (&symhdr, &external_ext_size, &esize,
3646 &external_ext, &ssext, abfd, backend))
3648 if (! ecoff_link_add_externals (abfd, info, external_ext, ssext))
3652 goto successful_return;
3656 if (external_ext != NULL)
3657 free (external_ext);
3662 if (external_ext != NULL)
3663 free (external_ext);
3669 /* Add the symbols from an archive file to the global hash table.
3670 This looks through the undefined symbols, looks each one up in the
3671 archive hash table, and adds any associated object file. We do not
3672 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3673 already have a hash table, so there is no reason to construct
3677 ecoff_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
3679 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3680 const bfd_byte *raw_armap;
3681 struct bfd_link_hash_entry **pundef;
3682 unsigned int armap_count;
3683 unsigned int armap_log;
3685 const bfd_byte *hashtable;
3686 const char *stringbase;
3688 if (! bfd_has_map (abfd))
3690 /* An empty archive is a special case. */
3691 if (bfd_openr_next_archived_file (abfd, NULL) == NULL)
3693 bfd_set_error (bfd_error_no_armap);
3697 /* If we don't have any raw data for this archive, as can happen on
3698 Irix 4.0.5F, we call the generic routine.
3699 FIXME: We should be more clever about this, since someday tdata
3700 may get to something for a generic archive. */
3701 raw_armap = (const bfd_byte *) bfd_ardata (abfd)->tdata;
3702 if (raw_armap == NULL)
3703 return (_bfd_generic_link_add_archive_symbols
3704 (abfd, info, ecoff_link_check_archive_element));
3706 armap_count = H_GET_32 (abfd, raw_armap);
3709 for (i = 1; i < armap_count; i <<= 1)
3711 BFD_ASSERT (i == armap_count);
3713 hashtable = raw_armap + 4;
3714 stringbase = (const char *) raw_armap + armap_count * 8 + 8;
3716 /* Look through the list of undefined symbols. */
3717 pundef = &info->hash->undefs;
3718 while (*pundef != NULL)
3720 struct bfd_link_hash_entry *h;
3721 unsigned int hash, rehash = 0;
3722 unsigned int file_offset;
3728 /* When a symbol is defined, it is not necessarily removed from
3730 if (h->type != bfd_link_hash_undefined
3731 && h->type != bfd_link_hash_common)
3733 /* Remove this entry from the list, for general cleanliness
3734 and because we are going to look through the list again
3735 if we search any more libraries. We can't remove the
3736 entry if it is the tail, because that would lose any
3737 entries we add to the list later on. */
3738 if (*pundef != info->hash->undefs_tail)
3739 *pundef = (*pundef)->u.undef.next;
3741 pundef = &(*pundef)->u.undef.next;
3745 /* Native ECOFF linkers do not pull in archive elements merely
3746 to satisfy common definitions, so neither do we. We leave
3747 them on the list, though, in case we are linking against some
3748 other object format. */
3749 if (h->type != bfd_link_hash_undefined)
3751 pundef = &(*pundef)->u.undef.next;
3755 /* Look for this symbol in the archive hash table. */
3756 hash = ecoff_armap_hash (h->root.string, &rehash, armap_count,
3759 file_offset = H_GET_32 (abfd, hashtable + (hash * 8) + 4);
3760 if (file_offset == 0)
3762 /* Nothing in this slot. */
3763 pundef = &(*pundef)->u.undef.next;
3767 name = stringbase + H_GET_32 (abfd, hashtable + (hash * 8));
3768 if (name[0] != h->root.string[0]
3769 || ! streq (name, h->root.string))
3774 /* That was the wrong symbol. Try rehashing. */
3776 for (srch = (hash + rehash) & (armap_count - 1);
3778 srch = (srch + rehash) & (armap_count - 1))
3780 file_offset = H_GET_32 (abfd, hashtable + (srch * 8) + 4);
3781 if (file_offset == 0)
3783 name = stringbase + H_GET_32 (abfd, hashtable + (srch * 8));
3784 if (name[0] == h->root.string[0]
3785 && streq (name, h->root.string))
3794 pundef = &(*pundef)->u.undef.next;
3801 element = (*backend->get_elt_at_filepos) (abfd, (file_ptr) file_offset);
3802 if (element == NULL)
3805 if (! bfd_check_format (element, bfd_object))
3808 /* Unlike the generic linker, we know that this element provides
3809 a definition for an undefined symbol and we know that we want
3810 to include it. We don't need to check anything. */
3811 if (!(*info->callbacks
3812 ->add_archive_element) (info, element, name, &element))
3814 if (! ecoff_link_add_object_symbols (element, info))
3817 pundef = &(*pundef)->u.undef.next;
3823 /* Given an ECOFF BFD, add symbols to the global hash table as
3827 _bfd_ecoff_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
3829 switch (bfd_get_format (abfd))
3832 return ecoff_link_add_object_symbols (abfd, info);
3834 return ecoff_link_add_archive_symbols (abfd, info);
3836 bfd_set_error (bfd_error_wrong_format);
3842 /* ECOFF final link routines. */
3844 /* Structure used to pass information to ecoff_link_write_external. */
3849 struct bfd_link_info *info;
3852 /* Accumulate the debugging information for an input BFD into the
3853 output BFD. This must read in the symbolic information of the
3857 ecoff_final_link_debug_accumulate (bfd *output_bfd,
3859 struct bfd_link_info *info,
3862 struct ecoff_debug_info * const debug = &ecoff_data (input_bfd)->debug_info;
3863 const struct ecoff_debug_swap * const swap =
3864 &ecoff_backend (input_bfd)->debug_swap;
3865 HDRR *symhdr = &debug->symbolic_header;
3868 #define READ(ptr, offset, count, size, type) \
3869 if (symhdr->count == 0) \
3870 debug->ptr = NULL; \
3873 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
3874 debug->ptr = (type) bfd_malloc (amt); \
3875 if (debug->ptr == NULL) \
3878 goto return_something; \
3880 if (bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
3881 || bfd_bread (debug->ptr, amt, input_bfd) != amt) \
3884 goto return_something; \
3888 /* If raw_syments is not NULL, then the data was already by read by
3889 _bfd_ecoff_slurp_symbolic_info. */
3890 if (ecoff_data (input_bfd)->raw_syments == NULL)
3892 READ (line, cbLineOffset, cbLine, sizeof (unsigned char),
3894 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
3895 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
3896 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
3897 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
3898 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
3900 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
3901 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
3902 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
3906 /* We do not read the external strings or the external symbols. */
3908 ret = (bfd_ecoff_debug_accumulate
3909 (handle, output_bfd, &ecoff_data (output_bfd)->debug_info,
3910 &ecoff_backend (output_bfd)->debug_swap,
3911 input_bfd, debug, swap, info));
3914 if (ecoff_data (input_bfd)->raw_syments == NULL)
3916 if (debug->line != NULL)
3918 if (debug->external_dnr != NULL)
3919 free (debug->external_dnr);
3920 if (debug->external_pdr != NULL)
3921 free (debug->external_pdr);
3922 if (debug->external_sym != NULL)
3923 free (debug->external_sym);
3924 if (debug->external_opt != NULL)
3925 free (debug->external_opt);
3926 if (debug->external_aux != NULL)
3927 free (debug->external_aux);
3928 if (debug->ss != NULL)
3930 if (debug->external_fdr != NULL)
3931 free (debug->external_fdr);
3932 if (debug->external_rfd != NULL)
3933 free (debug->external_rfd);
3935 /* Make sure we don't accidentally follow one of these pointers
3936 into freed memory. */
3938 debug->external_dnr = NULL;
3939 debug->external_pdr = NULL;
3940 debug->external_sym = NULL;
3941 debug->external_opt = NULL;
3942 debug->external_aux = NULL;
3944 debug->external_fdr = NULL;
3945 debug->external_rfd = NULL;
3951 /* Relocate and write an ECOFF section into an ECOFF output file. */
3954 ecoff_indirect_link_order (bfd *output_bfd,
3955 struct bfd_link_info *info,
3956 asection *output_section,
3957 struct bfd_link_order *link_order)
3959 asection *input_section;
3961 bfd_byte *contents = NULL;
3962 bfd_size_type external_reloc_size;
3963 bfd_size_type external_relocs_size;
3964 void * external_relocs = NULL;
3966 BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0);
3968 input_section = link_order->u.indirect.section;
3969 input_bfd = input_section->owner;
3970 if (input_section->size == 0)
3973 BFD_ASSERT (input_section->output_section == output_section);
3974 BFD_ASSERT (input_section->output_offset == link_order->offset);
3975 BFD_ASSERT (input_section->size == link_order->size);
3977 /* Get the section contents. */
3978 if (!bfd_malloc_and_get_section (input_bfd, input_section, &contents))
3981 /* Get the relocs. If we are relaxing MIPS code, they will already
3982 have been read in. Otherwise, we read them in now. */
3983 external_reloc_size = ecoff_backend (input_bfd)->external_reloc_size;
3984 external_relocs_size = external_reloc_size * input_section->reloc_count;
3986 external_relocs = bfd_malloc (external_relocs_size);
3987 if (external_relocs == NULL && external_relocs_size != 0)
3990 if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
3991 || (bfd_bread (external_relocs, external_relocs_size, input_bfd)
3992 != external_relocs_size))
3995 /* Relocate the section contents. */
3996 if (! ((*ecoff_backend (input_bfd)->relocate_section)
3997 (output_bfd, info, input_bfd, input_section, contents,
4001 /* Write out the relocated section. */
4002 if (! bfd_set_section_contents (output_bfd,
4005 input_section->output_offset,
4006 input_section->size))
4009 /* If we are producing relocatable output, the relocs were
4010 modified, and we write them out now. We use the reloc_count
4011 field of output_section to keep track of the number of relocs we
4012 have output so far. */
4013 if (info->relocatable)
4015 file_ptr pos = (output_section->rel_filepos
4016 + output_section->reloc_count * external_reloc_size);
4017 if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
4018 || (bfd_bwrite (external_relocs, external_relocs_size, output_bfd)
4019 != external_relocs_size))
4021 output_section->reloc_count += input_section->reloc_count;
4024 if (contents != NULL)
4026 if (external_relocs != NULL)
4027 free (external_relocs);
4031 if (contents != NULL)
4033 if (external_relocs != NULL)
4034 free (external_relocs);
4038 /* Generate a reloc when linking an ECOFF file. This is a reloc
4039 requested by the linker, and does come from any input file. This
4040 is used to build constructor and destructor tables when linking
4044 ecoff_reloc_link_order (bfd *output_bfd,
4045 struct bfd_link_info *info,
4046 asection *output_section,
4047 struct bfd_link_order *link_order)
4049 enum bfd_link_order_type type;
4053 struct internal_reloc in;
4054 bfd_size_type external_reloc_size;
4059 type = link_order->type;
4061 addend = link_order->u.reloc.p->addend;
4063 /* We set up an arelent to pass to the backend adjust_reloc_out
4065 rel.address = link_order->offset;
4067 rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
4070 bfd_set_error (bfd_error_bad_value);
4074 if (type == bfd_section_reloc_link_order)
4076 section = link_order->u.reloc.p->u.section;
4077 rel.sym_ptr_ptr = section->symbol_ptr_ptr;
4081 struct bfd_link_hash_entry *h;
4083 /* Treat a reloc against a defined symbol as though it were
4084 actually against the section. */
4085 h = bfd_wrapped_link_hash_lookup (output_bfd, info,
4086 link_order->u.reloc.p->u.name,
4087 FALSE, FALSE, FALSE);
4089 && (h->type == bfd_link_hash_defined
4090 || h->type == bfd_link_hash_defweak))
4092 type = bfd_section_reloc_link_order;
4093 section = h->u.def.section->output_section;
4094 /* It seems that we ought to add the symbol value to the
4095 addend here, but in practice it has already been added
4096 because it was passed to constructor_callback. */
4097 addend += section->vma + h->u.def.section->output_offset;
4101 /* We can't set up a reloc against a symbol correctly,
4102 because we have no asymbol structure. Currently no
4103 adjust_reloc_out routine cares. */
4104 rel.sym_ptr_ptr = NULL;
4108 /* All ECOFF relocs are in-place. Put the addend into the object
4111 BFD_ASSERT (rel.howto->partial_inplace);
4115 bfd_reloc_status_type rstat;
4118 size = bfd_get_reloc_size (rel.howto);
4119 buf = (bfd_byte *) bfd_zmalloc (size);
4122 rstat = _bfd_relocate_contents (rel.howto, output_bfd,
4123 (bfd_vma) addend, buf);
4129 case bfd_reloc_outofrange:
4131 case bfd_reloc_overflow:
4132 if (! ((*info->callbacks->reloc_overflow)
4134 (link_order->type == bfd_section_reloc_link_order
4135 ? bfd_section_name (output_bfd, section)
4136 : link_order->u.reloc.p->u.name),
4137 rel.howto->name, addend, NULL,
4138 NULL, (bfd_vma) 0)))
4145 ok = bfd_set_section_contents (output_bfd, output_section, (void *) buf,
4146 (file_ptr) link_order->offset, size);
4154 /* Move the information into an internal_reloc structure. */
4155 in.r_vaddr = (rel.address
4156 + bfd_get_section_vma (output_bfd, output_section));
4157 in.r_type = rel.howto->type;
4159 if (type == bfd_symbol_reloc_link_order)
4161 struct ecoff_link_hash_entry *h;
4163 h = ((struct ecoff_link_hash_entry *)
4164 bfd_wrapped_link_hash_lookup (output_bfd, info,
4165 link_order->u.reloc.p->u.name,
4166 FALSE, FALSE, TRUE));
4169 in.r_symndx = h->indx;
4172 if (! ((*info->callbacks->unattached_reloc)
4173 (info, link_order->u.reloc.p->u.name, NULL,
4174 NULL, (bfd_vma) 0)))
4191 { _TEXT, RELOC_SECTION_TEXT },
4192 { _RDATA, RELOC_SECTION_RDATA },
4193 { _DATA, RELOC_SECTION_DATA },
4194 { _SDATA, RELOC_SECTION_SDATA },
4195 { _SBSS, RELOC_SECTION_SBSS },
4196 { _BSS, RELOC_SECTION_BSS },
4197 { _INIT, RELOC_SECTION_INIT },
4198 { _LIT8, RELOC_SECTION_LIT8 },
4199 { _LIT4, RELOC_SECTION_LIT4 },
4200 { _XDATA, RELOC_SECTION_XDATA },
4201 { _PDATA, RELOC_SECTION_PDATA },
4202 { _FINI, RELOC_SECTION_FINI },
4203 { _LITA, RELOC_SECTION_LITA },
4204 { "*ABS*", RELOC_SECTION_ABS },
4205 { _RCONST, RELOC_SECTION_RCONST }
4208 name = bfd_get_section_name (output_bfd, section);
4210 for (i = 0; i < ARRAY_SIZE (section_symndx); i++)
4211 if (streq (name, section_symndx[i].name))
4213 in.r_symndx = section_symndx[i].r_symndx;
4217 if (i == ARRAY_SIZE (section_symndx))
4223 /* Let the BFD backend adjust the reloc. */
4224 (*ecoff_backend (output_bfd)->adjust_reloc_out) (output_bfd, &rel, &in);
4226 /* Get some memory and swap out the reloc. */
4227 external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size;
4228 rbuf = (bfd_byte *) bfd_malloc (external_reloc_size);
4232 (*ecoff_backend (output_bfd)->swap_reloc_out) (output_bfd, &in, (void *) rbuf);
4234 pos = (output_section->rel_filepos
4235 + output_section->reloc_count * external_reloc_size);
4236 ok = (bfd_seek (output_bfd, pos, SEEK_SET) == 0
4237 && (bfd_bwrite ((void *) rbuf, external_reloc_size, output_bfd)
4238 == external_reloc_size));
4241 ++output_section->reloc_count;
4248 /* Put out information for an external symbol. These come only from
4252 ecoff_link_write_external (struct bfd_hash_entry *bh, void * data)
4254 struct ecoff_link_hash_entry *h = (struct ecoff_link_hash_entry *) bh;
4255 struct extsym_info *einfo = (struct extsym_info *) data;
4256 bfd *output_bfd = einfo->abfd;
4259 if (h->root.type == bfd_link_hash_warning)
4261 h = (struct ecoff_link_hash_entry *) h->root.u.i.link;
4262 if (h->root.type == bfd_link_hash_new)
4266 /* We need to check if this symbol is being stripped. */
4267 if (h->root.type == bfd_link_hash_undefined
4268 || h->root.type == bfd_link_hash_undefweak)
4270 else if (einfo->info->strip == strip_all
4271 || (einfo->info->strip == strip_some
4272 && bfd_hash_lookup (einfo->info->keep_hash,
4273 h->root.root.string,
4274 FALSE, FALSE) == NULL))
4279 if (strip || h->written)
4282 if (h->abfd == NULL)
4285 h->esym.cobol_main = 0;
4286 h->esym.weakext = 0;
4287 h->esym.reserved = 0;
4288 h->esym.ifd = ifdNil;
4289 h->esym.asym.value = 0;
4290 h->esym.asym.st = stGlobal;
4292 if (h->root.type != bfd_link_hash_defined
4293 && h->root.type != bfd_link_hash_defweak)
4294 h->esym.asym.sc = scAbs;
4297 asection *output_section;
4305 section_storage_classes [] =
4309 { _SDATA, scSData },
4310 { _RDATA, scRData },
4315 { _PDATA, scPData },
4316 { _XDATA, scXData },
4317 { _RCONST, scRConst }
4320 output_section = h->root.u.def.section->output_section;
4321 name = bfd_section_name (output_section->owner, output_section);
4323 for (i = 0; i < ARRAY_SIZE (section_storage_classes); i++)
4324 if (streq (name, section_storage_classes[i].name))
4326 h->esym.asym.sc = section_storage_classes[i].sc;
4330 if (i == ARRAY_SIZE (section_storage_classes))
4331 h->esym.asym.sc = scAbs;
4334 h->esym.asym.reserved = 0;
4335 h->esym.asym.index = indexNil;
4337 else if (h->esym.ifd != -1)
4339 struct ecoff_debug_info *debug;
4341 /* Adjust the FDR index for the symbol by that used for the
4343 debug = &ecoff_data (h->abfd)->debug_info;
4344 BFD_ASSERT (h->esym.ifd >= 0
4345 && h->esym.ifd < debug->symbolic_header.ifdMax);
4346 h->esym.ifd = debug->ifdmap[h->esym.ifd];
4349 switch (h->root.type)
4352 case bfd_link_hash_warning:
4353 case bfd_link_hash_new:
4355 case bfd_link_hash_undefined:
4356 case bfd_link_hash_undefweak:
4357 if (h->esym.asym.sc != scUndefined
4358 && h->esym.asym.sc != scSUndefined)
4359 h->esym.asym.sc = scUndefined;
4361 case bfd_link_hash_defined:
4362 case bfd_link_hash_defweak:
4363 if (h->esym.asym.sc == scUndefined
4364 || h->esym.asym.sc == scSUndefined)
4365 h->esym.asym.sc = scAbs;
4366 else if (h->esym.asym.sc == scCommon)
4367 h->esym.asym.sc = scBss;
4368 else if (h->esym.asym.sc == scSCommon)
4369 h->esym.asym.sc = scSBss;
4370 h->esym.asym.value = (h->root.u.def.value
4371 + h->root.u.def.section->output_section->vma
4372 + h->root.u.def.section->output_offset);
4374 case bfd_link_hash_common:
4375 if (h->esym.asym.sc != scCommon
4376 && h->esym.asym.sc != scSCommon)
4377 h->esym.asym.sc = scCommon;
4378 h->esym.asym.value = h->root.u.c.size;
4380 case bfd_link_hash_indirect:
4381 /* We ignore these symbols, since the indirected symbol is
4382 already in the hash table. */
4386 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4388 h->indx = ecoff_data (output_bfd)->debug_info.symbolic_header.iextMax;
4391 return (bfd_ecoff_debug_one_external
4392 (output_bfd, &ecoff_data (output_bfd)->debug_info,
4393 &ecoff_backend (output_bfd)->debug_swap, h->root.root.string,
4397 /* ECOFF final link routine. This looks through all the input BFDs
4398 and gathers together all the debugging information, and then
4399 processes all the link order information. This may cause it to
4400 close and reopen some input BFDs; I'll see how bad this is. */
4403 _bfd_ecoff_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
4405 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4406 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
4411 struct bfd_link_order *p;
4412 struct extsym_info einfo;
4414 /* We accumulate the debugging information counts in the symbolic
4416 symhdr = &debug->symbolic_header;
4418 symhdr->ilineMax = 0;
4422 symhdr->isymMax = 0;
4423 symhdr->ioptMax = 0;
4424 symhdr->iauxMax = 0;
4426 symhdr->issExtMax = 0;
4429 symhdr->iextMax = 0;
4431 /* We accumulate the debugging information itself in the debug_info
4434 debug->external_dnr = NULL;
4435 debug->external_pdr = NULL;
4436 debug->external_sym = NULL;
4437 debug->external_opt = NULL;
4438 debug->external_aux = NULL;
4440 debug->ssext = debug->ssext_end = NULL;
4441 debug->external_fdr = NULL;
4442 debug->external_rfd = NULL;
4443 debug->external_ext = debug->external_ext_end = NULL;
4445 handle = bfd_ecoff_debug_init (abfd, debug, &backend->debug_swap, info);
4449 /* Accumulate the debugging symbols from each input BFD. */
4450 for (input_bfd = info->input_bfds;
4452 input_bfd = input_bfd->link_next)
4456 if (bfd_get_flavour (input_bfd) == bfd_target_ecoff_flavour)
4458 /* Arbitrarily set the symbolic header vstamp to the vstamp
4459 of the first object file in the link. */
4460 if (symhdr->vstamp == 0)
4462 = ecoff_data (input_bfd)->debug_info.symbolic_header.vstamp;
4463 ret = ecoff_final_link_debug_accumulate (abfd, input_bfd, info,
4467 ret = bfd_ecoff_debug_accumulate_other (handle, abfd,
4468 debug, &backend->debug_swap,
4473 /* Combine the register masks. */
4474 ecoff_data (abfd)->gprmask |= ecoff_data (input_bfd)->gprmask;
4475 ecoff_data (abfd)->fprmask |= ecoff_data (input_bfd)->fprmask;
4476 ecoff_data (abfd)->cprmask[0] |= ecoff_data (input_bfd)->cprmask[0];
4477 ecoff_data (abfd)->cprmask[1] |= ecoff_data (input_bfd)->cprmask[1];
4478 ecoff_data (abfd)->cprmask[2] |= ecoff_data (input_bfd)->cprmask[2];
4479 ecoff_data (abfd)->cprmask[3] |= ecoff_data (input_bfd)->cprmask[3];
4482 /* Write out the external symbols. */
4485 bfd_hash_traverse (&info->hash->table, ecoff_link_write_external, &einfo);
4487 if (info->relocatable)
4489 /* We need to make a pass over the link_orders to count up the
4490 number of relocations we will need to output, so that we know
4491 how much space they will take up. */
4492 for (o = abfd->sections; o != NULL; o = o->next)
4495 for (p = o->map_head.link_order;
4498 if (p->type == bfd_indirect_link_order)
4499 o->reloc_count += p->u.indirect.section->reloc_count;
4500 else if (p->type == bfd_section_reloc_link_order
4501 || p->type == bfd_symbol_reloc_link_order)
4506 /* Compute the reloc and symbol file positions. */
4507 ecoff_compute_reloc_file_positions (abfd);
4509 /* Write out the debugging information. */
4510 if (! bfd_ecoff_write_accumulated_debug (handle, abfd, debug,
4511 &backend->debug_swap, info,
4512 ecoff_data (abfd)->sym_filepos))
4515 bfd_ecoff_debug_free (handle, abfd, debug, &backend->debug_swap, info);
4517 if (info->relocatable)
4519 /* Now reset the reloc_count field of the sections in the output
4520 BFD to 0, so that we can use them to keep track of how many
4521 relocs we have output thus far. */
4522 for (o = abfd->sections; o != NULL; o = o->next)
4526 /* Get a value for the GP register. */
4527 if (ecoff_data (abfd)->gp == 0)
4529 struct bfd_link_hash_entry *h;
4531 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
4533 && h->type == bfd_link_hash_defined)
4534 ecoff_data (abfd)->gp = (h->u.def.value
4535 + h->u.def.section->output_section->vma
4536 + h->u.def.section->output_offset);
4537 else if (info->relocatable)
4541 /* Make up a value. */
4543 for (o = abfd->sections; o != NULL; o = o->next)
4546 && (streq (o->name, _SBSS)
4547 || streq (o->name, _SDATA)
4548 || streq (o->name, _LIT4)
4549 || streq (o->name, _LIT8)
4550 || streq (o->name, _LITA)))
4553 ecoff_data (abfd)->gp = lo + 0x8000;
4557 /* If the relocate_section function needs to do a reloc
4558 involving the GP value, it should make a reloc_dangerous
4559 callback to warn that GP is not defined. */
4563 for (o = abfd->sections; o != NULL; o = o->next)
4565 for (p = o->map_head.link_order;
4569 if (p->type == bfd_indirect_link_order
4570 && (bfd_get_flavour (p->u.indirect.section->owner)
4571 == bfd_target_ecoff_flavour))
4573 if (! ecoff_indirect_link_order (abfd, info, o, p))
4576 else if (p->type == bfd_section_reloc_link_order
4577 || p->type == bfd_symbol_reloc_link_order)
4579 if (! ecoff_reloc_link_order (abfd, info, o, p))
4584 if (! _bfd_default_link_order (abfd, info, o, p))
4590 bfd_get_symcount (abfd) = symhdr->iextMax + symhdr->isymMax;
4592 ecoff_data (abfd)->linker = TRUE;