1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright (C) 1990-2014 Free Software Foundation, Inc.
3 Original version by Per Bothner.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21 MA 02110-1301, USA. */
28 #include "aout/stab_gnu.h"
30 /* FIXME: We need the definitions of N_SET[ADTB], but aout64.h defines
31 some other stuff which we don't want and which conflicts with stuff
34 #include "aout/aout64.h"
37 #undef obj_sym_filepos
39 #include "coff/internal.h"
41 #include "coff/symconst.h"
42 #include "coff/ecoff.h"
45 #include "libiberty.h"
47 #define streq(a, b) (strcmp ((a), (b)) == 0)
48 #define strneq(a, b, n) (strncmp ((a), (b), (n)) == 0)
51 /* This stuff is somewhat copied from coffcode.h. */
52 static asection bfd_debug_section =
54 /* name, id, index, next, prev, flags, user_set_vma, */
55 "*DEBUG*", 0, 0, NULL, NULL, 0, 0,
56 /* linker_mark, linker_has_input, gc_mark, compress_status, */
58 /* segment_mark, sec_info_type, use_rela_p, */
60 /* sec_flg0, sec_flg1, sec_flg2, sec_flg3, sec_flg4, sec_flg5, */
62 /* vma, lma, size, rawsize, compressed_size, relax, relax_count, */
64 /* output_offset, output_section, alignment_power, */
66 /* relocation, orelocation, reloc_count, filepos, rel_filepos, */
68 /* line_filepos, userdata, contents, lineno, lineno_count, */
69 0, NULL, NULL, NULL, 0,
70 /* entsize, kept_section, moving_line_filepos, */
72 /* target_index, used_by_bfd, constructor_chain, owner, */
78 /* map_head, map_tail */
82 /* Create an ECOFF object. */
85 _bfd_ecoff_mkobject (bfd *abfd)
87 bfd_size_type amt = sizeof (ecoff_data_type);
89 abfd->tdata.ecoff_obj_data = (struct ecoff_tdata *) bfd_zalloc (abfd, amt);
90 if (abfd->tdata.ecoff_obj_data == NULL)
96 /* This is a hook called by coff_real_object_p to create any backend
97 specific information. */
100 _bfd_ecoff_mkobject_hook (bfd *abfd, void * filehdr, void * aouthdr)
102 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
103 struct internal_aouthdr *internal_a = (struct internal_aouthdr *) aouthdr;
104 ecoff_data_type *ecoff;
106 if (! _bfd_ecoff_mkobject (abfd))
109 ecoff = ecoff_data (abfd);
111 ecoff->sym_filepos = internal_f->f_symptr;
113 if (internal_a != NULL)
117 ecoff->text_start = internal_a->text_start;
118 ecoff->text_end = internal_a->text_start + internal_a->tsize;
119 ecoff->gp = internal_a->gp_value;
120 ecoff->gprmask = internal_a->gprmask;
121 for (i = 0; i < 4; i++)
122 ecoff->cprmask[i] = internal_a->cprmask[i];
123 ecoff->fprmask = internal_a->fprmask;
124 if (internal_a->magic == ECOFF_AOUT_ZMAGIC)
125 abfd->flags |= D_PAGED;
127 abfd->flags &=~ D_PAGED;
130 /* It turns out that no special action is required by the MIPS or
131 Alpha ECOFF backends. They have different information in the
132 a.out header, but we just copy it all (e.g., gprmask, cprmask and
133 fprmask) and let the swapping routines ensure that only relevant
134 information is written out. */
136 return (void *) ecoff;
139 /* Initialize a new section. */
142 _bfd_ecoff_new_section_hook (bfd *abfd, asection *section)
152 { _TEXT, SEC_ALLOC | SEC_CODE | SEC_LOAD },
153 { _INIT, SEC_ALLOC | SEC_CODE | SEC_LOAD },
154 { _FINI, SEC_ALLOC | SEC_CODE | SEC_LOAD },
155 { _DATA, SEC_ALLOC | SEC_DATA | SEC_LOAD },
156 { _SDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD },
157 { _RDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY},
158 { _LIT8, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY},
159 { _LIT4, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY},
160 { _RCONST, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY},
161 { _PDATA, SEC_ALLOC | SEC_DATA | SEC_LOAD | SEC_READONLY},
164 /* An Irix 4 shared libary. */
165 { _LIB, SEC_COFF_SHARED_LIBRARY}
168 section->alignment_power = 4;
170 for (i = 0; i < ARRAY_SIZE (section_flags); i++)
171 if (streq (section->name, section_flags[i].name))
173 section->flags |= section_flags[i].flags;
178 /* Probably any other section name is SEC_NEVER_LOAD, but I'm
179 uncertain about .init on some systems and I don't know how shared
182 return _bfd_generic_new_section_hook (abfd, section);
185 /* Determine the machine architecture and type. This is called from
186 the generic COFF routines. It is the inverse of ecoff_get_magic,
187 below. This could be an ECOFF backend routine, with one version
188 for each target, but there aren't all that many ECOFF targets. */
191 _bfd_ecoff_set_arch_mach_hook (bfd *abfd, void * filehdr)
193 struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
194 enum bfd_architecture arch;
197 switch (internal_f->f_magic)
200 case MIPS_MAGIC_LITTLE:
202 arch = bfd_arch_mips;
203 mach = bfd_mach_mips3000;
206 case MIPS_MAGIC_LITTLE2:
207 case MIPS_MAGIC_BIG2:
208 /* MIPS ISA level 2: the r6000. */
209 arch = bfd_arch_mips;
210 mach = bfd_mach_mips6000;
213 case MIPS_MAGIC_LITTLE3:
214 case MIPS_MAGIC_BIG3:
215 /* MIPS ISA level 3: the r4000. */
216 arch = bfd_arch_mips;
217 mach = bfd_mach_mips4000;
221 arch = bfd_arch_alpha;
226 arch = bfd_arch_obscure;
231 return bfd_default_set_arch_mach (abfd, arch, mach);
235 _bfd_ecoff_no_long_sections (bfd *abfd, int enable)
242 /* Get the magic number to use based on the architecture and machine.
243 This is the inverse of _bfd_ecoff_set_arch_mach_hook, above. */
246 ecoff_get_magic (bfd *abfd)
250 switch (bfd_get_arch (abfd))
253 switch (bfd_get_mach (abfd))
257 case bfd_mach_mips3000:
258 big = MIPS_MAGIC_BIG;
259 little = MIPS_MAGIC_LITTLE;
262 case bfd_mach_mips6000:
263 big = MIPS_MAGIC_BIG2;
264 little = MIPS_MAGIC_LITTLE2;
267 case bfd_mach_mips4000:
268 big = MIPS_MAGIC_BIG3;
269 little = MIPS_MAGIC_LITTLE3;
273 return bfd_big_endian (abfd) ? big : little;
284 /* Get the section s_flags to use for a section. */
287 ecoff_sec_to_styp_flags (const char *name, flagword flags)
297 { _TEXT, STYP_TEXT },
298 { _DATA, STYP_DATA },
299 { _SDATA, STYP_SDATA },
300 { _RDATA, STYP_RDATA },
301 { _LITA, STYP_LITA },
302 { _LIT8, STYP_LIT8 },
303 { _LIT4, STYP_LIT4 },
305 { _SBSS, STYP_SBSS },
306 { _INIT, STYP_ECOFF_INIT },
307 { _FINI, STYP_ECOFF_FINI },
308 { _PDATA, STYP_PDATA },
309 { _XDATA, STYP_XDATA },
310 { _LIB, STYP_ECOFF_LIB },
312 { _HASH, STYP_HASH },
313 { _DYNAMIC, STYP_DYNAMIC },
314 { _LIBLIST, STYP_LIBLIST },
315 { _RELDYN, STYP_RELDYN },
316 { _CONFLIC, STYP_CONFLIC },
317 { _DYNSTR, STYP_DYNSTR },
318 { _DYNSYM, STYP_DYNSYM },
319 { _RCONST, STYP_RCONST }
323 for (i = 0; i < ARRAY_SIZE (styp_flags); i++)
324 if (streq (name, styp_flags[i].name))
326 styp = styp_flags[i].flags;
332 if (streq (name, _COMMENT))
335 flags &=~ SEC_NEVER_LOAD;
337 else if (flags & SEC_CODE)
339 else if (flags & SEC_DATA)
341 else if (flags & SEC_READONLY)
343 else if (flags & SEC_LOAD)
349 if (flags & SEC_NEVER_LOAD)
355 /* Get the BFD flags to use for a section. */
358 _bfd_ecoff_styp_to_sec_flags (bfd *abfd ATTRIBUTE_UNUSED,
360 const char *name ATTRIBUTE_UNUSED,
361 asection *section ATTRIBUTE_UNUSED,
362 flagword * flags_ptr)
364 struct internal_scnhdr *internal_s = (struct internal_scnhdr *) hdr;
365 long styp_flags = internal_s->s_flags;
366 flagword sec_flags = 0;
368 if (styp_flags & STYP_NOLOAD)
369 sec_flags |= SEC_NEVER_LOAD;
371 /* For 386 COFF, at least, an unloadable text or data section is
372 actually a shared library section. */
373 if ((styp_flags & STYP_TEXT)
374 || (styp_flags & STYP_ECOFF_INIT)
375 || (styp_flags & STYP_ECOFF_FINI)
376 || (styp_flags & STYP_DYNAMIC)
377 || (styp_flags & STYP_LIBLIST)
378 || (styp_flags & STYP_RELDYN)
379 || styp_flags == STYP_CONFLIC
380 || (styp_flags & STYP_DYNSTR)
381 || (styp_flags & STYP_DYNSYM)
382 || (styp_flags & STYP_HASH))
384 if (sec_flags & SEC_NEVER_LOAD)
385 sec_flags |= SEC_CODE | SEC_COFF_SHARED_LIBRARY;
387 sec_flags |= SEC_CODE | SEC_LOAD | SEC_ALLOC;
389 else if ((styp_flags & STYP_DATA)
390 || (styp_flags & STYP_RDATA)
391 || (styp_flags & STYP_SDATA)
392 || styp_flags == STYP_PDATA
393 || styp_flags == STYP_XDATA
394 || (styp_flags & STYP_GOT)
395 || styp_flags == STYP_RCONST)
397 if (sec_flags & SEC_NEVER_LOAD)
398 sec_flags |= SEC_DATA | SEC_COFF_SHARED_LIBRARY;
400 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC;
401 if ((styp_flags & STYP_RDATA)
402 || styp_flags == STYP_PDATA
403 || styp_flags == STYP_RCONST)
404 sec_flags |= SEC_READONLY;
406 else if ((styp_flags & STYP_BSS)
407 || (styp_flags & STYP_SBSS))
408 sec_flags |= SEC_ALLOC;
409 else if ((styp_flags & STYP_INFO) || styp_flags == STYP_COMMENT)
410 sec_flags |= SEC_NEVER_LOAD;
411 else if ((styp_flags & STYP_LITA)
412 || (styp_flags & STYP_LIT8)
413 || (styp_flags & STYP_LIT4))
414 sec_flags |= SEC_DATA | SEC_LOAD | SEC_ALLOC | SEC_READONLY;
415 else if (styp_flags & STYP_ECOFF_LIB)
416 sec_flags |= SEC_COFF_SHARED_LIBRARY;
418 sec_flags |= SEC_ALLOC | SEC_LOAD;
420 * flags_ptr = sec_flags;
424 /* Read in the symbolic header for an ECOFF object file. */
427 ecoff_slurp_symbolic_header (bfd *abfd)
429 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
430 bfd_size_type external_hdr_size;
432 HDRR *internal_symhdr;
434 /* See if we've already read it in. */
435 if (ecoff_data (abfd)->debug_info.symbolic_header.magic ==
436 backend->debug_swap.sym_magic)
439 /* See whether there is a symbolic header. */
440 if (ecoff_data (abfd)->sym_filepos == 0)
442 bfd_get_symcount (abfd) = 0;
446 /* At this point bfd_get_symcount (abfd) holds the number of symbols
447 as read from the file header, but on ECOFF this is always the
448 size of the symbolic information header. It would be cleaner to
449 handle this when we first read the file in coffgen.c. */
450 external_hdr_size = backend->debug_swap.external_hdr_size;
451 if (bfd_get_symcount (abfd) != external_hdr_size)
453 bfd_set_error (bfd_error_bad_value);
457 /* Read the symbolic information header. */
458 raw = bfd_malloc (external_hdr_size);
462 if (bfd_seek (abfd, ecoff_data (abfd)->sym_filepos, SEEK_SET) != 0
463 || bfd_bread (raw, external_hdr_size, abfd) != external_hdr_size)
465 internal_symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
466 (*backend->debug_swap.swap_hdr_in) (abfd, raw, internal_symhdr);
468 if (internal_symhdr->magic != backend->debug_swap.sym_magic)
470 bfd_set_error (bfd_error_bad_value);
474 /* Now we can get the correct number of symbols. */
475 bfd_get_symcount (abfd) = (internal_symhdr->isymMax
476 + internal_symhdr->iextMax);
487 /* Read in and swap the important symbolic information for an ECOFF
488 object file. This is called by gdb via the read_debug_info entry
489 point in the backend structure. */
492 _bfd_ecoff_slurp_symbolic_info (bfd *abfd,
493 asection *ignore ATTRIBUTE_UNUSED,
494 struct ecoff_debug_info *debug)
496 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
497 HDRR *internal_symhdr;
498 bfd_size_type raw_base;
499 bfd_size_type raw_size;
501 bfd_size_type external_fdr_size;
505 bfd_size_type raw_end;
506 bfd_size_type cb_end;
510 BFD_ASSERT (debug == &ecoff_data (abfd)->debug_info);
512 /* Check whether we've already gotten it, and whether there's any to
514 if (ecoff_data (abfd)->raw_syments != NULL)
516 if (ecoff_data (abfd)->sym_filepos == 0)
518 bfd_get_symcount (abfd) = 0;
522 if (! ecoff_slurp_symbolic_header (abfd))
525 internal_symhdr = &debug->symbolic_header;
527 /* Read all the symbolic information at once. */
528 raw_base = (ecoff_data (abfd)->sym_filepos
529 + backend->debug_swap.external_hdr_size);
531 /* Alpha ecoff makes the determination of raw_size difficult. It has
532 an undocumented debug data section between the symhdr and the first
533 documented section. And the ordering of the sections varies between
534 statically and dynamically linked executables.
535 If bfd supports SEEK_END someday, this code could be simplified. */
538 #define UPDATE_RAW_END(start, count, size) \
539 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
540 if (cb_end > raw_end) \
543 UPDATE_RAW_END (cbLineOffset, cbLine, sizeof (unsigned char));
544 UPDATE_RAW_END (cbDnOffset, idnMax, backend->debug_swap.external_dnr_size);
545 UPDATE_RAW_END (cbPdOffset, ipdMax, backend->debug_swap.external_pdr_size);
546 UPDATE_RAW_END (cbSymOffset, isymMax, backend->debug_swap.external_sym_size);
548 optimization symtab, not the number of entries. */
549 UPDATE_RAW_END (cbOptOffset, ioptMax, sizeof (char));
550 UPDATE_RAW_END (cbAuxOffset, iauxMax, sizeof (union aux_ext));
551 UPDATE_RAW_END (cbSsOffset, issMax, sizeof (char));
552 UPDATE_RAW_END (cbSsExtOffset, issExtMax, sizeof (char));
553 UPDATE_RAW_END (cbFdOffset, ifdMax, backend->debug_swap.external_fdr_size);
554 UPDATE_RAW_END (cbRfdOffset, crfd, backend->debug_swap.external_rfd_size);
555 UPDATE_RAW_END (cbExtOffset, iextMax, backend->debug_swap.external_ext_size);
557 #undef UPDATE_RAW_END
559 raw_size = raw_end - raw_base;
562 ecoff_data (abfd)->sym_filepos = 0;
565 raw = bfd_alloc (abfd, raw_size);
569 pos = ecoff_data (abfd)->sym_filepos;
570 pos += backend->debug_swap.external_hdr_size;
571 if (bfd_seek (abfd, pos, SEEK_SET) != 0
572 || bfd_bread (raw, raw_size, abfd) != raw_size)
574 bfd_release (abfd, raw);
578 ecoff_data (abfd)->raw_syments = raw;
580 /* Get pointers for the numeric offsets in the HDRR structure. */
581 #define FIX(off1, off2, type) \
582 if (internal_symhdr->off1 == 0) \
583 debug->off2 = NULL; \
585 debug->off2 = (type) ((char *) raw \
586 + (internal_symhdr->off1 \
589 FIX (cbLineOffset, line, unsigned char *);
590 FIX (cbDnOffset, external_dnr, void *);
591 FIX (cbPdOffset, external_pdr, void *);
592 FIX (cbSymOffset, external_sym, void *);
593 FIX (cbOptOffset, external_opt, void *);
594 FIX (cbAuxOffset, external_aux, union aux_ext *);
595 FIX (cbSsOffset, ss, char *);
596 FIX (cbSsExtOffset, ssext, char *);
597 FIX (cbFdOffset, external_fdr, void *);
598 FIX (cbRfdOffset, external_rfd, void *);
599 FIX (cbExtOffset, external_ext, void *);
602 /* I don't want to always swap all the data, because it will just
603 waste time and most programs will never look at it. The only
604 time the linker needs most of the debugging information swapped
605 is when linking big-endian and little-endian MIPS object files
606 together, which is not a common occurrence.
608 We need to look at the fdr to deal with a lot of information in
609 the symbols, so we swap them here. */
610 amt = internal_symhdr->ifdMax;
611 amt *= sizeof (struct fdr);
612 debug->fdr = (FDR *) bfd_alloc (abfd, amt);
613 if (debug->fdr == NULL)
615 external_fdr_size = backend->debug_swap.external_fdr_size;
616 fdr_ptr = debug->fdr;
617 fraw_src = (char *) debug->external_fdr;
618 /* PR 17512: file: 3372-1243-0.004. */
619 if (fraw_src == NULL && internal_symhdr->ifdMax > 0)
621 fraw_end = fraw_src + internal_symhdr->ifdMax * external_fdr_size;
622 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
623 (*backend->debug_swap.swap_fdr_in) (abfd, (void *) fraw_src, fdr_ptr);
628 /* ECOFF symbol table routines. The ECOFF symbol table is described
629 in gcc/mips-tfile.c. */
631 /* ECOFF uses two common sections. One is the usual one, and the
632 other is for small objects. All the small objects are kept
633 together, and then referenced via the gp pointer, which yields
634 faster assembler code. This is what we use for the small common
636 static asection ecoff_scom_section;
637 static asymbol ecoff_scom_symbol;
638 static asymbol *ecoff_scom_symbol_ptr;
640 /* Create an empty symbol. */
643 _bfd_ecoff_make_empty_symbol (bfd *abfd)
645 ecoff_symbol_type *new_symbol;
646 bfd_size_type amt = sizeof (ecoff_symbol_type);
648 new_symbol = (ecoff_symbol_type *) bfd_zalloc (abfd, amt);
649 if (new_symbol == NULL)
651 new_symbol->symbol.section = NULL;
652 new_symbol->fdr = NULL;
653 new_symbol->local = FALSE;
654 new_symbol->native = NULL;
655 new_symbol->symbol.the_bfd = abfd;
656 return &new_symbol->symbol;
659 /* Set the BFD flags and section for an ECOFF symbol. */
662 ecoff_set_symbol_info (bfd *abfd,
668 asym->the_bfd = abfd;
669 asym->value = ecoff_sym->value;
670 asym->section = &bfd_debug_section;
673 /* Most symbol types are just for debugging. */
674 switch (ecoff_sym->st)
683 if (ECOFF_IS_STAB (ecoff_sym))
685 asym->flags = BSF_DEBUGGING;
690 asym->flags = BSF_DEBUGGING;
695 asym->flags = BSF_EXPORT | BSF_WEAK;
697 asym->flags = BSF_EXPORT | BSF_GLOBAL;
700 asym->flags = BSF_LOCAL;
701 /* Normally, a local stProc symbol will have a corresponding
702 external symbol. We mark the local symbol as a debugging
703 symbol, in order to prevent nm from printing both out.
704 Similarly, we mark stLabel and stabs symbols as debugging
705 symbols. In both cases, we do want to set the value
706 correctly based on the symbol class. */
707 if (ecoff_sym->st == stProc
708 || ecoff_sym->st == stLabel
709 || ECOFF_IS_STAB (ecoff_sym))
710 asym->flags |= BSF_DEBUGGING;
713 if (ecoff_sym->st == stProc || ecoff_sym->st == stStaticProc)
714 asym->flags |= BSF_FUNCTION;
716 switch (ecoff_sym->sc)
719 /* Used for compiler generated labels. Leave them in the
720 debugging section, and mark them as local. If BSF_DEBUGGING
721 is set, then nm does not display them for some reason. If no
722 flags are set then the linker whines about them. */
723 asym->flags = BSF_LOCAL;
726 asym->section = bfd_make_section_old_way (abfd, _TEXT);
727 asym->value -= asym->section->vma;
730 asym->section = bfd_make_section_old_way (abfd, _DATA);
731 asym->value -= asym->section->vma;
734 asym->section = bfd_make_section_old_way (abfd, _BSS);
735 asym->value -= asym->section->vma;
738 asym->flags = BSF_DEBUGGING;
741 asym->section = bfd_abs_section_ptr;
744 asym->section = bfd_und_section_ptr;
754 asym->flags = BSF_DEBUGGING;
757 asym->section = bfd_make_section_old_way (abfd, ".sdata");
758 asym->value -= asym->section->vma;
761 asym->section = bfd_make_section_old_way (abfd, ".sbss");
762 asym->value -= asym->section->vma;
765 asym->section = bfd_make_section_old_way (abfd, ".rdata");
766 asym->value -= asym->section->vma;
769 asym->flags = BSF_DEBUGGING;
772 if (asym->value > ecoff_data (abfd)->gp_size)
774 asym->section = bfd_com_section_ptr;
780 if (ecoff_scom_section.name == NULL)
782 /* Initialize the small common section. */
783 ecoff_scom_section.name = SCOMMON;
784 ecoff_scom_section.flags = SEC_IS_COMMON;
785 ecoff_scom_section.output_section = &ecoff_scom_section;
786 ecoff_scom_section.symbol = &ecoff_scom_symbol;
787 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
788 ecoff_scom_symbol.name = SCOMMON;
789 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
790 ecoff_scom_symbol.section = &ecoff_scom_section;
791 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
793 asym->section = &ecoff_scom_section;
798 asym->flags = BSF_DEBUGGING;
801 asym->section = bfd_und_section_ptr;
806 asym->section = bfd_make_section_old_way (abfd, ".init");
807 asym->value -= asym->section->vma;
812 asym->flags = BSF_DEBUGGING;
815 asym->section = bfd_make_section_old_way (abfd, ".fini");
816 asym->value -= asym->section->vma;
819 asym->section = bfd_make_section_old_way (abfd, ".rconst");
820 asym->value -= asym->section->vma;
826 /* Look for special constructors symbols and make relocation entries
827 in a special construction section. These are produced by the
828 -fgnu-linker argument to g++. */
829 if (ECOFF_IS_STAB (ecoff_sym))
831 switch (ECOFF_UNMARK_STAB (ecoff_sym->index))
840 /* Mark the symbol as a constructor. */
841 asym->flags |= BSF_CONSTRUCTOR;
848 /* Read an ECOFF symbol table. */
851 _bfd_ecoff_slurp_symbol_table (bfd *abfd)
853 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
854 const bfd_size_type external_ext_size
855 = backend->debug_swap.external_ext_size;
856 const bfd_size_type external_sym_size
857 = backend->debug_swap.external_sym_size;
858 void (* const swap_ext_in) (bfd *, void *, EXTR *)
859 = backend->debug_swap.swap_ext_in;
860 void (* const swap_sym_in) (bfd *, void *, SYMR *)
861 = backend->debug_swap.swap_sym_in;
862 bfd_size_type internal_size;
863 ecoff_symbol_type *internal;
864 ecoff_symbol_type *internal_ptr;
870 /* If we've already read in the symbol table, do nothing. */
871 if (ecoff_data (abfd)->canonical_symbols != NULL)
874 /* Get the symbolic information. */
875 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL,
876 &ecoff_data (abfd)->debug_info))
878 if (bfd_get_symcount (abfd) == 0)
881 internal_size = bfd_get_symcount (abfd);
882 internal_size *= sizeof (ecoff_symbol_type);
883 internal = (ecoff_symbol_type *) bfd_alloc (abfd, internal_size);
884 if (internal == NULL)
887 internal_ptr = internal;
888 eraw_src = (char *) ecoff_data (abfd)->debug_info.external_ext;
890 + (ecoff_data (abfd)->debug_info.symbolic_header.iextMax
891 * external_ext_size));
892 for (; eraw_src < eraw_end; eraw_src += external_ext_size, internal_ptr++)
896 (*swap_ext_in) (abfd, (void *) eraw_src, &internal_esym);
898 /* PR 17512: file: 3372-1000-0.004. */
899 if (internal_esym.asym.iss >= ecoff_data (abfd)->debug_info.symbolic_header.issExtMax)
902 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ssext
903 + internal_esym.asym.iss);
904 if (!ecoff_set_symbol_info (abfd, &internal_esym.asym,
905 &internal_ptr->symbol, 1,
906 internal_esym.weakext))
909 /* The alpha uses a negative ifd field for section symbols. */
910 if (internal_esym.ifd >= 0)
911 internal_ptr->fdr = (ecoff_data (abfd)->debug_info.fdr
912 + internal_esym.ifd);
914 internal_ptr->fdr = NULL;
915 internal_ptr->local = FALSE;
916 internal_ptr->native = (void *) eraw_src;
919 /* The local symbols must be accessed via the fdr's, because the
920 string and aux indices are relative to the fdr information. */
921 fdr_ptr = ecoff_data (abfd)->debug_info.fdr;
922 fdr_end = fdr_ptr + ecoff_data (abfd)->debug_info.symbolic_header.ifdMax;
923 for (; fdr_ptr < fdr_end; fdr_ptr++)
928 lraw_src = ((char *) ecoff_data (abfd)->debug_info.external_sym
929 + fdr_ptr->isymBase * external_sym_size);
930 lraw_end = lraw_src + fdr_ptr->csym * external_sym_size;
933 lraw_src += external_sym_size, internal_ptr++)
937 (*swap_sym_in) (abfd, (void *) lraw_src, &internal_sym);
938 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ss
941 if (!ecoff_set_symbol_info (abfd, &internal_sym,
942 &internal_ptr->symbol, 0, 0))
944 internal_ptr->fdr = fdr_ptr;
945 internal_ptr->local = TRUE;
946 internal_ptr->native = (void *) lraw_src;
950 /* PR 17512: file: 3372-3080-0.004.
951 A discrepancy between ecoff_data (abfd)->debug_info.symbolic_header.isymMax
952 and ecoff_data (abfd)->debug_info.symbolic_header.ifdMax can mean that
953 we have fewer symbols than we were expecting. Allow for this by updating
954 the symbol count and warning the user. */
955 if (internal_ptr - internal < (ptrdiff_t) bfd_get_symcount (abfd))
957 bfd_get_symcount (abfd) = internal_ptr - internal;
958 (*_bfd_error_handler)
959 (_("%B: warning: isymMax (%ld) is greater than ifdMax (%d)\n"),
960 abfd, ecoff_data (abfd)->debug_info.symbolic_header.isymMax,
961 ecoff_data (abfd)->debug_info.symbolic_header.ifdMax);
964 ecoff_data (abfd)->canonical_symbols = internal;
969 /* Return the amount of space needed for the canonical symbols. */
972 _bfd_ecoff_get_symtab_upper_bound (bfd *abfd)
974 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL,
975 &ecoff_data (abfd)->debug_info))
978 if (bfd_get_symcount (abfd) == 0)
981 return (bfd_get_symcount (abfd) + 1) * (sizeof (ecoff_symbol_type *));
984 /* Get the canonical symbols. */
987 _bfd_ecoff_canonicalize_symtab (bfd *abfd, asymbol **alocation)
989 unsigned int counter = 0;
990 ecoff_symbol_type *symbase;
991 ecoff_symbol_type **location = (ecoff_symbol_type **) alocation;
993 if (! _bfd_ecoff_slurp_symbol_table (abfd))
995 if (bfd_get_symcount (abfd) == 0)
998 symbase = ecoff_data (abfd)->canonical_symbols;
999 while (counter < bfd_get_symcount (abfd))
1001 *(location++) = symbase++;
1005 return bfd_get_symcount (abfd);
1008 /* Turn ECOFF type information into a printable string.
1009 ecoff_emit_aggregate and ecoff_type_to_string are from
1010 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1012 /* Write aggregate information to a string. */
1015 ecoff_emit_aggregate (bfd *abfd,
1022 const struct ecoff_debug_swap * const debug_swap =
1023 &ecoff_backend (abfd)->debug_swap;
1024 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
1025 unsigned int ifd = rndx->rfd;
1026 unsigned int indx = rndx->index;
1032 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1033 struct return type of a procedure compiled without -g. */
1034 if (ifd == 0xffffffff
1035 || (rndx->rfd == 0xfff && indx == 0))
1036 name = "<undefined>";
1037 else if (indx == indexNil)
1043 if (debug_info->external_rfd == NULL)
1044 fdr = debug_info->fdr + ifd;
1049 (*debug_swap->swap_rfd_in) (abfd,
1050 ((char *) debug_info->external_rfd
1051 + ((fdr->rfdBase + ifd)
1052 * debug_swap->external_rfd_size)),
1054 fdr = debug_info->fdr + rfd;
1057 indx += fdr->isymBase;
1059 (*debug_swap->swap_sym_in) (abfd,
1060 ((char *) debug_info->external_sym
1061 + indx * debug_swap->external_sym_size),
1064 name = debug_info->ss + fdr->issBase + sym.iss;
1068 "%s %s { ifd = %u, index = %lu }",
1070 ((unsigned long) indx
1071 + debug_info->symbolic_header.iextMax));
1074 /* Convert the type information to string format. */
1077 ecoff_type_to_string (bfd *abfd, FDR *fdr, unsigned int indx)
1079 union aux_ext *aux_ptr;
1089 unsigned int basic_type;
1092 static char buffer2[1024];
1097 aux_ptr = ecoff_data (abfd)->debug_info.external_aux + fdr->iauxBase;
1098 bigendian = fdr->fBigendian;
1100 for (i = 0; i < 7; i++)
1102 qualifiers[i].low_bound = 0;
1103 qualifiers[i].high_bound = 0;
1104 qualifiers[i].stride = 0;
1107 if (AUX_GET_ISYM (bigendian, &aux_ptr[indx]) == (bfd_vma) -1)
1108 return "-1 (no type)";
1109 _bfd_ecoff_swap_tir_in (bigendian, &aux_ptr[indx++].a_ti, &u.ti);
1111 basic_type = u.ti.bt;
1112 qualifiers[0].type = u.ti.tq0;
1113 qualifiers[1].type = u.ti.tq1;
1114 qualifiers[2].type = u.ti.tq2;
1115 qualifiers[3].type = u.ti.tq3;
1116 qualifiers[4].type = u.ti.tq4;
1117 qualifiers[5].type = u.ti.tq5;
1118 qualifiers[6].type = tqNil;
1120 /* Go get the basic type. */
1123 case btNil: /* Undefined. */
1127 case btAdr: /* Address - integer same size as pointer. */
1128 strcpy (p1, "address");
1131 case btChar: /* Character. */
1132 strcpy (p1, "char");
1135 case btUChar: /* Unsigned character. */
1136 strcpy (p1, "unsigned char");
1139 case btShort: /* Short. */
1140 strcpy (p1, "short");
1143 case btUShort: /* Unsigned short. */
1144 strcpy (p1, "unsigned short");
1147 case btInt: /* Int. */
1151 case btUInt: /* Unsigned int. */
1152 strcpy (p1, "unsigned int");
1155 case btLong: /* Long. */
1156 strcpy (p1, "long");
1159 case btULong: /* Unsigned long. */
1160 strcpy (p1, "unsigned long");
1163 case btFloat: /* Float (real). */
1164 strcpy (p1, "float");
1167 case btDouble: /* Double (real). */
1168 strcpy (p1, "double");
1171 /* Structures add 1-2 aux words:
1172 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1173 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1175 case btStruct: /* Structure (Record). */
1176 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1177 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1178 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1180 indx++; /* Skip aux words. */
1183 /* Unions add 1-2 aux words:
1184 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1185 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1187 case btUnion: /* Union. */
1188 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1189 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1190 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1192 indx++; /* Skip aux words. */
1195 /* Enumerations add 1-2 aux words:
1196 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1197 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1199 case btEnum: /* Enumeration. */
1200 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1201 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1202 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1204 indx++; /* Skip aux words. */
1207 case btTypedef: /* Defined via a typedef, isymRef points. */
1208 strcpy (p1, "typedef");
1211 case btRange: /* Subrange of int. */
1212 strcpy (p1, "subrange");
1215 case btSet: /* Pascal sets. */
1219 case btComplex: /* Fortran complex. */
1220 strcpy (p1, "complex");
1223 case btDComplex: /* Fortran double complex. */
1224 strcpy (p1, "double complex");
1227 case btIndirect: /* Forward or unnamed typedef. */
1228 strcpy (p1, "forward/unamed typedef");
1231 case btFixedDec: /* Fixed Decimal. */
1232 strcpy (p1, "fixed decimal");
1235 case btFloatDec: /* Float Decimal. */
1236 strcpy (p1, "float decimal");
1239 case btString: /* Varying Length Character String. */
1240 strcpy (p1, "string");
1243 case btBit: /* Aligned Bit String. */
1247 case btPicture: /* Picture. */
1248 strcpy (p1, "picture");
1251 case btVoid: /* Void. */
1252 strcpy (p1, "void");
1256 sprintf (p1, _("Unknown basic type %d"), (int) basic_type);
1260 p1 += strlen (buffer1);
1262 /* If this is a bitfield, get the bitsize. */
1267 bitsize = AUX_GET_WIDTH (bigendian, &aux_ptr[indx++]);
1268 sprintf (p1, " : %d", bitsize);
1269 p1 += strlen (buffer1);
1272 /* Deal with any qualifiers. */
1273 if (qualifiers[0].type != tqNil)
1275 /* Snarf up any array bounds in the correct order. Arrays
1276 store 5 successive words in the aux. table:
1277 word 0 RNDXR to type of the bounds (ie, int)
1278 word 1 Current file descriptor index
1280 word 3 high bound (or -1 if [])
1281 word 4 stride size in bits. */
1282 for (i = 0; i < 7; i++)
1284 if (qualifiers[i].type == tqArray)
1286 qualifiers[i].low_bound =
1287 AUX_GET_DNLOW (bigendian, &aux_ptr[indx+2]);
1288 qualifiers[i].high_bound =
1289 AUX_GET_DNHIGH (bigendian, &aux_ptr[indx+3]);
1290 qualifiers[i].stride =
1291 AUX_GET_WIDTH (bigendian, &aux_ptr[indx+4]);
1296 /* Now print out the qualifiers. */
1297 for (i = 0; i < 6; i++)
1299 switch (qualifiers[i].type)
1306 strcpy (p2, "ptr to ");
1307 p2 += sizeof ("ptr to ")-1;
1311 strcpy (p2, "volatile ");
1312 p2 += sizeof ("volatile ")-1;
1316 strcpy (p2, "far ");
1317 p2 += sizeof ("far ")-1;
1321 strcpy (p2, "func. ret. ");
1322 p2 += sizeof ("func. ret. ");
1327 int first_array = i;
1330 /* Print array bounds reversed (ie, in the order the C
1331 programmer writes them). C is such a fun language.... */
1332 while (i < 5 && qualifiers[i+1].type == tqArray)
1335 for (j = i; j >= first_array; j--)
1337 strcpy (p2, "array [");
1338 p2 += sizeof ("array [")-1;
1339 if (qualifiers[j].low_bound != 0)
1341 "%ld:%ld {%ld bits}",
1342 (long) qualifiers[j].low_bound,
1343 (long) qualifiers[j].high_bound,
1344 (long) qualifiers[j].stride);
1346 else if (qualifiers[j].high_bound != -1)
1349 (long) (qualifiers[j].high_bound + 1),
1350 (long) (qualifiers[j].stride));
1353 sprintf (p2, " {%ld bits}", (long) (qualifiers[j].stride));
1356 strcpy (p2, "] of ");
1357 p2 += sizeof ("] of ")-1;
1365 strcpy (p2, buffer1);
1369 /* Return information about ECOFF symbol SYMBOL in RET. */
1372 _bfd_ecoff_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
1376 bfd_symbol_info (symbol, ret);
1379 /* Return whether this is a local label. */
1382 _bfd_ecoff_bfd_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
1385 return name[0] == '$';
1388 /* Print information about an ECOFF symbol. */
1391 _bfd_ecoff_print_symbol (bfd *abfd,
1394 bfd_print_symbol_type how)
1396 const struct ecoff_debug_swap * const debug_swap
1397 = &ecoff_backend (abfd)->debug_swap;
1398 FILE *file = (FILE *)filep;
1402 case bfd_print_symbol_name:
1403 fprintf (file, "%s", symbol->name);
1405 case bfd_print_symbol_more:
1406 if (ecoffsymbol (symbol)->local)
1410 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native,
1412 fprintf (file, "ecoff local ");
1413 fprintf_vma (file, (bfd_vma) ecoff_sym.value);
1414 fprintf (file, " %x %x", (unsigned) ecoff_sym.st,
1415 (unsigned) ecoff_sym.sc);
1421 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native,
1423 fprintf (file, "ecoff extern ");
1424 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value);
1425 fprintf (file, " %x %x", (unsigned) ecoff_ext.asym.st,
1426 (unsigned) ecoff_ext.asym.sc);
1429 case bfd_print_symbol_all:
1430 /* Print out the symbols in a reasonable way. */
1439 if (ecoffsymbol (symbol)->local)
1441 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native,
1444 pos = ((((char *) ecoffsymbol (symbol)->native
1445 - (char *) ecoff_data (abfd)->debug_info.external_sym)
1446 / debug_swap->external_sym_size)
1447 + ecoff_data (abfd)->debug_info.symbolic_header.iextMax);
1454 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native,
1457 pos = (((char *) ecoffsymbol (symbol)->native
1458 - (char *) ecoff_data (abfd)->debug_info.external_ext)
1459 / debug_swap->external_ext_size);
1460 jmptbl = ecoff_ext.jmptbl ? 'j' : ' ';
1461 cobol_main = ecoff_ext.cobol_main ? 'c' : ' ';
1462 weakext = ecoff_ext.weakext ? 'w' : ' ';
1465 fprintf (file, "[%3d] %c ",
1467 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value);
1468 fprintf (file, " st %x sc %x indx %x %c%c%c %s",
1469 (unsigned) ecoff_ext.asym.st,
1470 (unsigned) ecoff_ext.asym.sc,
1471 (unsigned) ecoff_ext.asym.index,
1472 jmptbl, cobol_main, weakext,
1475 if (ecoffsymbol (symbol)->fdr != NULL
1476 && ecoff_ext.asym.index != indexNil)
1481 bfd_size_type sym_base;
1482 union aux_ext *aux_base;
1484 fdr = ecoffsymbol (symbol)->fdr;
1485 indx = ecoff_ext.asym.index;
1487 /* sym_base is used to map the fdr relative indices which
1488 appear in the file to the position number which we are
1490 sym_base = fdr->isymBase;
1491 if (ecoffsymbol (symbol)->local)
1493 ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
1495 /* aux_base is the start of the aux entries for this file;
1496 asym.index is an offset from this. */
1497 aux_base = (ecoff_data (abfd)->debug_info.external_aux
1500 /* The aux entries are stored in host byte order; the
1501 order is indicated by a bit in the fdr. */
1502 bigendian = fdr->fBigendian;
1504 /* This switch is basically from gcc/mips-tdump.c. */
1505 switch (ecoff_ext.asym.st)
1513 fprintf (file, _("\n End+1 symbol: %ld"),
1514 (long) (indx + sym_base));
1518 if (ecoff_ext.asym.sc == scText
1519 || ecoff_ext.asym.sc == scInfo)
1520 fprintf (file, _("\n First symbol: %ld"),
1521 (long) (indx + sym_base));
1523 fprintf (file, _("\n First symbol: %ld"),
1525 (AUX_GET_ISYM (bigendian,
1526 &aux_base[ecoff_ext.asym.index])
1532 if (ECOFF_IS_STAB (&ecoff_ext.asym))
1534 else if (ecoffsymbol (symbol)->local)
1535 fprintf (file, _("\n End+1 symbol: %-7ld Type: %s"),
1537 (AUX_GET_ISYM (bigendian,
1538 &aux_base[ecoff_ext.asym.index])
1540 ecoff_type_to_string (abfd, fdr, indx + 1));
1542 fprintf (file, _("\n Local symbol: %ld"),
1545 + (ecoff_data (abfd)
1546 ->debug_info.symbolic_header.iextMax)));
1550 fprintf (file, _("\n struct; End+1 symbol: %ld"),
1551 (long) (indx + sym_base));
1555 fprintf (file, _("\n union; End+1 symbol: %ld"),
1556 (long) (indx + sym_base));
1560 fprintf (file, _("\n enum; End+1 symbol: %ld"),
1561 (long) (indx + sym_base));
1565 if (! ECOFF_IS_STAB (&ecoff_ext.asym))
1566 fprintf (file, _("\n Type: %s"),
1567 ecoff_type_to_string (abfd, fdr, indx));
1576 /* Read in the relocs for a section. */
1579 ecoff_slurp_reloc_table (bfd *abfd,
1583 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
1584 arelent *internal_relocs;
1585 bfd_size_type external_reloc_size;
1587 char *external_relocs;
1591 if (section->relocation != NULL
1592 || section->reloc_count == 0
1593 || (section->flags & SEC_CONSTRUCTOR) != 0)
1596 if (! _bfd_ecoff_slurp_symbol_table (abfd))
1599 amt = section->reloc_count;
1600 amt *= sizeof (arelent);
1601 internal_relocs = (arelent *) bfd_alloc (abfd, amt);
1603 external_reloc_size = backend->external_reloc_size;
1604 amt = external_reloc_size * section->reloc_count;
1605 external_relocs = (char *) bfd_alloc (abfd, amt);
1606 if (internal_relocs == NULL || external_relocs == NULL)
1608 if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0)
1610 if (bfd_bread (external_relocs, amt, abfd) != amt)
1613 for (i = 0, rptr = internal_relocs; i < section->reloc_count; i++, rptr++)
1615 struct internal_reloc intern;
1617 (*backend->swap_reloc_in) (abfd,
1618 external_relocs + i * external_reloc_size,
1621 if (intern.r_extern)
1623 /* r_symndx is an index into the external symbols. */
1624 BFD_ASSERT (intern.r_symndx >= 0
1626 < (ecoff_data (abfd)
1627 ->debug_info.symbolic_header.iextMax)));
1628 rptr->sym_ptr_ptr = symbols + intern.r_symndx;
1631 else if (intern.r_symndx == RELOC_SECTION_NONE
1632 || intern.r_symndx == RELOC_SECTION_ABS)
1634 rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1639 const char *sec_name;
1642 /* r_symndx is a section key. */
1643 switch (intern.r_symndx)
1645 case RELOC_SECTION_TEXT: sec_name = _TEXT; break;
1646 case RELOC_SECTION_RDATA: sec_name = _RDATA; break;
1647 case RELOC_SECTION_DATA: sec_name = _DATA; break;
1648 case RELOC_SECTION_SDATA: sec_name = _SDATA; break;
1649 case RELOC_SECTION_SBSS: sec_name = _SBSS; break;
1650 case RELOC_SECTION_BSS: sec_name = _BSS; break;
1651 case RELOC_SECTION_INIT: sec_name = _INIT; break;
1652 case RELOC_SECTION_LIT8: sec_name = _LIT8; break;
1653 case RELOC_SECTION_LIT4: sec_name = _LIT4; break;
1654 case RELOC_SECTION_XDATA: sec_name = _XDATA; break;
1655 case RELOC_SECTION_PDATA: sec_name = _PDATA; break;
1656 case RELOC_SECTION_FINI: sec_name = _FINI; break;
1657 case RELOC_SECTION_LITA: sec_name = _LITA; break;
1658 case RELOC_SECTION_RCONST: sec_name = _RCONST; break;
1662 sec = bfd_get_section_by_name (abfd, sec_name);
1665 rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
1667 rptr->addend = - bfd_get_section_vma (abfd, sec);
1670 rptr->address = intern.r_vaddr - bfd_get_section_vma (abfd, section);
1672 /* Let the backend select the howto field and do any other
1673 required processing. */
1674 (*backend->adjust_reloc_in) (abfd, &intern, rptr);
1677 bfd_release (abfd, external_relocs);
1679 section->relocation = internal_relocs;
1684 /* Get a canonical list of relocs. */
1687 _bfd_ecoff_canonicalize_reloc (bfd *abfd,
1694 if (section->flags & SEC_CONSTRUCTOR)
1696 arelent_chain *chain;
1698 /* This section has relocs made up by us, not the file, so take
1699 them out of their chain and place them into the data area
1701 for (count = 0, chain = section->constructor_chain;
1702 count < section->reloc_count;
1703 count++, chain = chain->next)
1704 *relptr++ = &chain->relent;
1710 if (! ecoff_slurp_reloc_table (abfd, section, symbols))
1713 tblptr = section->relocation;
1715 for (count = 0; count < section->reloc_count; count++)
1716 *relptr++ = tblptr++;
1721 return section->reloc_count;
1724 /* Provided a BFD, a section and an offset into the section, calculate
1725 and return the name of the source file and the line nearest to the
1729 _bfd_ecoff_find_nearest_line (bfd *abfd,
1730 asymbol **symbols ATTRIBUTE_UNUSED,
1733 const char **filename_ptr,
1734 const char **functionname_ptr,
1735 unsigned int *retline_ptr,
1736 unsigned int *discriminator_ptr)
1738 const struct ecoff_debug_swap * const debug_swap
1739 = &ecoff_backend (abfd)->debug_swap;
1740 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
1741 struct ecoff_find_line *line_info;
1743 /* Make sure we have the FDR's. */
1744 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL, debug_info)
1745 || bfd_get_symcount (abfd) == 0)
1748 if (ecoff_data (abfd)->find_line_info == NULL)
1750 bfd_size_type amt = sizeof (struct ecoff_find_line);
1752 ecoff_data (abfd)->find_line_info =
1753 (struct ecoff_find_line *) bfd_zalloc (abfd, amt);
1754 if (ecoff_data (abfd)->find_line_info == NULL)
1758 if (discriminator_ptr)
1759 *discriminator_ptr = 0;
1760 line_info = ecoff_data (abfd)->find_line_info;
1761 return _bfd_ecoff_locate_line (abfd, section, offset, debug_info,
1762 debug_swap, line_info, filename_ptr,
1763 functionname_ptr, retline_ptr);
1766 /* Copy private BFD data. This is called by objcopy and strip. We
1767 use it to copy the ECOFF debugging information from one BFD to the
1768 other. It would be theoretically possible to represent the ECOFF
1769 debugging information in the symbol table. However, it would be a
1770 lot of work, and there would be little gain (gas, gdb, and ld
1771 already access the ECOFF debugging information via the
1772 ecoff_debug_info structure, and that structure would have to be
1773 retained in order to support ECOFF debugging in MIPS ELF).
1775 The debugging information for the ECOFF external symbols comes from
1776 the symbol table, so this function only handles the other debugging
1780 _bfd_ecoff_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
1782 struct ecoff_debug_info *iinfo = &ecoff_data (ibfd)->debug_info;
1783 struct ecoff_debug_info *oinfo = &ecoff_data (obfd)->debug_info;
1785 asymbol **sym_ptr_ptr;
1789 /* We only want to copy information over if both BFD's use ECOFF
1791 if (bfd_get_flavour (ibfd) != bfd_target_ecoff_flavour
1792 || bfd_get_flavour (obfd) != bfd_target_ecoff_flavour)
1795 /* Copy the GP value and the register masks. */
1796 ecoff_data (obfd)->gp = ecoff_data (ibfd)->gp;
1797 ecoff_data (obfd)->gprmask = ecoff_data (ibfd)->gprmask;
1798 ecoff_data (obfd)->fprmask = ecoff_data (ibfd)->fprmask;
1799 for (i = 0; i < 3; i++)
1800 ecoff_data (obfd)->cprmask[i] = ecoff_data (ibfd)->cprmask[i];
1802 /* Copy the version stamp. */
1803 oinfo->symbolic_header.vstamp = iinfo->symbolic_header.vstamp;
1805 /* If there are no symbols, don't copy any debugging information. */
1806 c = bfd_get_symcount (obfd);
1807 sym_ptr_ptr = bfd_get_outsymbols (obfd);
1808 if (c == 0 || sym_ptr_ptr == NULL)
1811 /* See if there are any local symbols. */
1813 for (; c > 0; c--, sym_ptr_ptr++)
1815 if (ecoffsymbol (*sym_ptr_ptr)->local)
1824 /* There are some local symbols. We just bring over all the
1825 debugging information. FIXME: This is not quite the right
1826 thing to do. If the user has asked us to discard all
1827 debugging information, then we are probably going to wind up
1828 keeping it because there will probably be some local symbol
1829 which objcopy did not discard. We should actually break
1830 apart the debugging information and only keep that which
1831 applies to the symbols we want to keep. */
1832 oinfo->symbolic_header.ilineMax = iinfo->symbolic_header.ilineMax;
1833 oinfo->symbolic_header.cbLine = iinfo->symbolic_header.cbLine;
1834 oinfo->line = iinfo->line;
1836 oinfo->symbolic_header.idnMax = iinfo->symbolic_header.idnMax;
1837 oinfo->external_dnr = iinfo->external_dnr;
1839 oinfo->symbolic_header.ipdMax = iinfo->symbolic_header.ipdMax;
1840 oinfo->external_pdr = iinfo->external_pdr;
1842 oinfo->symbolic_header.isymMax = iinfo->symbolic_header.isymMax;
1843 oinfo->external_sym = iinfo->external_sym;
1845 oinfo->symbolic_header.ioptMax = iinfo->symbolic_header.ioptMax;
1846 oinfo->external_opt = iinfo->external_opt;
1848 oinfo->symbolic_header.iauxMax = iinfo->symbolic_header.iauxMax;
1849 oinfo->external_aux = iinfo->external_aux;
1851 oinfo->symbolic_header.issMax = iinfo->symbolic_header.issMax;
1852 oinfo->ss = iinfo->ss;
1854 oinfo->symbolic_header.ifdMax = iinfo->symbolic_header.ifdMax;
1855 oinfo->external_fdr = iinfo->external_fdr;
1857 oinfo->symbolic_header.crfd = iinfo->symbolic_header.crfd;
1858 oinfo->external_rfd = iinfo->external_rfd;
1862 /* We are discarding all the local symbol information. Look
1863 through the external symbols and remove all references to FDR
1864 or aux information. */
1865 c = bfd_get_symcount (obfd);
1866 sym_ptr_ptr = bfd_get_outsymbols (obfd);
1867 for (; c > 0; c--, sym_ptr_ptr++)
1871 (*(ecoff_backend (obfd)->debug_swap.swap_ext_in))
1872 (obfd, ecoffsymbol (*sym_ptr_ptr)->native, &esym);
1874 esym.asym.index = indexNil;
1875 (*(ecoff_backend (obfd)->debug_swap.swap_ext_out))
1876 (obfd, &esym, ecoffsymbol (*sym_ptr_ptr)->native);
1883 /* Set the architecture. The supported architecture is stored in the
1884 backend pointer. We always set the architecture anyhow, since many
1885 callers ignore the return value. */
1888 _bfd_ecoff_set_arch_mach (bfd *abfd,
1889 enum bfd_architecture arch,
1890 unsigned long machine)
1892 bfd_default_set_arch_mach (abfd, arch, machine);
1893 return arch == ecoff_backend (abfd)->arch;
1896 /* Get the size of the section headers. */
1899 _bfd_ecoff_sizeof_headers (bfd *abfd,
1900 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1907 for (current = abfd->sections;
1909 current = current->next)
1912 ret = (bfd_coff_filhsz (abfd)
1913 + bfd_coff_aoutsz (abfd)
1914 + c * bfd_coff_scnhsz (abfd));
1915 return (int) BFD_ALIGN (ret, 16);
1918 /* Get the contents of a section. */
1921 _bfd_ecoff_get_section_contents (bfd *abfd,
1925 bfd_size_type count)
1927 return _bfd_generic_get_section_contents (abfd, section, location,
1931 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
1932 called via qsort. */
1935 ecoff_sort_hdrs (const void * arg1, const void * arg2)
1937 const asection *hdr1 = *(const asection **) arg1;
1938 const asection *hdr2 = *(const asection **) arg2;
1940 if ((hdr1->flags & SEC_ALLOC) != 0)
1942 if ((hdr2->flags & SEC_ALLOC) == 0)
1947 if ((hdr2->flags & SEC_ALLOC) != 0)
1950 if (hdr1->vma < hdr2->vma)
1952 else if (hdr1->vma > hdr2->vma)
1958 /* Calculate the file position for each section, and set
1962 ecoff_compute_section_file_positions (bfd *abfd)
1964 file_ptr sofar, file_sofar;
1965 asection **sorted_hdrs;
1969 bfd_boolean rdata_in_text;
1970 bfd_boolean first_data, first_nonalloc;
1971 const bfd_vma round = ecoff_backend (abfd)->round;
1974 sofar = _bfd_ecoff_sizeof_headers (abfd, NULL);
1977 /* Sort the sections by VMA. */
1978 amt = abfd->section_count;
1979 amt *= sizeof (asection *);
1980 sorted_hdrs = (asection **) bfd_malloc (amt);
1981 if (sorted_hdrs == NULL)
1983 for (current = abfd->sections, i = 0;
1985 current = current->next, i++)
1986 sorted_hdrs[i] = current;
1987 BFD_ASSERT (i == abfd->section_count);
1989 qsort (sorted_hdrs, abfd->section_count, sizeof (asection *),
1992 /* Some versions of the OSF linker put the .rdata section in the
1993 text segment, and some do not. */
1994 rdata_in_text = ecoff_backend (abfd)->rdata_in_text;
1997 for (i = 0; i < abfd->section_count; i++)
1999 current = sorted_hdrs[i];
2000 if (streq (current->name, _RDATA))
2002 if ((current->flags & SEC_CODE) == 0
2003 && ! streq (current->name, _PDATA)
2004 && ! streq (current->name, _RCONST))
2006 rdata_in_text = FALSE;
2011 ecoff_data (abfd)->rdata_in_text = rdata_in_text;
2014 first_nonalloc = TRUE;
2015 for (i = 0; i < abfd->section_count; i++)
2017 unsigned int alignment_power;
2019 current = sorted_hdrs[i];
2021 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2022 supposed to indicate the number of .pdata entries that are
2023 really in the section. Each entry is 8 bytes. We store this
2024 away in line_filepos before increasing the section size. */
2025 if (streq (current->name, _PDATA))
2026 current->line_filepos = current->size / 8;
2028 alignment_power = current->alignment_power;
2030 /* On Ultrix, the data sections in an executable file must be
2031 aligned to a page boundary within the file. This does not
2032 affect the section size, though. FIXME: Does this work for
2033 other platforms? It requires some modification for the
2034 Alpha, because .rdata on the Alpha goes with the text, not
2036 if ((abfd->flags & EXEC_P) != 0
2037 && (abfd->flags & D_PAGED) != 0
2039 && (current->flags & SEC_CODE) == 0
2041 || ! streq (current->name, _RDATA))
2042 && ! streq (current->name, _PDATA)
2043 && ! streq (current->name, _RCONST))
2045 sofar = (sofar + round - 1) &~ (round - 1);
2046 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2049 else if (streq (current->name, _LIB))
2051 /* On Irix 4, the location of contents of the .lib section
2052 from a shared library section is also rounded up to a
2055 sofar = (sofar + round - 1) &~ (round - 1);
2056 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2058 else if (first_nonalloc
2059 && (current->flags & SEC_ALLOC) == 0
2060 && (abfd->flags & D_PAGED) != 0)
2062 /* Skip up to the next page for an unallocated section, such
2063 as the .comment section on the Alpha. This leaves room
2064 for the .bss section. */
2065 first_nonalloc = FALSE;
2066 sofar = (sofar + round - 1) &~ (round - 1);
2067 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2070 /* Align the sections in the file to the same boundary on
2071 which they are aligned in virtual memory. */
2072 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2073 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2074 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
2076 if ((abfd->flags & D_PAGED) != 0
2077 && (current->flags & SEC_ALLOC) != 0)
2079 sofar += (current->vma - sofar) % round;
2080 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2081 file_sofar += (current->vma - file_sofar) % round;
2084 if ((current->flags & (SEC_HAS_CONTENTS | SEC_LOAD)) != 0)
2085 current->filepos = file_sofar;
2087 sofar += current->size;
2088 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2089 file_sofar += current->size;
2091 /* Make sure that this section is of the right size too. */
2093 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2094 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2095 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
2096 current->size += sofar - old_sofar;
2102 ecoff_data (abfd)->reloc_filepos = file_sofar;
2107 /* Determine the location of the relocs for all the sections in the
2108 output file, as well as the location of the symbolic debugging
2111 static bfd_size_type
2112 ecoff_compute_reloc_file_positions (bfd *abfd)
2114 const bfd_size_type external_reloc_size =
2115 ecoff_backend (abfd)->external_reloc_size;
2116 file_ptr reloc_base;
2117 bfd_size_type reloc_size;
2121 if (! abfd->output_has_begun)
2123 if (! ecoff_compute_section_file_positions (abfd))
2125 abfd->output_has_begun = TRUE;
2128 reloc_base = ecoff_data (abfd)->reloc_filepos;
2131 for (current = abfd->sections;
2133 current = current->next)
2135 if (current->reloc_count == 0)
2136 current->rel_filepos = 0;
2139 bfd_size_type relsize;
2141 current->rel_filepos = reloc_base;
2142 relsize = current->reloc_count * external_reloc_size;
2143 reloc_size += relsize;
2144 reloc_base += relsize;
2148 sym_base = ecoff_data (abfd)->reloc_filepos + reloc_size;
2150 /* At least on Ultrix, the symbol table of an executable file must
2151 be aligned to a page boundary. FIXME: Is this true on other
2153 if ((abfd->flags & EXEC_P) != 0
2154 && (abfd->flags & D_PAGED) != 0)
2155 sym_base = ((sym_base + ecoff_backend (abfd)->round - 1)
2156 &~ (ecoff_backend (abfd)->round - 1));
2158 ecoff_data (abfd)->sym_filepos = sym_base;
2163 /* Set the contents of a section. */
2166 _bfd_ecoff_set_section_contents (bfd *abfd,
2168 const void * location,
2170 bfd_size_type count)
2174 /* This must be done first, because bfd_set_section_contents is
2175 going to set output_has_begun to TRUE. */
2176 if (! abfd->output_has_begun
2177 && ! ecoff_compute_section_file_positions (abfd))
2180 /* Handle the .lib section specially so that Irix 4 shared libraries
2181 work out. See coff_set_section_contents in coffcode.h. */
2182 if (streq (section->name, _LIB))
2184 bfd_byte *rec, *recend;
2186 rec = (bfd_byte *) location;
2187 recend = rec + count;
2188 while (rec < recend)
2191 rec += bfd_get_32 (abfd, rec) * 4;
2194 BFD_ASSERT (rec == recend);
2200 pos = section->filepos + offset;
2201 if (bfd_seek (abfd, pos, SEEK_SET) != 0
2202 || bfd_bwrite (location, count, abfd) != count)
2208 /* Get the GP value for an ECOFF file. This is a hook used by
2212 bfd_ecoff_get_gp_value (bfd *abfd)
2214 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2215 || bfd_get_format (abfd) != bfd_object)
2217 bfd_set_error (bfd_error_invalid_operation);
2221 return ecoff_data (abfd)->gp;
2224 /* Set the GP value for an ECOFF file. This is a hook used by the
2228 bfd_ecoff_set_gp_value (bfd *abfd, bfd_vma gp_value)
2230 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2231 || bfd_get_format (abfd) != bfd_object)
2233 bfd_set_error (bfd_error_invalid_operation);
2237 ecoff_data (abfd)->gp = gp_value;
2242 /* Set the register masks for an ECOFF file. This is a hook used by
2246 bfd_ecoff_set_regmasks (bfd *abfd,
2247 unsigned long gprmask,
2248 unsigned long fprmask,
2249 unsigned long *cprmask)
2251 ecoff_data_type *tdata;
2253 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2254 || bfd_get_format (abfd) != bfd_object)
2256 bfd_set_error (bfd_error_invalid_operation);
2260 tdata = ecoff_data (abfd);
2261 tdata->gprmask = gprmask;
2262 tdata->fprmask = fprmask;
2263 if (cprmask != NULL)
2267 for (i = 0; i < 3; i++)
2268 tdata->cprmask[i] = cprmask[i];
2274 /* Get ECOFF EXTR information for an external symbol. This function
2275 is passed to bfd_ecoff_debug_externals. */
2278 ecoff_get_extr (asymbol *sym, EXTR *esym)
2280 ecoff_symbol_type *ecoff_sym_ptr;
2283 if (bfd_asymbol_flavour (sym) != bfd_target_ecoff_flavour
2284 || ecoffsymbol (sym)->native == NULL)
2286 /* Don't include debugging, local, or section symbols. */
2287 if ((sym->flags & BSF_DEBUGGING) != 0
2288 || (sym->flags & BSF_LOCAL) != 0
2289 || (sym->flags & BSF_SECTION_SYM) != 0)
2293 esym->cobol_main = 0;
2294 esym->weakext = (sym->flags & BSF_WEAK) != 0;
2297 /* FIXME: we can do better than this for st and sc. */
2298 esym->asym.st = stGlobal;
2299 esym->asym.sc = scAbs;
2300 esym->asym.reserved = 0;
2301 esym->asym.index = indexNil;
2305 ecoff_sym_ptr = ecoffsymbol (sym);
2307 if (ecoff_sym_ptr->local)
2310 input_bfd = bfd_asymbol_bfd (sym);
2311 (*(ecoff_backend (input_bfd)->debug_swap.swap_ext_in))
2312 (input_bfd, ecoff_sym_ptr->native, esym);
2314 /* If the symbol was defined by the linker, then esym will be
2315 undefined but sym will not be. Get a better class for such a
2317 if ((esym->asym.sc == scUndefined
2318 || esym->asym.sc == scSUndefined)
2319 && ! bfd_is_und_section (bfd_get_section (sym)))
2320 esym->asym.sc = scAbs;
2322 /* Adjust the FDR index for the symbol by that used for the input
2324 if (esym->ifd != -1)
2326 struct ecoff_debug_info *input_debug;
2328 input_debug = &ecoff_data (input_bfd)->debug_info;
2329 BFD_ASSERT (esym->ifd < input_debug->symbolic_header.ifdMax);
2330 if (input_debug->ifdmap != NULL)
2331 esym->ifd = input_debug->ifdmap[esym->ifd];
2337 /* Set the external symbol index. This routine is passed to
2338 bfd_ecoff_debug_externals. */
2341 ecoff_set_index (asymbol *sym, bfd_size_type indx)
2343 ecoff_set_sym_index (sym, indx);
2346 /* Write out an ECOFF file. */
2349 _bfd_ecoff_write_object_contents (bfd *abfd)
2351 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
2352 const bfd_vma round = backend->round;
2353 const bfd_size_type filhsz = bfd_coff_filhsz (abfd);
2354 const bfd_size_type aoutsz = bfd_coff_aoutsz (abfd);
2355 const bfd_size_type scnhsz = bfd_coff_scnhsz (abfd);
2356 const bfd_size_type external_hdr_size
2357 = backend->debug_swap.external_hdr_size;
2358 const bfd_size_type external_reloc_size = backend->external_reloc_size;
2359 void (* const adjust_reloc_out) (bfd *, const arelent *, struct internal_reloc *)
2360 = backend->adjust_reloc_out;
2361 void (* const swap_reloc_out) (bfd *, const struct internal_reloc *, void *)
2362 = backend->swap_reloc_out;
2363 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
2364 HDRR * const symhdr = &debug->symbolic_header;
2367 bfd_size_type reloc_size;
2368 bfd_size_type text_size;
2370 bfd_boolean set_text_start;
2371 bfd_size_type data_size;
2373 bfd_boolean set_data_start;
2374 bfd_size_type bss_size;
2376 void * reloc_buff = NULL;
2377 struct internal_filehdr internal_f;
2378 struct internal_aouthdr internal_a;
2381 /* Determine where the sections and relocs will go in the output
2383 reloc_size = ecoff_compute_reloc_file_positions (abfd);
2386 for (current = abfd->sections;
2388 current = current->next)
2390 current->target_index = count;
2394 if ((abfd->flags & D_PAGED) != 0)
2395 text_size = _bfd_ecoff_sizeof_headers (abfd, NULL);
2399 set_text_start = FALSE;
2402 set_data_start = FALSE;
2405 /* Write section headers to the file. */
2407 /* Allocate buff big enough to hold a section header,
2408 file header, or a.out header. */
2417 buff = bfd_malloc (siz);
2422 internal_f.f_nscns = 0;
2423 if (bfd_seek (abfd, (file_ptr) (filhsz + aoutsz), SEEK_SET) != 0)
2426 for (current = abfd->sections;
2428 current = current->next)
2430 struct internal_scnhdr section;
2433 ++internal_f.f_nscns;
2435 strncpy (section.s_name, current->name, sizeof section.s_name);
2437 /* This seems to be correct for Irix 4 shared libraries. */
2438 vma = bfd_get_section_vma (abfd, current);
2439 if (streq (current->name, _LIB))
2440 section.s_vaddr = 0;
2442 section.s_vaddr = vma;
2444 section.s_paddr = current->lma;
2445 section.s_size = current->size;
2447 /* If this section is unloadable then the scnptr will be 0. */
2448 if ((current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
2449 section.s_scnptr = 0;
2451 section.s_scnptr = current->filepos;
2452 section.s_relptr = current->rel_filepos;
2454 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2455 object file produced by the assembler is supposed to point to
2456 information about how much room is required by objects of
2457 various different sizes. I think this only matters if we
2458 want the linker to compute the best size to use, or
2459 something. I don't know what happens if the information is
2461 if (! streq (current->name, _PDATA))
2462 section.s_lnnoptr = 0;
2465 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2466 hold the number of entries in the section (each entry is
2467 8 bytes). We stored this in the line_filepos field in
2468 ecoff_compute_section_file_positions. */
2469 section.s_lnnoptr = current->line_filepos;
2472 section.s_nreloc = current->reloc_count;
2473 section.s_nlnno = 0;
2474 section.s_flags = ecoff_sec_to_styp_flags (current->name,
2477 if (bfd_coff_swap_scnhdr_out (abfd, (void *) §ion, buff) == 0
2478 || bfd_bwrite (buff, scnhsz, abfd) != scnhsz)
2481 if ((section.s_flags & STYP_TEXT) != 0
2482 || ((section.s_flags & STYP_RDATA) != 0
2483 && ecoff_data (abfd)->rdata_in_text)
2484 || section.s_flags == STYP_PDATA
2485 || (section.s_flags & STYP_DYNAMIC) != 0
2486 || (section.s_flags & STYP_LIBLIST) != 0
2487 || (section.s_flags & STYP_RELDYN) != 0
2488 || section.s_flags == STYP_CONFLIC
2489 || (section.s_flags & STYP_DYNSTR) != 0
2490 || (section.s_flags & STYP_DYNSYM) != 0
2491 || (section.s_flags & STYP_HASH) != 0
2492 || (section.s_flags & STYP_ECOFF_INIT) != 0
2493 || (section.s_flags & STYP_ECOFF_FINI) != 0
2494 || section.s_flags == STYP_RCONST)
2496 text_size += current->size;
2497 if (! set_text_start || text_start > vma)
2500 set_text_start = TRUE;
2503 else if ((section.s_flags & STYP_RDATA) != 0
2504 || (section.s_flags & STYP_DATA) != 0
2505 || (section.s_flags & STYP_LITA) != 0
2506 || (section.s_flags & STYP_LIT8) != 0
2507 || (section.s_flags & STYP_LIT4) != 0
2508 || (section.s_flags & STYP_SDATA) != 0
2509 || section.s_flags == STYP_XDATA
2510 || (section.s_flags & STYP_GOT) != 0)
2512 data_size += current->size;
2513 if (! set_data_start || data_start > vma)
2516 set_data_start = TRUE;
2519 else if ((section.s_flags & STYP_BSS) != 0
2520 || (section.s_flags & STYP_SBSS) != 0)
2521 bss_size += current->size;
2522 else if (section.s_flags == 0
2523 || (section.s_flags & STYP_ECOFF_LIB) != 0
2524 || section.s_flags == STYP_COMMENT)
2530 /* Set up the file header. */
2531 internal_f.f_magic = ecoff_get_magic (abfd);
2533 /* We will NOT put a fucking timestamp in the header here. Every
2534 time you put it back, I will come in and take it out again. I'm
2535 sorry. This field does not belong here. We fill it with a 0 so
2536 it compares the same but is not a reasonable time. --
2538 internal_f.f_timdat = 0;
2540 if (bfd_get_symcount (abfd) != 0)
2542 /* The ECOFF f_nsyms field is not actually the number of
2543 symbols, it's the size of symbolic information header. */
2544 internal_f.f_nsyms = external_hdr_size;
2545 internal_f.f_symptr = ecoff_data (abfd)->sym_filepos;
2549 internal_f.f_nsyms = 0;
2550 internal_f.f_symptr = 0;
2553 internal_f.f_opthdr = aoutsz;
2555 internal_f.f_flags = F_LNNO;
2556 if (reloc_size == 0)
2557 internal_f.f_flags |= F_RELFLG;
2558 if (bfd_get_symcount (abfd) == 0)
2559 internal_f.f_flags |= F_LSYMS;
2560 if (abfd->flags & EXEC_P)
2561 internal_f.f_flags |= F_EXEC;
2563 if (bfd_little_endian (abfd))
2564 internal_f.f_flags |= F_AR32WR;
2566 internal_f.f_flags |= F_AR32W;
2568 /* Set up the ``optional'' header. */
2569 if ((abfd->flags & D_PAGED) != 0)
2570 internal_a.magic = ECOFF_AOUT_ZMAGIC;
2572 internal_a.magic = ECOFF_AOUT_OMAGIC;
2574 /* FIXME: Is this really correct? */
2575 internal_a.vstamp = symhdr->vstamp;
2577 /* At least on Ultrix, these have to be rounded to page boundaries.
2578 FIXME: Is this true on other platforms? */
2579 if ((abfd->flags & D_PAGED) != 0)
2581 internal_a.tsize = (text_size + round - 1) &~ (round - 1);
2582 internal_a.text_start = text_start &~ (round - 1);
2583 internal_a.dsize = (data_size + round - 1) &~ (round - 1);
2584 internal_a.data_start = data_start &~ (round - 1);
2588 internal_a.tsize = text_size;
2589 internal_a.text_start = text_start;
2590 internal_a.dsize = data_size;
2591 internal_a.data_start = data_start;
2594 /* On Ultrix, the initial portions of the .sbss and .bss segments
2595 are at the end of the data section. The bsize field in the
2596 optional header records how many bss bytes are required beyond
2597 those in the data section. The value is not rounded to a page
2599 if (bss_size < internal_a.dsize - data_size)
2602 bss_size -= internal_a.dsize - data_size;
2603 internal_a.bsize = bss_size;
2604 internal_a.bss_start = internal_a.data_start + internal_a.dsize;
2606 internal_a.entry = bfd_get_start_address (abfd);
2608 internal_a.gp_value = ecoff_data (abfd)->gp;
2610 internal_a.gprmask = ecoff_data (abfd)->gprmask;
2611 internal_a.fprmask = ecoff_data (abfd)->fprmask;
2612 for (i = 0; i < 4; i++)
2613 internal_a.cprmask[i] = ecoff_data (abfd)->cprmask[i];
2615 /* Let the backend adjust the headers if necessary. */
2616 if (backend->adjust_headers)
2618 if (! (*backend->adjust_headers) (abfd, &internal_f, &internal_a))
2622 /* Write out the file header and the optional header. */
2623 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
2626 bfd_coff_swap_filehdr_out (abfd, (void *) &internal_f, buff);
2627 if (bfd_bwrite (buff, filhsz, abfd) != filhsz)
2630 bfd_coff_swap_aouthdr_out (abfd, (void *) &internal_a, buff);
2631 if (bfd_bwrite (buff, aoutsz, abfd) != aoutsz)
2634 /* Build the external symbol information. This must be done before
2635 writing out the relocs so that we know the symbol indices. We
2636 don't do this if this BFD was created by the backend linker,
2637 since it will have already handled the symbols and relocs. */
2638 if (! ecoff_data (abfd)->linker)
2640 symhdr->iextMax = 0;
2641 symhdr->issExtMax = 0;
2642 debug->external_ext = debug->external_ext_end = NULL;
2643 debug->ssext = debug->ssext_end = NULL;
2644 if (! bfd_ecoff_debug_externals (abfd, debug, &backend->debug_swap,
2645 (abfd->flags & EXEC_P) == 0,
2646 ecoff_get_extr, ecoff_set_index))
2649 /* Write out the relocs. */
2650 for (current = abfd->sections;
2652 current = current->next)
2654 arelent **reloc_ptr_ptr;
2655 arelent **reloc_end;
2659 if (current->reloc_count == 0)
2662 amt = current->reloc_count * external_reloc_size;
2663 reloc_buff = bfd_alloc (abfd, amt);
2664 if (reloc_buff == NULL)
2667 reloc_ptr_ptr = current->orelocation;
2668 reloc_end = reloc_ptr_ptr + current->reloc_count;
2669 out_ptr = (char *) reloc_buff;
2672 reloc_ptr_ptr < reloc_end;
2673 reloc_ptr_ptr++, out_ptr += external_reloc_size)
2677 struct internal_reloc in;
2679 memset ((void *) &in, 0, sizeof in);
2681 reloc = *reloc_ptr_ptr;
2682 sym = *reloc->sym_ptr_ptr;
2684 /* If the howto field has not been initialised then skip this reloc.
2685 This assumes that an error message has been issued elsewhere. */
2686 if (reloc->howto == NULL)
2689 in.r_vaddr = (reloc->address
2690 + bfd_get_section_vma (abfd, current));
2691 in.r_type = reloc->howto->type;
2693 if ((sym->flags & BSF_SECTION_SYM) == 0)
2695 in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr);
2709 { _TEXT, RELOC_SECTION_TEXT },
2710 { _RDATA, RELOC_SECTION_RDATA },
2711 { _DATA, RELOC_SECTION_DATA },
2712 { _SDATA, RELOC_SECTION_SDATA },
2713 { _SBSS, RELOC_SECTION_SBSS },
2714 { _BSS, RELOC_SECTION_BSS },
2715 { _INIT, RELOC_SECTION_INIT },
2716 { _LIT8, RELOC_SECTION_LIT8 },
2717 { _LIT4, RELOC_SECTION_LIT4 },
2718 { _XDATA, RELOC_SECTION_XDATA },
2719 { _PDATA, RELOC_SECTION_PDATA },
2720 { _FINI, RELOC_SECTION_FINI },
2721 { _LITA, RELOC_SECTION_LITA },
2722 { "*ABS*", RELOC_SECTION_ABS },
2723 { _RCONST, RELOC_SECTION_RCONST }
2726 name = bfd_get_section_name (abfd, bfd_get_section (sym));
2728 for (j = 0; j < ARRAY_SIZE (section_symndx); j++)
2729 if (streq (name, section_symndx[j].name))
2731 in.r_symndx = section_symndx[j].r_symndx;
2735 if (j == ARRAY_SIZE (section_symndx))
2740 (*adjust_reloc_out) (abfd, reloc, &in);
2742 (*swap_reloc_out) (abfd, &in, (void *) out_ptr);
2745 if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0)
2747 amt = current->reloc_count * external_reloc_size;
2748 if (bfd_bwrite (reloc_buff, amt, abfd) != amt)
2750 bfd_release (abfd, reloc_buff);
2754 /* Write out the symbolic debugging information. */
2755 if (bfd_get_symcount (abfd) > 0)
2757 /* Write out the debugging information. */
2758 if (! bfd_ecoff_write_debug (abfd, debug, &backend->debug_swap,
2759 ecoff_data (abfd)->sym_filepos))
2764 /* The .bss section of a demand paged executable must receive an
2765 entire page. If there are symbols, the symbols will start on the
2766 next page. If there are no symbols, we must fill out the page by
2768 if (bfd_get_symcount (abfd) == 0
2769 && (abfd->flags & EXEC_P) != 0
2770 && (abfd->flags & D_PAGED) != 0)
2774 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2777 if (bfd_bread (&c, (bfd_size_type) 1, abfd) == 0)
2779 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2782 if (bfd_bwrite (&c, (bfd_size_type) 1, abfd) != 1)
2786 if (reloc_buff != NULL)
2787 bfd_release (abfd, reloc_buff);
2792 if (reloc_buff != NULL)
2793 bfd_release (abfd, reloc_buff);
2799 /* Archive handling. ECOFF uses what appears to be a unique type of
2800 archive header (armap). The byte ordering of the armap and the
2801 contents are encoded in the name of the armap itself. At least for
2802 now, we only support archives with the same byte ordering in the
2803 armap and the contents.
2805 The first four bytes in the armap are the number of symbol
2806 definitions. This is always a power of two.
2808 This is followed by the symbol definitions. Each symbol definition
2809 occupies 8 bytes. The first four bytes are the offset from the
2810 start of the armap strings to the null-terminated string naming
2811 this symbol. The second four bytes are the file offset to the
2812 archive member which defines this symbol. If the second four bytes
2813 are 0, then this is not actually a symbol definition, and it should
2816 The symbols are hashed into the armap with a closed hashing scheme.
2817 See the functions below for the details of the algorithm.
2819 After the symbol definitions comes four bytes holding the size of
2820 the string table, followed by the string table itself. */
2822 /* The name of an archive headers looks like this:
2823 __________E[BL]E[BL]_ (with a trailing space).
2824 The trailing space is changed to an X if the archive is changed to
2825 indicate that the armap is out of date.
2827 The Alpha seems to use ________64E[BL]E[BL]_. */
2829 #define ARMAP_BIG_ENDIAN 'B'
2830 #define ARMAP_LITTLE_ENDIAN 'L'
2831 #define ARMAP_MARKER 'E'
2832 #define ARMAP_START_LENGTH 10
2833 #define ARMAP_HEADER_MARKER_INDEX 10
2834 #define ARMAP_HEADER_ENDIAN_INDEX 11
2835 #define ARMAP_OBJECT_MARKER_INDEX 12
2836 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2837 #define ARMAP_END_INDEX 14
2838 #define ARMAP_END "_ "
2840 /* This is a magic number used in the hashing algorithm. */
2841 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2843 /* This returns the hash value to use for a string. It also sets
2844 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2845 is the number of entries in the hash table, and HLOG is the log
2849 ecoff_armap_hash (const char *s,
2850 unsigned int *rehash,
2860 hash = ((hash >> 27) | (hash << 5)) + *s++;
2861 hash *= ARMAP_HASH_MAGIC;
2862 *rehash = (hash & (size - 1)) | 1;
2863 return hash >> (32 - hlog);
2866 /* Read in the armap. */
2869 _bfd_ecoff_slurp_armap (bfd *abfd)
2873 struct areltdata *mapdata;
2874 bfd_size_type parsed_size;
2876 struct artdata *ardata;
2883 /* Get the name of the first element. */
2884 i = bfd_bread ((void *) nextname, (bfd_size_type) 16, abfd);
2890 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
2893 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2894 standard COFF armap. We could move the ECOFF armap stuff into
2895 bfd_slurp_armap, but that seems inappropriate since no other
2896 target uses this format. Instead, we check directly for a COFF
2898 if (CONST_STRNEQ (nextname, "/ "))
2899 return bfd_slurp_armap (abfd);
2901 /* See if the first element is an armap. */
2902 if (! strneq (nextname, ecoff_backend (abfd)->armap_start, ARMAP_START_LENGTH)
2903 || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER
2904 || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
2905 && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
2906 || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER
2907 || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
2908 && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
2909 || ! strneq (nextname + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1))
2911 bfd_has_map (abfd) = FALSE;
2915 /* Make sure we have the right byte ordering. */
2916 if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
2917 ^ (bfd_header_big_endian (abfd)))
2918 || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
2919 ^ (bfd_big_endian (abfd))))
2921 bfd_set_error (bfd_error_wrong_format);
2925 /* Read in the armap. */
2926 ardata = bfd_ardata (abfd);
2927 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
2928 if (mapdata == NULL)
2930 parsed_size = mapdata->parsed_size;
2933 raw_armap = (char *) bfd_alloc (abfd, parsed_size);
2934 if (raw_armap == NULL)
2937 if (bfd_bread ((void *) raw_armap, parsed_size, abfd) != parsed_size)
2939 if (bfd_get_error () != bfd_error_system_call)
2940 bfd_set_error (bfd_error_malformed_archive);
2941 bfd_release (abfd, (void *) raw_armap);
2945 ardata->tdata = (void *) raw_armap;
2947 count = H_GET_32 (abfd, raw_armap);
2949 ardata->symdef_count = 0;
2950 ardata->cache = NULL;
2952 /* This code used to overlay the symdefs over the raw archive data,
2953 but that doesn't work on a 64 bit host. */
2954 stringbase = raw_armap + count * 8 + 8;
2956 #ifdef CHECK_ARMAP_HASH
2960 /* Double check that I have the hashing algorithm right by making
2961 sure that every symbol can be looked up successfully. */
2963 for (i = 1; i < count; i <<= 1)
2965 BFD_ASSERT (i == count);
2967 raw_ptr = raw_armap + 4;
2968 for (i = 0; i < count; i++, raw_ptr += 8)
2970 unsigned int name_offset, file_offset;
2971 unsigned int hash, rehash, srch;
2973 name_offset = H_GET_32 (abfd, raw_ptr);
2974 file_offset = H_GET_32 (abfd, (raw_ptr + 4));
2975 if (file_offset == 0)
2977 hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count,
2982 /* See if we can rehash to this location. */
2983 for (srch = (hash + rehash) & (count - 1);
2984 srch != hash && srch != i;
2985 srch = (srch + rehash) & (count - 1))
2986 BFD_ASSERT (H_GET_32 (abfd, (raw_armap + 8 + srch * 8)) != 0);
2987 BFD_ASSERT (srch == i);
2991 #endif /* CHECK_ARMAP_HASH */
2993 raw_ptr = raw_armap + 4;
2994 for (i = 0; i < count; i++, raw_ptr += 8)
2995 if (H_GET_32 (abfd, (raw_ptr + 4)) != 0)
2996 ++ardata->symdef_count;
2998 amt = ardata->symdef_count;
2999 amt *= sizeof (carsym);
3000 symdef_ptr = (carsym *) bfd_alloc (abfd, amt);
3004 ardata->symdefs = symdef_ptr;
3006 raw_ptr = raw_armap + 4;
3007 for (i = 0; i < count; i++, raw_ptr += 8)
3009 unsigned int name_offset, file_offset;
3011 file_offset = H_GET_32 (abfd, (raw_ptr + 4));
3012 if (file_offset == 0)
3014 name_offset = H_GET_32 (abfd, raw_ptr);
3015 symdef_ptr->name = stringbase + name_offset;
3016 symdef_ptr->file_offset = file_offset;
3020 ardata->first_file_filepos = bfd_tell (abfd);
3021 /* Pad to an even boundary. */
3022 ardata->first_file_filepos += ardata->first_file_filepos % 2;
3024 bfd_has_map (abfd) = TRUE;
3029 /* Write out an armap. */
3032 _bfd_ecoff_write_armap (bfd *abfd,
3033 unsigned int elength,
3035 unsigned int orl_count,
3038 unsigned int hashsize, hashlog;
3039 bfd_size_type symdefsize;
3041 unsigned int stringsize;
3042 unsigned int mapsize;
3045 struct stat statbuf;
3048 bfd_byte *hashtable;
3052 /* Ultrix appears to use as a hash table size the least power of two
3053 greater than twice the number of entries. */
3054 for (hashlog = 0; ((unsigned int) 1 << hashlog) <= 2 * orl_count; hashlog++)
3056 hashsize = 1 << hashlog;
3058 symdefsize = hashsize * 8;
3060 stringsize = stridx + padit;
3062 /* Include 8 bytes to store symdefsize and stringsize in output. */
3063 mapsize = symdefsize + stringsize + 8;
3065 firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength;
3067 memset ((void *) &hdr, 0, sizeof hdr);
3069 /* Work out the ECOFF armap name. */
3070 strcpy (hdr.ar_name, ecoff_backend (abfd)->armap_start);
3071 hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER;
3072 hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] =
3073 (bfd_header_big_endian (abfd)
3075 : ARMAP_LITTLE_ENDIAN);
3076 hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER;
3077 hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] =
3078 bfd_big_endian (abfd) ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN;
3079 memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1);
3081 /* Write the timestamp of the archive header to be just a little bit
3082 later than the timestamp of the file, otherwise the linker will
3083 complain that the index is out of date. Actually, the Ultrix
3084 linker just checks the archive name; the GNU linker may check the
3086 stat (abfd->filename, &statbuf);
3087 _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
3088 (long) (statbuf.st_mtime + 60));
3090 /* The DECstation uses zeroes for the uid, gid and mode of the
3092 hdr.ar_uid[0] = '0';
3093 hdr.ar_gid[0] = '0';
3094 /* Building gcc ends up extracting the armap as a file - twice. */
3095 hdr.ar_mode[0] = '6';
3096 hdr.ar_mode[1] = '4';
3097 hdr.ar_mode[2] = '4';
3099 _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld", mapsize);
3101 hdr.ar_fmag[0] = '`';
3102 hdr.ar_fmag[1] = '\012';
3104 /* Turn all null bytes in the header into spaces. */
3105 for (i = 0; i < sizeof (struct ar_hdr); i++)
3106 if (((char *) (&hdr))[i] == '\0')
3107 (((char *) (&hdr))[i]) = ' ';
3109 if (bfd_bwrite ((void *) &hdr, (bfd_size_type) sizeof (struct ar_hdr), abfd)
3110 != sizeof (struct ar_hdr))
3113 H_PUT_32 (abfd, hashsize, temp);
3114 if (bfd_bwrite ((void *) temp, (bfd_size_type) 4, abfd) != 4)
3117 hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize);
3121 current = abfd->archive_head;
3123 for (i = 0; i < orl_count; i++)
3125 unsigned int hash, rehash = 0;
3127 /* Advance firstreal to the file position of this archive
3129 if (map[i].u.abfd != last_elt)
3133 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
3134 firstreal += firstreal % 2;
3135 current = current->archive_next;
3137 while (current != map[i].u.abfd);
3142 hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog);
3143 if (H_GET_32 (abfd, (hashtable + (hash * 8) + 4)) != 0)
3147 /* The desired slot is already taken. */
3148 for (srch = (hash + rehash) & (hashsize - 1);
3150 srch = (srch + rehash) & (hashsize - 1))
3151 if (H_GET_32 (abfd, (hashtable + (srch * 8) + 4)) == 0)
3154 BFD_ASSERT (srch != hash);
3159 H_PUT_32 (abfd, map[i].namidx, (hashtable + hash * 8));
3160 H_PUT_32 (abfd, firstreal, (hashtable + hash * 8 + 4));
3163 if (bfd_bwrite ((void *) hashtable, symdefsize, abfd) != symdefsize)
3166 bfd_release (abfd, hashtable);
3168 /* Now write the strings. */
3169 H_PUT_32 (abfd, stringsize, temp);
3170 if (bfd_bwrite ((void *) temp, (bfd_size_type) 4, abfd) != 4)
3172 for (i = 0; i < orl_count; i++)
3176 len = strlen (*map[i].name) + 1;
3177 if (bfd_bwrite ((void *) (*map[i].name), len, abfd) != len)
3181 /* The spec sez this should be a newline. But in order to be
3182 bug-compatible for DECstation ar we use a null. */
3185 if (bfd_bwrite ("", (bfd_size_type) 1, abfd) != 1)
3192 /* ECOFF linker code. */
3194 /* Routine to create an entry in an ECOFF link hash table. */
3196 static struct bfd_hash_entry *
3197 ecoff_link_hash_newfunc (struct bfd_hash_entry *entry,
3198 struct bfd_hash_table *table,
3201 struct ecoff_link_hash_entry *ret = (struct ecoff_link_hash_entry *) entry;
3203 /* Allocate the structure if it has not already been allocated by a
3206 ret = ((struct ecoff_link_hash_entry *)
3207 bfd_hash_allocate (table, sizeof (struct ecoff_link_hash_entry)));
3211 /* Call the allocation method of the superclass. */
3212 ret = ((struct ecoff_link_hash_entry *)
3213 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3218 /* Set local fields. */
3224 memset ((void *) &ret->esym, 0, sizeof ret->esym);
3226 return (struct bfd_hash_entry *) ret;
3229 /* Create an ECOFF link hash table. */
3231 struct bfd_link_hash_table *
3232 _bfd_ecoff_bfd_link_hash_table_create (bfd *abfd)
3234 struct ecoff_link_hash_table *ret;
3235 bfd_size_type amt = sizeof (struct ecoff_link_hash_table);
3237 ret = (struct ecoff_link_hash_table *) bfd_malloc (amt);
3240 if (!_bfd_link_hash_table_init (&ret->root, abfd,
3241 ecoff_link_hash_newfunc,
3242 sizeof (struct ecoff_link_hash_entry)))
3250 /* Look up an entry in an ECOFF link hash table. */
3252 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3253 ((struct ecoff_link_hash_entry *) \
3254 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3256 /* Get the ECOFF link hash table from the info structure. This is
3259 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3261 /* Add the external symbols of an object file to the global linker
3262 hash table. The external symbols and strings we are passed are
3263 just allocated on the stack, and will be discarded. We must
3264 explicitly save any information we may need later on in the link.
3265 We do not want to read the external symbol information again. */
3268 ecoff_link_add_externals (bfd *abfd,
3269 struct bfd_link_info *info,
3270 void * external_ext,
3273 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3274 void (* const swap_ext_in) (bfd *, void *, EXTR *)
3275 = backend->debug_swap.swap_ext_in;
3276 bfd_size_type external_ext_size = backend->debug_swap.external_ext_size;
3277 unsigned long ext_count;
3278 struct bfd_link_hash_entry **sym_hash;
3283 ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
3286 amt *= sizeof (struct bfd_link_hash_entry *);
3287 sym_hash = (struct bfd_link_hash_entry **) bfd_alloc (abfd, amt);
3290 ecoff_data (abfd)->sym_hashes = (struct ecoff_link_hash_entry **) sym_hash;
3292 ext_ptr = (char *) external_ext;
3293 ext_end = ext_ptr + ext_count * external_ext_size;
3294 for (; ext_ptr < ext_end; ext_ptr += external_ext_size, sym_hash++)
3301 struct ecoff_link_hash_entry *h;
3305 (*swap_ext_in) (abfd, (void *) ext_ptr, &esym);
3307 /* Skip debugging symbols. */
3309 switch (esym.asym.st)
3325 /* Get the information for this symbol. */
3326 value = esym.asym.value;
3327 switch (esym.asym.sc)
3347 section = bfd_make_section_old_way (abfd, _TEXT);
3348 value -= section->vma;
3351 section = bfd_make_section_old_way (abfd, _DATA);
3352 value -= section->vma;
3355 section = bfd_make_section_old_way (abfd, _BSS);
3356 value -= section->vma;
3359 section = bfd_abs_section_ptr;
3362 section = bfd_und_section_ptr;
3365 section = bfd_make_section_old_way (abfd, _SDATA);
3366 value -= section->vma;
3369 section = bfd_make_section_old_way (abfd, _SBSS);
3370 value -= section->vma;
3373 section = bfd_make_section_old_way (abfd, _RDATA);
3374 value -= section->vma;
3377 if (value > ecoff_data (abfd)->gp_size)
3379 section = bfd_com_section_ptr;
3384 if (ecoff_scom_section.name == NULL)
3386 /* Initialize the small common section. */
3387 ecoff_scom_section.name = SCOMMON;
3388 ecoff_scom_section.flags = SEC_IS_COMMON;
3389 ecoff_scom_section.output_section = &ecoff_scom_section;
3390 ecoff_scom_section.symbol = &ecoff_scom_symbol;
3391 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
3392 ecoff_scom_symbol.name = SCOMMON;
3393 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
3394 ecoff_scom_symbol.section = &ecoff_scom_section;
3395 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
3397 section = &ecoff_scom_section;
3400 section = bfd_und_section_ptr;
3403 section = bfd_make_section_old_way (abfd, _INIT);
3404 value -= section->vma;
3407 section = bfd_make_section_old_way (abfd, _FINI);
3408 value -= section->vma;
3411 section = bfd_make_section_old_way (abfd, _RCONST);
3412 value -= section->vma;
3416 if (section == NULL)
3419 name = ssext + esym.asym.iss;
3421 if (! (_bfd_generic_link_add_one_symbol
3423 (flagword) (esym.weakext ? BSF_WEAK : BSF_GLOBAL),
3424 section, value, NULL, TRUE, TRUE, sym_hash)))
3427 h = (struct ecoff_link_hash_entry *) *sym_hash;
3429 /* If we are building an ECOFF hash table, save the external
3430 symbol information. */
3431 if (bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd))
3434 || (! bfd_is_und_section (section)
3435 && (! bfd_is_com_section (section)
3436 || (h->root.type != bfd_link_hash_defined
3437 && h->root.type != bfd_link_hash_defweak))))
3443 /* Remember whether this symbol was small undefined. */
3444 if (esym.asym.sc == scSUndefined)
3447 /* If this symbol was ever small undefined, it needs to wind
3448 up in a GP relative section. We can't control the
3449 section of a defined symbol, but we can control the
3450 section of a common symbol. This case is actually needed
3451 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
3453 && h->root.type == bfd_link_hash_common
3454 && streq (h->root.u.c.p->section->name, SCOMMON))
3456 h->root.u.c.p->section = bfd_make_section_old_way (abfd,
3458 h->root.u.c.p->section->flags = SEC_ALLOC;
3459 if (h->esym.asym.sc == scCommon)
3460 h->esym.asym.sc = scSCommon;
3468 /* Add symbols from an ECOFF object file to the global linker hash
3472 ecoff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
3475 bfd_size_type external_ext_size;
3476 void * external_ext = NULL;
3477 bfd_size_type esize;
3481 if (! ecoff_slurp_symbolic_header (abfd))
3484 /* If there are no symbols, we don't want it. */
3485 if (bfd_get_symcount (abfd) == 0)
3488 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3490 /* Read in the external symbols and external strings. */
3491 external_ext_size = ecoff_backend (abfd)->debug_swap.external_ext_size;
3492 esize = symhdr->iextMax * external_ext_size;
3493 external_ext = bfd_malloc (esize);
3494 if (external_ext == NULL && esize != 0)
3497 if (bfd_seek (abfd, (file_ptr) symhdr->cbExtOffset, SEEK_SET) != 0
3498 || bfd_bread (external_ext, esize, abfd) != esize)
3501 ssext = (char *) bfd_malloc ((bfd_size_type) symhdr->issExtMax);
3502 if (ssext == NULL && symhdr->issExtMax != 0)
3505 if (bfd_seek (abfd, (file_ptr) symhdr->cbSsExtOffset, SEEK_SET) != 0
3506 || (bfd_bread (ssext, (bfd_size_type) symhdr->issExtMax, abfd)
3507 != (bfd_size_type) symhdr->issExtMax))
3510 result = ecoff_link_add_externals (abfd, info, external_ext, ssext);
3514 if (external_ext != NULL)
3515 free (external_ext);
3521 if (external_ext != NULL)
3522 free (external_ext);
3526 /* This is called if we used _bfd_generic_link_add_archive_symbols
3527 because we were not dealing with an ECOFF archive. */
3530 ecoff_link_check_archive_element (bfd *abfd,
3531 struct bfd_link_info *info,
3532 struct bfd_link_hash_entry *h,
3534 bfd_boolean *pneeded)
3538 /* Unlike the generic linker, we do not pull in elements because
3539 of common symbols. */
3540 if (h->type != bfd_link_hash_undefined)
3543 /* Include this element. */
3544 if (!(*info->callbacks->add_archive_element) (info, abfd, name, &abfd))
3548 return ecoff_link_add_object_symbols (abfd, info);
3551 /* Add the symbols from an archive file to the global hash table.
3552 This looks through the undefined symbols, looks each one up in the
3553 archive hash table, and adds any associated object file. We do not
3554 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3555 already have a hash table, so there is no reason to construct
3559 ecoff_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
3561 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3562 const bfd_byte *raw_armap;
3563 struct bfd_link_hash_entry **pundef;
3564 unsigned int armap_count;
3565 unsigned int armap_log;
3567 const bfd_byte *hashtable;
3568 const char *stringbase;
3570 if (! bfd_has_map (abfd))
3572 /* An empty archive is a special case. */
3573 if (bfd_openr_next_archived_file (abfd, NULL) == NULL)
3575 bfd_set_error (bfd_error_no_armap);
3579 /* If we don't have any raw data for this archive, as can happen on
3580 Irix 4.0.5F, we call the generic routine.
3581 FIXME: We should be more clever about this, since someday tdata
3582 may get to something for a generic archive. */
3583 raw_armap = (const bfd_byte *) bfd_ardata (abfd)->tdata;
3584 if (raw_armap == NULL)
3585 return (_bfd_generic_link_add_archive_symbols
3586 (abfd, info, ecoff_link_check_archive_element));
3588 armap_count = H_GET_32 (abfd, raw_armap);
3591 for (i = 1; i < armap_count; i <<= 1)
3593 BFD_ASSERT (i == armap_count);
3595 hashtable = raw_armap + 4;
3596 stringbase = (const char *) raw_armap + armap_count * 8 + 8;
3598 /* Look through the list of undefined symbols. */
3599 pundef = &info->hash->undefs;
3600 while (*pundef != NULL)
3602 struct bfd_link_hash_entry *h;
3603 unsigned int hash, rehash = 0;
3604 unsigned int file_offset;
3610 /* When a symbol is defined, it is not necessarily removed from
3612 if (h->type != bfd_link_hash_undefined
3613 && h->type != bfd_link_hash_common)
3615 /* Remove this entry from the list, for general cleanliness
3616 and because we are going to look through the list again
3617 if we search any more libraries. We can't remove the
3618 entry if it is the tail, because that would lose any
3619 entries we add to the list later on. */
3620 if (*pundef != info->hash->undefs_tail)
3621 *pundef = (*pundef)->u.undef.next;
3623 pundef = &(*pundef)->u.undef.next;
3627 /* Native ECOFF linkers do not pull in archive elements merely
3628 to satisfy common definitions, so neither do we. We leave
3629 them on the list, though, in case we are linking against some
3630 other object format. */
3631 if (h->type != bfd_link_hash_undefined)
3633 pundef = &(*pundef)->u.undef.next;
3637 /* Look for this symbol in the archive hash table. */
3638 hash = ecoff_armap_hash (h->root.string, &rehash, armap_count,
3641 file_offset = H_GET_32 (abfd, hashtable + (hash * 8) + 4);
3642 if (file_offset == 0)
3644 /* Nothing in this slot. */
3645 pundef = &(*pundef)->u.undef.next;
3649 name = stringbase + H_GET_32 (abfd, hashtable + (hash * 8));
3650 if (name[0] != h->root.string[0]
3651 || ! streq (name, h->root.string))
3656 /* That was the wrong symbol. Try rehashing. */
3658 for (srch = (hash + rehash) & (armap_count - 1);
3660 srch = (srch + rehash) & (armap_count - 1))
3662 file_offset = H_GET_32 (abfd, hashtable + (srch * 8) + 4);
3663 if (file_offset == 0)
3665 name = stringbase + H_GET_32 (abfd, hashtable + (srch * 8));
3666 if (name[0] == h->root.string[0]
3667 && streq (name, h->root.string))
3676 pundef = &(*pundef)->u.undef.next;
3683 element = (*backend->get_elt_at_filepos) (abfd, (file_ptr) file_offset);
3684 if (element == NULL)
3687 if (! bfd_check_format (element, bfd_object))
3690 /* Unlike the generic linker, we know that this element provides
3691 a definition for an undefined symbol and we know that we want
3692 to include it. We don't need to check anything. */
3693 if (!(*info->callbacks
3694 ->add_archive_element) (info, element, name, &element))
3696 if (! ecoff_link_add_object_symbols (element, info))
3699 pundef = &(*pundef)->u.undef.next;
3705 /* Given an ECOFF BFD, add symbols to the global hash table as
3709 _bfd_ecoff_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
3711 switch (bfd_get_format (abfd))
3714 return ecoff_link_add_object_symbols (abfd, info);
3716 return ecoff_link_add_archive_symbols (abfd, info);
3718 bfd_set_error (bfd_error_wrong_format);
3724 /* ECOFF final link routines. */
3726 /* Structure used to pass information to ecoff_link_write_external. */
3731 struct bfd_link_info *info;
3734 /* Accumulate the debugging information for an input BFD into the
3735 output BFD. This must read in the symbolic information of the
3739 ecoff_final_link_debug_accumulate (bfd *output_bfd,
3741 struct bfd_link_info *info,
3744 struct ecoff_debug_info * const debug = &ecoff_data (input_bfd)->debug_info;
3745 const struct ecoff_debug_swap * const swap =
3746 &ecoff_backend (input_bfd)->debug_swap;
3747 HDRR *symhdr = &debug->symbolic_header;
3750 #define READ(ptr, offset, count, size, type) \
3751 if (symhdr->count == 0) \
3752 debug->ptr = NULL; \
3755 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
3756 debug->ptr = (type) bfd_malloc (amt); \
3757 if (debug->ptr == NULL) \
3760 goto return_something; \
3762 if (bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
3763 || bfd_bread (debug->ptr, amt, input_bfd) != amt) \
3766 goto return_something; \
3770 /* If raw_syments is not NULL, then the data was already by read by
3771 _bfd_ecoff_slurp_symbolic_info. */
3772 if (ecoff_data (input_bfd)->raw_syments == NULL)
3774 READ (line, cbLineOffset, cbLine, sizeof (unsigned char),
3776 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
3777 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
3778 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
3779 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
3780 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
3782 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
3783 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
3784 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
3788 /* We do not read the external strings or the external symbols. */
3790 ret = (bfd_ecoff_debug_accumulate
3791 (handle, output_bfd, &ecoff_data (output_bfd)->debug_info,
3792 &ecoff_backend (output_bfd)->debug_swap,
3793 input_bfd, debug, swap, info));
3796 if (ecoff_data (input_bfd)->raw_syments == NULL)
3798 if (debug->line != NULL)
3800 if (debug->external_dnr != NULL)
3801 free (debug->external_dnr);
3802 if (debug->external_pdr != NULL)
3803 free (debug->external_pdr);
3804 if (debug->external_sym != NULL)
3805 free (debug->external_sym);
3806 if (debug->external_opt != NULL)
3807 free (debug->external_opt);
3808 if (debug->external_aux != NULL)
3809 free (debug->external_aux);
3810 if (debug->ss != NULL)
3812 if (debug->external_fdr != NULL)
3813 free (debug->external_fdr);
3814 if (debug->external_rfd != NULL)
3815 free (debug->external_rfd);
3817 /* Make sure we don't accidentally follow one of these pointers
3818 into freed memory. */
3820 debug->external_dnr = NULL;
3821 debug->external_pdr = NULL;
3822 debug->external_sym = NULL;
3823 debug->external_opt = NULL;
3824 debug->external_aux = NULL;
3826 debug->external_fdr = NULL;
3827 debug->external_rfd = NULL;
3833 /* Relocate and write an ECOFF section into an ECOFF output file. */
3836 ecoff_indirect_link_order (bfd *output_bfd,
3837 struct bfd_link_info *info,
3838 asection *output_section,
3839 struct bfd_link_order *link_order)
3841 asection *input_section;
3843 bfd_byte *contents = NULL;
3844 bfd_size_type external_reloc_size;
3845 bfd_size_type external_relocs_size;
3846 void * external_relocs = NULL;
3848 BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0);
3850 input_section = link_order->u.indirect.section;
3851 input_bfd = input_section->owner;
3852 if (input_section->size == 0)
3855 BFD_ASSERT (input_section->output_section == output_section);
3856 BFD_ASSERT (input_section->output_offset == link_order->offset);
3857 BFD_ASSERT (input_section->size == link_order->size);
3859 /* Get the section contents. */
3860 if (!bfd_malloc_and_get_section (input_bfd, input_section, &contents))
3863 /* Get the relocs. If we are relaxing MIPS code, they will already
3864 have been read in. Otherwise, we read them in now. */
3865 external_reloc_size = ecoff_backend (input_bfd)->external_reloc_size;
3866 external_relocs_size = external_reloc_size * input_section->reloc_count;
3868 external_relocs = bfd_malloc (external_relocs_size);
3869 if (external_relocs == NULL && external_relocs_size != 0)
3872 if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
3873 || (bfd_bread (external_relocs, external_relocs_size, input_bfd)
3874 != external_relocs_size))
3877 /* Relocate the section contents. */
3878 if (! ((*ecoff_backend (input_bfd)->relocate_section)
3879 (output_bfd, info, input_bfd, input_section, contents,
3883 /* Write out the relocated section. */
3884 if (! bfd_set_section_contents (output_bfd,
3887 input_section->output_offset,
3888 input_section->size))
3891 /* If we are producing relocatable output, the relocs were
3892 modified, and we write them out now. We use the reloc_count
3893 field of output_section to keep track of the number of relocs we
3894 have output so far. */
3895 if (info->relocatable)
3897 file_ptr pos = (output_section->rel_filepos
3898 + output_section->reloc_count * external_reloc_size);
3899 if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
3900 || (bfd_bwrite (external_relocs, external_relocs_size, output_bfd)
3901 != external_relocs_size))
3903 output_section->reloc_count += input_section->reloc_count;
3906 if (contents != NULL)
3908 if (external_relocs != NULL)
3909 free (external_relocs);
3913 if (contents != NULL)
3915 if (external_relocs != NULL)
3916 free (external_relocs);
3920 /* Generate a reloc when linking an ECOFF file. This is a reloc
3921 requested by the linker, and does come from any input file. This
3922 is used to build constructor and destructor tables when linking
3926 ecoff_reloc_link_order (bfd *output_bfd,
3927 struct bfd_link_info *info,
3928 asection *output_section,
3929 struct bfd_link_order *link_order)
3931 enum bfd_link_order_type type;
3935 struct internal_reloc in;
3936 bfd_size_type external_reloc_size;
3941 type = link_order->type;
3943 addend = link_order->u.reloc.p->addend;
3945 /* We set up an arelent to pass to the backend adjust_reloc_out
3947 rel.address = link_order->offset;
3949 rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
3952 bfd_set_error (bfd_error_bad_value);
3956 if (type == bfd_section_reloc_link_order)
3958 section = link_order->u.reloc.p->u.section;
3959 rel.sym_ptr_ptr = section->symbol_ptr_ptr;
3963 struct bfd_link_hash_entry *h;
3965 /* Treat a reloc against a defined symbol as though it were
3966 actually against the section. */
3967 h = bfd_wrapped_link_hash_lookup (output_bfd, info,
3968 link_order->u.reloc.p->u.name,
3969 FALSE, FALSE, FALSE);
3971 && (h->type == bfd_link_hash_defined
3972 || h->type == bfd_link_hash_defweak))
3974 type = bfd_section_reloc_link_order;
3975 section = h->u.def.section->output_section;
3976 /* It seems that we ought to add the symbol value to the
3977 addend here, but in practice it has already been added
3978 because it was passed to constructor_callback. */
3979 addend += section->vma + h->u.def.section->output_offset;
3983 /* We can't set up a reloc against a symbol correctly,
3984 because we have no asymbol structure. Currently no
3985 adjust_reloc_out routine cares. */
3986 rel.sym_ptr_ptr = NULL;
3990 /* All ECOFF relocs are in-place. Put the addend into the object
3993 BFD_ASSERT (rel.howto->partial_inplace);
3997 bfd_reloc_status_type rstat;
4000 size = bfd_get_reloc_size (rel.howto);
4001 buf = (bfd_byte *) bfd_zmalloc (size);
4004 rstat = _bfd_relocate_contents (rel.howto, output_bfd,
4005 (bfd_vma) addend, buf);
4011 case bfd_reloc_outofrange:
4013 case bfd_reloc_overflow:
4014 if (! ((*info->callbacks->reloc_overflow)
4016 (link_order->type == bfd_section_reloc_link_order
4017 ? bfd_section_name (output_bfd, section)
4018 : link_order->u.reloc.p->u.name),
4019 rel.howto->name, addend, NULL,
4020 NULL, (bfd_vma) 0)))
4027 ok = bfd_set_section_contents (output_bfd, output_section, (void *) buf,
4028 (file_ptr) link_order->offset, size);
4036 /* Move the information into an internal_reloc structure. */
4037 in.r_vaddr = (rel.address
4038 + bfd_get_section_vma (output_bfd, output_section));
4039 in.r_type = rel.howto->type;
4041 if (type == bfd_symbol_reloc_link_order)
4043 struct ecoff_link_hash_entry *h;
4045 h = ((struct ecoff_link_hash_entry *)
4046 bfd_wrapped_link_hash_lookup (output_bfd, info,
4047 link_order->u.reloc.p->u.name,
4048 FALSE, FALSE, TRUE));
4051 in.r_symndx = h->indx;
4054 if (! ((*info->callbacks->unattached_reloc)
4055 (info, link_order->u.reloc.p->u.name, NULL,
4056 NULL, (bfd_vma) 0)))
4073 { _TEXT, RELOC_SECTION_TEXT },
4074 { _RDATA, RELOC_SECTION_RDATA },
4075 { _DATA, RELOC_SECTION_DATA },
4076 { _SDATA, RELOC_SECTION_SDATA },
4077 { _SBSS, RELOC_SECTION_SBSS },
4078 { _BSS, RELOC_SECTION_BSS },
4079 { _INIT, RELOC_SECTION_INIT },
4080 { _LIT8, RELOC_SECTION_LIT8 },
4081 { _LIT4, RELOC_SECTION_LIT4 },
4082 { _XDATA, RELOC_SECTION_XDATA },
4083 { _PDATA, RELOC_SECTION_PDATA },
4084 { _FINI, RELOC_SECTION_FINI },
4085 { _LITA, RELOC_SECTION_LITA },
4086 { "*ABS*", RELOC_SECTION_ABS },
4087 { _RCONST, RELOC_SECTION_RCONST }
4090 name = bfd_get_section_name (output_bfd, section);
4092 for (i = 0; i < ARRAY_SIZE (section_symndx); i++)
4093 if (streq (name, section_symndx[i].name))
4095 in.r_symndx = section_symndx[i].r_symndx;
4099 if (i == ARRAY_SIZE (section_symndx))
4105 /* Let the BFD backend adjust the reloc. */
4106 (*ecoff_backend (output_bfd)->adjust_reloc_out) (output_bfd, &rel, &in);
4108 /* Get some memory and swap out the reloc. */
4109 external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size;
4110 rbuf = (bfd_byte *) bfd_malloc (external_reloc_size);
4114 (*ecoff_backend (output_bfd)->swap_reloc_out) (output_bfd, &in, (void *) rbuf);
4116 pos = (output_section->rel_filepos
4117 + output_section->reloc_count * external_reloc_size);
4118 ok = (bfd_seek (output_bfd, pos, SEEK_SET) == 0
4119 && (bfd_bwrite ((void *) rbuf, external_reloc_size, output_bfd)
4120 == external_reloc_size));
4123 ++output_section->reloc_count;
4130 /* Put out information for an external symbol. These come only from
4134 ecoff_link_write_external (struct bfd_hash_entry *bh, void * data)
4136 struct ecoff_link_hash_entry *h = (struct ecoff_link_hash_entry *) bh;
4137 struct extsym_info *einfo = (struct extsym_info *) data;
4138 bfd *output_bfd = einfo->abfd;
4141 if (h->root.type == bfd_link_hash_warning)
4143 h = (struct ecoff_link_hash_entry *) h->root.u.i.link;
4144 if (h->root.type == bfd_link_hash_new)
4148 /* We need to check if this symbol is being stripped. */
4149 if (h->root.type == bfd_link_hash_undefined
4150 || h->root.type == bfd_link_hash_undefweak)
4152 else if (einfo->info->strip == strip_all
4153 || (einfo->info->strip == strip_some
4154 && bfd_hash_lookup (einfo->info->keep_hash,
4155 h->root.root.string,
4156 FALSE, FALSE) == NULL))
4161 if (strip || h->written)
4164 if (h->abfd == NULL)
4167 h->esym.cobol_main = 0;
4168 h->esym.weakext = 0;
4169 h->esym.reserved = 0;
4170 h->esym.ifd = ifdNil;
4171 h->esym.asym.value = 0;
4172 h->esym.asym.st = stGlobal;
4174 if (h->root.type != bfd_link_hash_defined
4175 && h->root.type != bfd_link_hash_defweak)
4176 h->esym.asym.sc = scAbs;
4179 asection *output_section;
4187 section_storage_classes [] =
4191 { _SDATA, scSData },
4192 { _RDATA, scRData },
4197 { _PDATA, scPData },
4198 { _XDATA, scXData },
4199 { _RCONST, scRConst }
4202 output_section = h->root.u.def.section->output_section;
4203 name = bfd_section_name (output_section->owner, output_section);
4205 for (i = 0; i < ARRAY_SIZE (section_storage_classes); i++)
4206 if (streq (name, section_storage_classes[i].name))
4208 h->esym.asym.sc = section_storage_classes[i].sc;
4212 if (i == ARRAY_SIZE (section_storage_classes))
4213 h->esym.asym.sc = scAbs;
4216 h->esym.asym.reserved = 0;
4217 h->esym.asym.index = indexNil;
4219 else if (h->esym.ifd != -1)
4221 struct ecoff_debug_info *debug;
4223 /* Adjust the FDR index for the symbol by that used for the
4225 debug = &ecoff_data (h->abfd)->debug_info;
4226 BFD_ASSERT (h->esym.ifd >= 0
4227 && h->esym.ifd < debug->symbolic_header.ifdMax);
4228 h->esym.ifd = debug->ifdmap[h->esym.ifd];
4231 switch (h->root.type)
4234 case bfd_link_hash_warning:
4235 case bfd_link_hash_new:
4237 case bfd_link_hash_undefined:
4238 case bfd_link_hash_undefweak:
4239 if (h->esym.asym.sc != scUndefined
4240 && h->esym.asym.sc != scSUndefined)
4241 h->esym.asym.sc = scUndefined;
4243 case bfd_link_hash_defined:
4244 case bfd_link_hash_defweak:
4245 if (h->esym.asym.sc == scUndefined
4246 || h->esym.asym.sc == scSUndefined)
4247 h->esym.asym.sc = scAbs;
4248 else if (h->esym.asym.sc == scCommon)
4249 h->esym.asym.sc = scBss;
4250 else if (h->esym.asym.sc == scSCommon)
4251 h->esym.asym.sc = scSBss;
4252 h->esym.asym.value = (h->root.u.def.value
4253 + h->root.u.def.section->output_section->vma
4254 + h->root.u.def.section->output_offset);
4256 case bfd_link_hash_common:
4257 if (h->esym.asym.sc != scCommon
4258 && h->esym.asym.sc != scSCommon)
4259 h->esym.asym.sc = scCommon;
4260 h->esym.asym.value = h->root.u.c.size;
4262 case bfd_link_hash_indirect:
4263 /* We ignore these symbols, since the indirected symbol is
4264 already in the hash table. */
4268 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4270 h->indx = ecoff_data (output_bfd)->debug_info.symbolic_header.iextMax;
4273 return (bfd_ecoff_debug_one_external
4274 (output_bfd, &ecoff_data (output_bfd)->debug_info,
4275 &ecoff_backend (output_bfd)->debug_swap, h->root.root.string,
4279 /* ECOFF final link routine. This looks through all the input BFDs
4280 and gathers together all the debugging information, and then
4281 processes all the link order information. This may cause it to
4282 close and reopen some input BFDs; I'll see how bad this is. */
4285 _bfd_ecoff_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
4287 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4288 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
4293 struct bfd_link_order *p;
4294 struct extsym_info einfo;
4296 /* We accumulate the debugging information counts in the symbolic
4298 symhdr = &debug->symbolic_header;
4300 symhdr->ilineMax = 0;
4304 symhdr->isymMax = 0;
4305 symhdr->ioptMax = 0;
4306 symhdr->iauxMax = 0;
4308 symhdr->issExtMax = 0;
4311 symhdr->iextMax = 0;
4313 /* We accumulate the debugging information itself in the debug_info
4316 debug->external_dnr = NULL;
4317 debug->external_pdr = NULL;
4318 debug->external_sym = NULL;
4319 debug->external_opt = NULL;
4320 debug->external_aux = NULL;
4322 debug->ssext = debug->ssext_end = NULL;
4323 debug->external_fdr = NULL;
4324 debug->external_rfd = NULL;
4325 debug->external_ext = debug->external_ext_end = NULL;
4327 handle = bfd_ecoff_debug_init (abfd, debug, &backend->debug_swap, info);
4331 /* Accumulate the debugging symbols from each input BFD. */
4332 for (input_bfd = info->input_bfds;
4334 input_bfd = input_bfd->link.next)
4338 if (bfd_get_flavour (input_bfd) == bfd_target_ecoff_flavour)
4340 /* Arbitrarily set the symbolic header vstamp to the vstamp
4341 of the first object file in the link. */
4342 if (symhdr->vstamp == 0)
4344 = ecoff_data (input_bfd)->debug_info.symbolic_header.vstamp;
4345 ret = ecoff_final_link_debug_accumulate (abfd, input_bfd, info,
4349 ret = bfd_ecoff_debug_accumulate_other (handle, abfd,
4350 debug, &backend->debug_swap,
4355 /* Combine the register masks. */
4356 ecoff_data (abfd)->gprmask |= ecoff_data (input_bfd)->gprmask;
4357 ecoff_data (abfd)->fprmask |= ecoff_data (input_bfd)->fprmask;
4358 ecoff_data (abfd)->cprmask[0] |= ecoff_data (input_bfd)->cprmask[0];
4359 ecoff_data (abfd)->cprmask[1] |= ecoff_data (input_bfd)->cprmask[1];
4360 ecoff_data (abfd)->cprmask[2] |= ecoff_data (input_bfd)->cprmask[2];
4361 ecoff_data (abfd)->cprmask[3] |= ecoff_data (input_bfd)->cprmask[3];
4364 /* Write out the external symbols. */
4367 bfd_hash_traverse (&info->hash->table, ecoff_link_write_external, &einfo);
4369 if (info->relocatable)
4371 /* We need to make a pass over the link_orders to count up the
4372 number of relocations we will need to output, so that we know
4373 how much space they will take up. */
4374 for (o = abfd->sections; o != NULL; o = o->next)
4377 for (p = o->map_head.link_order;
4380 if (p->type == bfd_indirect_link_order)
4381 o->reloc_count += p->u.indirect.section->reloc_count;
4382 else if (p->type == bfd_section_reloc_link_order
4383 || p->type == bfd_symbol_reloc_link_order)
4388 /* Compute the reloc and symbol file positions. */
4389 ecoff_compute_reloc_file_positions (abfd);
4391 /* Write out the debugging information. */
4392 if (! bfd_ecoff_write_accumulated_debug (handle, abfd, debug,
4393 &backend->debug_swap, info,
4394 ecoff_data (abfd)->sym_filepos))
4397 bfd_ecoff_debug_free (handle, abfd, debug, &backend->debug_swap, info);
4399 if (info->relocatable)
4401 /* Now reset the reloc_count field of the sections in the output
4402 BFD to 0, so that we can use them to keep track of how many
4403 relocs we have output thus far. */
4404 for (o = abfd->sections; o != NULL; o = o->next)
4408 /* Get a value for the GP register. */
4409 if (ecoff_data (abfd)->gp == 0)
4411 struct bfd_link_hash_entry *h;
4413 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
4415 && h->type == bfd_link_hash_defined)
4416 ecoff_data (abfd)->gp = (h->u.def.value
4417 + h->u.def.section->output_section->vma
4418 + h->u.def.section->output_offset);
4419 else if (info->relocatable)
4423 /* Make up a value. */
4425 for (o = abfd->sections; o != NULL; o = o->next)
4428 && (streq (o->name, _SBSS)
4429 || streq (o->name, _SDATA)
4430 || streq (o->name, _LIT4)
4431 || streq (o->name, _LIT8)
4432 || streq (o->name, _LITA)))
4435 ecoff_data (abfd)->gp = lo + 0x8000;
4439 /* If the relocate_section function needs to do a reloc
4440 involving the GP value, it should make a reloc_dangerous
4441 callback to warn that GP is not defined. */
4445 for (o = abfd->sections; o != NULL; o = o->next)
4447 for (p = o->map_head.link_order;
4451 if (p->type == bfd_indirect_link_order
4452 && (bfd_get_flavour (p->u.indirect.section->owner)
4453 == bfd_target_ecoff_flavour))
4455 if (! ecoff_indirect_link_order (abfd, info, o, p))
4458 else if (p->type == bfd_section_reloc_link_order
4459 || p->type == bfd_symbol_reloc_link_order)
4461 if (! ecoff_reloc_link_order (abfd, info, o, p))
4466 if (! _bfd_default_link_order (abfd, info, o, p))
4472 bfd_get_symcount (abfd) = symhdr->iextMax + symhdr->isymMax;
4474 ecoff_data (abfd)->linker = TRUE;