1 /* Generic ECOFF (Extended-COFF) routines.
2 Copyright (C) 1990-2016 Free Software Foundation, Inc.
3 Original version by Per Bothner.
4 Full support added by Ian Lance Taylor, ian@cygnus.com.
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;
509 BFD_ASSERT (debug == &ecoff_data (abfd)->debug_info);
511 /* Check whether we've already gotten it, and whether there's any to
513 if (ecoff_data (abfd)->raw_syments != NULL)
515 if (ecoff_data (abfd)->sym_filepos == 0)
517 bfd_get_symcount (abfd) = 0;
521 if (! ecoff_slurp_symbolic_header (abfd))
524 internal_symhdr = &debug->symbolic_header;
526 /* Read all the symbolic information at once. */
527 raw_base = (ecoff_data (abfd)->sym_filepos
528 + backend->debug_swap.external_hdr_size);
530 /* Alpha ecoff makes the determination of raw_size difficult. It has
531 an undocumented debug data section between the symhdr and the first
532 documented section. And the ordering of the sections varies between
533 statically and dynamically linked executables.
534 If bfd supports SEEK_END someday, this code could be simplified. */
537 #define UPDATE_RAW_END(start, count, size) \
538 cb_end = internal_symhdr->start + internal_symhdr->count * (size); \
539 if (cb_end > raw_end) \
542 UPDATE_RAW_END (cbLineOffset, cbLine, sizeof (unsigned char));
543 UPDATE_RAW_END (cbDnOffset, idnMax, backend->debug_swap.external_dnr_size);
544 UPDATE_RAW_END (cbPdOffset, ipdMax, backend->debug_swap.external_pdr_size);
545 UPDATE_RAW_END (cbSymOffset, isymMax, backend->debug_swap.external_sym_size);
546 /* eraxxon@alumni.rice.edu: ioptMax refers to the size of the
547 optimization symtab, not the number of entries. */
548 UPDATE_RAW_END (cbOptOffset, ioptMax, sizeof (char));
549 UPDATE_RAW_END (cbAuxOffset, iauxMax, sizeof (union aux_ext));
550 UPDATE_RAW_END (cbSsOffset, issMax, sizeof (char));
551 UPDATE_RAW_END (cbSsExtOffset, issExtMax, sizeof (char));
552 UPDATE_RAW_END (cbFdOffset, ifdMax, backend->debug_swap.external_fdr_size);
553 UPDATE_RAW_END (cbRfdOffset, crfd, backend->debug_swap.external_rfd_size);
554 UPDATE_RAW_END (cbExtOffset, iextMax, backend->debug_swap.external_ext_size);
556 #undef UPDATE_RAW_END
558 raw_size = raw_end - raw_base;
561 ecoff_data (abfd)->sym_filepos = 0;
564 raw = bfd_alloc (abfd, raw_size);
568 pos = ecoff_data (abfd)->sym_filepos;
569 pos += backend->debug_swap.external_hdr_size;
570 if (bfd_seek (abfd, pos, SEEK_SET) != 0
571 || bfd_bread (raw, raw_size, abfd) != raw_size)
573 bfd_release (abfd, raw);
577 ecoff_data (abfd)->raw_syments = raw;
579 /* Get pointers for the numeric offsets in the HDRR structure. */
580 #define FIX(off1, off2, type) \
581 if (internal_symhdr->off1 == 0) \
582 debug->off2 = NULL; \
584 debug->off2 = (type) ((char *) raw \
585 + (internal_symhdr->off1 \
588 FIX (cbLineOffset, line, unsigned char *);
589 FIX (cbDnOffset, external_dnr, void *);
590 FIX (cbPdOffset, external_pdr, void *);
591 FIX (cbSymOffset, external_sym, void *);
592 FIX (cbOptOffset, external_opt, void *);
593 FIX (cbAuxOffset, external_aux, union aux_ext *);
594 FIX (cbSsOffset, ss, char *);
595 FIX (cbSsExtOffset, ssext, char *);
596 FIX (cbFdOffset, external_fdr, void *);
597 FIX (cbRfdOffset, external_rfd, void *);
598 FIX (cbExtOffset, external_ext, void *);
601 /* I don't want to always swap all the data, because it will just
602 waste time and most programs will never look at it. The only
603 time the linker needs most of the debugging information swapped
604 is when linking big-endian and little-endian MIPS object files
605 together, which is not a common occurrence.
607 We need to look at the fdr to deal with a lot of information in
608 the symbols, so we swap them here. */
609 debug->fdr = (FDR *) bfd_alloc2 (abfd, internal_symhdr->ifdMax,
610 sizeof (struct fdr));
611 if (debug->fdr == NULL)
613 external_fdr_size = backend->debug_swap.external_fdr_size;
614 fdr_ptr = debug->fdr;
615 fraw_src = (char *) debug->external_fdr;
616 /* PR 17512: file: 3372-1243-0.004. */
617 if (fraw_src == NULL && internal_symhdr->ifdMax > 0)
619 fraw_end = fraw_src + internal_symhdr->ifdMax * external_fdr_size;
620 for (; fraw_src < fraw_end; fraw_src += external_fdr_size, fdr_ptr++)
621 (*backend->debug_swap.swap_fdr_in) (abfd, (void *) fraw_src, fdr_ptr);
626 /* ECOFF symbol table routines. The ECOFF symbol table is described
627 in gcc/mips-tfile.c. */
629 /* ECOFF uses two common sections. One is the usual one, and the
630 other is for small objects. All the small objects are kept
631 together, and then referenced via the gp pointer, which yields
632 faster assembler code. This is what we use for the small common
634 static asection ecoff_scom_section;
635 static asymbol ecoff_scom_symbol;
636 static asymbol *ecoff_scom_symbol_ptr;
638 /* Create an empty symbol. */
641 _bfd_ecoff_make_empty_symbol (bfd *abfd)
643 ecoff_symbol_type *new_symbol;
644 bfd_size_type amt = sizeof (ecoff_symbol_type);
646 new_symbol = (ecoff_symbol_type *) bfd_zalloc (abfd, amt);
647 if (new_symbol == NULL)
649 new_symbol->symbol.section = NULL;
650 new_symbol->fdr = NULL;
651 new_symbol->local = FALSE;
652 new_symbol->native = NULL;
653 new_symbol->symbol.the_bfd = abfd;
654 return &new_symbol->symbol;
657 /* Set the BFD flags and section for an ECOFF symbol. */
660 ecoff_set_symbol_info (bfd *abfd,
666 asym->the_bfd = abfd;
667 asym->value = ecoff_sym->value;
668 asym->section = &bfd_debug_section;
671 /* Most symbol types are just for debugging. */
672 switch (ecoff_sym->st)
681 if (ECOFF_IS_STAB (ecoff_sym))
683 asym->flags = BSF_DEBUGGING;
688 asym->flags = BSF_DEBUGGING;
693 asym->flags = BSF_EXPORT | BSF_WEAK;
695 asym->flags = BSF_EXPORT | BSF_GLOBAL;
698 asym->flags = BSF_LOCAL;
699 /* Normally, a local stProc symbol will have a corresponding
700 external symbol. We mark the local symbol as a debugging
701 symbol, in order to prevent nm from printing both out.
702 Similarly, we mark stLabel and stabs symbols as debugging
703 symbols. In both cases, we do want to set the value
704 correctly based on the symbol class. */
705 if (ecoff_sym->st == stProc
706 || ecoff_sym->st == stLabel
707 || ECOFF_IS_STAB (ecoff_sym))
708 asym->flags |= BSF_DEBUGGING;
711 if (ecoff_sym->st == stProc || ecoff_sym->st == stStaticProc)
712 asym->flags |= BSF_FUNCTION;
714 switch (ecoff_sym->sc)
717 /* Used for compiler generated labels. Leave them in the
718 debugging section, and mark them as local. If BSF_DEBUGGING
719 is set, then nm does not display them for some reason. If no
720 flags are set then the linker whines about them. */
721 asym->flags = BSF_LOCAL;
724 asym->section = bfd_make_section_old_way (abfd, _TEXT);
725 asym->value -= asym->section->vma;
728 asym->section = bfd_make_section_old_way (abfd, _DATA);
729 asym->value -= asym->section->vma;
732 asym->section = bfd_make_section_old_way (abfd, _BSS);
733 asym->value -= asym->section->vma;
736 asym->flags = BSF_DEBUGGING;
739 asym->section = bfd_abs_section_ptr;
742 asym->section = bfd_und_section_ptr;
752 asym->flags = BSF_DEBUGGING;
755 asym->section = bfd_make_section_old_way (abfd, ".sdata");
756 asym->value -= asym->section->vma;
759 asym->section = bfd_make_section_old_way (abfd, ".sbss");
760 asym->value -= asym->section->vma;
763 asym->section = bfd_make_section_old_way (abfd, ".rdata");
764 asym->value -= asym->section->vma;
767 asym->flags = BSF_DEBUGGING;
770 if (asym->value > ecoff_data (abfd)->gp_size)
772 asym->section = bfd_com_section_ptr;
778 if (ecoff_scom_section.name == NULL)
780 /* Initialize the small common section. */
781 ecoff_scom_section.name = SCOMMON;
782 ecoff_scom_section.flags = SEC_IS_COMMON;
783 ecoff_scom_section.output_section = &ecoff_scom_section;
784 ecoff_scom_section.symbol = &ecoff_scom_symbol;
785 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
786 ecoff_scom_symbol.name = SCOMMON;
787 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
788 ecoff_scom_symbol.section = &ecoff_scom_section;
789 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
791 asym->section = &ecoff_scom_section;
796 asym->flags = BSF_DEBUGGING;
799 asym->section = bfd_und_section_ptr;
804 asym->section = bfd_make_section_old_way (abfd, ".init");
805 asym->value -= asym->section->vma;
810 asym->flags = BSF_DEBUGGING;
813 asym->section = bfd_make_section_old_way (abfd, ".fini");
814 asym->value -= asym->section->vma;
817 asym->section = bfd_make_section_old_way (abfd, ".rconst");
818 asym->value -= asym->section->vma;
824 /* Look for special constructors symbols and make relocation entries
825 in a special construction section. These are produced by the
826 -fgnu-linker argument to g++. */
827 if (ECOFF_IS_STAB (ecoff_sym))
829 switch (ECOFF_UNMARK_STAB (ecoff_sym->index))
838 /* Mark the symbol as a constructor. */
839 asym->flags |= BSF_CONSTRUCTOR;
846 /* Read an ECOFF symbol table. */
849 _bfd_ecoff_slurp_symbol_table (bfd *abfd)
851 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
852 const bfd_size_type external_ext_size
853 = backend->debug_swap.external_ext_size;
854 const bfd_size_type external_sym_size
855 = backend->debug_swap.external_sym_size;
856 void (* const swap_ext_in) (bfd *, void *, EXTR *)
857 = backend->debug_swap.swap_ext_in;
858 void (* const swap_sym_in) (bfd *, void *, SYMR *)
859 = backend->debug_swap.swap_sym_in;
860 ecoff_symbol_type *internal;
861 ecoff_symbol_type *internal_ptr;
867 /* If we've already read in the symbol table, do nothing. */
868 if (ecoff_data (abfd)->canonical_symbols != NULL)
871 /* Get the symbolic information. */
872 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL,
873 &ecoff_data (abfd)->debug_info))
875 if (bfd_get_symcount (abfd) == 0)
878 internal = (ecoff_symbol_type *) bfd_alloc2 (abfd, bfd_get_symcount (abfd),
879 sizeof (ecoff_symbol_type));
880 if (internal == NULL)
883 internal_ptr = internal;
884 eraw_src = (char *) ecoff_data (abfd)->debug_info.external_ext;
886 + (ecoff_data (abfd)->debug_info.symbolic_header.iextMax
887 * external_ext_size));
888 for (; eraw_src < eraw_end; eraw_src += external_ext_size, internal_ptr++)
892 (*swap_ext_in) (abfd, (void *) eraw_src, &internal_esym);
894 /* PR 17512: file: 3372-1000-0.004. */
895 if (internal_esym.asym.iss >= ecoff_data (abfd)->debug_info.symbolic_header.issExtMax
896 || internal_esym.asym.iss < 0)
899 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ssext
900 + internal_esym.asym.iss);
902 if (!ecoff_set_symbol_info (abfd, &internal_esym.asym,
903 &internal_ptr->symbol, 1,
904 internal_esym.weakext))
907 /* The alpha uses a negative ifd field for section symbols. */
908 if (internal_esym.ifd >= 0)
910 /* PR 17512: file: 3372-1983-0.004. */
911 if (internal_esym.ifd >= ecoff_data (abfd)->debug_info.symbolic_header.ifdMax)
912 internal_ptr->fdr = NULL;
914 internal_ptr->fdr = (ecoff_data (abfd)->debug_info.fdr
915 + internal_esym.ifd);
918 internal_ptr->fdr = NULL;
919 internal_ptr->local = FALSE;
920 internal_ptr->native = (void *) eraw_src;
923 /* The local symbols must be accessed via the fdr's, because the
924 string and aux indices are relative to the fdr information. */
925 fdr_ptr = ecoff_data (abfd)->debug_info.fdr;
926 fdr_end = fdr_ptr + ecoff_data (abfd)->debug_info.symbolic_header.ifdMax;
927 for (; fdr_ptr < fdr_end; fdr_ptr++)
932 lraw_src = ((char *) ecoff_data (abfd)->debug_info.external_sym
933 + fdr_ptr->isymBase * external_sym_size);
934 lraw_end = lraw_src + fdr_ptr->csym * external_sym_size;
937 lraw_src += external_sym_size, internal_ptr++)
941 (*swap_sym_in) (abfd, (void *) lraw_src, &internal_sym);
942 internal_ptr->symbol.name = (ecoff_data (abfd)->debug_info.ss
945 if (!ecoff_set_symbol_info (abfd, &internal_sym,
946 &internal_ptr->symbol, 0, 0))
948 internal_ptr->fdr = fdr_ptr;
949 internal_ptr->local = TRUE;
950 internal_ptr->native = (void *) lraw_src;
954 /* PR 17512: file: 3372-3080-0.004.
955 A discrepancy between ecoff_data (abfd)->debug_info.symbolic_header.isymMax
956 and ecoff_data (abfd)->debug_info.symbolic_header.ifdMax can mean that
957 we have fewer symbols than we were expecting. Allow for this by updating
958 the symbol count and warning the user. */
959 if (internal_ptr - internal < (ptrdiff_t) bfd_get_symcount (abfd))
961 bfd_get_symcount (abfd) = internal_ptr - internal;
962 (*_bfd_error_handler)
963 (_("%B: warning: isymMax (%ld) is greater than ifdMax (%d)\n"),
964 abfd, ecoff_data (abfd)->debug_info.symbolic_header.isymMax,
965 ecoff_data (abfd)->debug_info.symbolic_header.ifdMax);
968 ecoff_data (abfd)->canonical_symbols = internal;
973 /* Return the amount of space needed for the canonical symbols. */
976 _bfd_ecoff_get_symtab_upper_bound (bfd *abfd)
978 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL,
979 &ecoff_data (abfd)->debug_info))
982 if (bfd_get_symcount (abfd) == 0)
985 return (bfd_get_symcount (abfd) + 1) * (sizeof (ecoff_symbol_type *));
988 /* Get the canonical symbols. */
991 _bfd_ecoff_canonicalize_symtab (bfd *abfd, asymbol **alocation)
993 unsigned int counter = 0;
994 ecoff_symbol_type *symbase;
995 ecoff_symbol_type **location = (ecoff_symbol_type **) alocation;
997 if (! _bfd_ecoff_slurp_symbol_table (abfd))
999 if (bfd_get_symcount (abfd) == 0)
1002 symbase = ecoff_data (abfd)->canonical_symbols;
1003 while (counter < bfd_get_symcount (abfd))
1005 *(location++) = symbase++;
1009 return bfd_get_symcount (abfd);
1012 /* Turn ECOFF type information into a printable string.
1013 ecoff_emit_aggregate and ecoff_type_to_string are from
1014 gcc/mips-tdump.c, with swapping added and used_ptr removed. */
1016 /* Write aggregate information to a string. */
1019 ecoff_emit_aggregate (bfd *abfd,
1026 const struct ecoff_debug_swap * const debug_swap =
1027 &ecoff_backend (abfd)->debug_swap;
1028 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
1029 unsigned int ifd = rndx->rfd;
1030 unsigned int indx = rndx->index;
1036 /* An ifd of -1 is an opaque type. An escaped index of 0 is a
1037 struct return type of a procedure compiled without -g. */
1038 if (ifd == 0xffffffff
1039 || (rndx->rfd == 0xfff && indx == 0))
1040 name = "<undefined>";
1041 else if (indx == indexNil)
1047 if (debug_info->external_rfd == NULL)
1048 fdr = debug_info->fdr + ifd;
1053 (*debug_swap->swap_rfd_in) (abfd,
1054 ((char *) debug_info->external_rfd
1055 + ((fdr->rfdBase + ifd)
1056 * debug_swap->external_rfd_size)),
1058 fdr = debug_info->fdr + rfd;
1061 indx += fdr->isymBase;
1063 (*debug_swap->swap_sym_in) (abfd,
1064 ((char *) debug_info->external_sym
1065 + indx * debug_swap->external_sym_size),
1068 name = debug_info->ss + fdr->issBase + sym.iss;
1072 "%s %s { ifd = %u, index = %lu }",
1074 ((unsigned long) indx
1075 + debug_info->symbolic_header.iextMax));
1078 /* Convert the type information to string format. */
1081 ecoff_type_to_string (bfd *abfd, FDR *fdr, unsigned int indx)
1083 union aux_ext *aux_ptr;
1093 unsigned int basic_type;
1096 static char buffer2[1024];
1101 aux_ptr = ecoff_data (abfd)->debug_info.external_aux + fdr->iauxBase;
1102 bigendian = fdr->fBigendian;
1104 for (i = 0; i < 7; i++)
1106 qualifiers[i].low_bound = 0;
1107 qualifiers[i].high_bound = 0;
1108 qualifiers[i].stride = 0;
1111 if (AUX_GET_ISYM (bigendian, &aux_ptr[indx]) == (bfd_vma) -1)
1112 return "-1 (no type)";
1113 _bfd_ecoff_swap_tir_in (bigendian, &aux_ptr[indx++].a_ti, &u.ti);
1115 basic_type = u.ti.bt;
1116 qualifiers[0].type = u.ti.tq0;
1117 qualifiers[1].type = u.ti.tq1;
1118 qualifiers[2].type = u.ti.tq2;
1119 qualifiers[3].type = u.ti.tq3;
1120 qualifiers[4].type = u.ti.tq4;
1121 qualifiers[5].type = u.ti.tq5;
1122 qualifiers[6].type = tqNil;
1124 /* Go get the basic type. */
1127 case btNil: /* Undefined. */
1131 case btAdr: /* Address - integer same size as pointer. */
1132 strcpy (p1, "address");
1135 case btChar: /* Character. */
1136 strcpy (p1, "char");
1139 case btUChar: /* Unsigned character. */
1140 strcpy (p1, "unsigned char");
1143 case btShort: /* Short. */
1144 strcpy (p1, "short");
1147 case btUShort: /* Unsigned short. */
1148 strcpy (p1, "unsigned short");
1151 case btInt: /* Int. */
1155 case btUInt: /* Unsigned int. */
1156 strcpy (p1, "unsigned int");
1159 case btLong: /* Long. */
1160 strcpy (p1, "long");
1163 case btULong: /* Unsigned long. */
1164 strcpy (p1, "unsigned long");
1167 case btFloat: /* Float (real). */
1168 strcpy (p1, "float");
1171 case btDouble: /* Double (real). */
1172 strcpy (p1, "double");
1175 /* Structures add 1-2 aux words:
1176 1st word is [ST_RFDESCAPE, offset] pointer to struct def;
1177 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1179 case btStruct: /* Structure (Record). */
1180 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1181 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1182 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1184 indx++; /* Skip aux words. */
1187 /* Unions add 1-2 aux words:
1188 1st word is [ST_RFDESCAPE, offset] pointer to union def;
1189 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1191 case btUnion: /* Union. */
1192 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1193 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1194 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1196 indx++; /* Skip aux words. */
1199 /* Enumerations add 1-2 aux words:
1200 1st word is [ST_RFDESCAPE, offset] pointer to enum def;
1201 2nd word is file index if 1st word rfd is ST_RFDESCAPE. */
1203 case btEnum: /* Enumeration. */
1204 _bfd_ecoff_swap_rndx_in (bigendian, &aux_ptr[indx].a_rndx, &rndx);
1205 ecoff_emit_aggregate (abfd, fdr, p1, &rndx,
1206 (long) AUX_GET_ISYM (bigendian, &aux_ptr[indx+1]),
1208 indx++; /* Skip aux words. */
1211 case btTypedef: /* Defined via a typedef, isymRef points. */
1212 strcpy (p1, "typedef");
1215 case btRange: /* Subrange of int. */
1216 strcpy (p1, "subrange");
1219 case btSet: /* Pascal sets. */
1223 case btComplex: /* Fortran complex. */
1224 strcpy (p1, "complex");
1227 case btDComplex: /* Fortran double complex. */
1228 strcpy (p1, "double complex");
1231 case btIndirect: /* Forward or unnamed typedef. */
1232 strcpy (p1, "forward/unamed typedef");
1235 case btFixedDec: /* Fixed Decimal. */
1236 strcpy (p1, "fixed decimal");
1239 case btFloatDec: /* Float Decimal. */
1240 strcpy (p1, "float decimal");
1243 case btString: /* Varying Length Character String. */
1244 strcpy (p1, "string");
1247 case btBit: /* Aligned Bit String. */
1251 case btPicture: /* Picture. */
1252 strcpy (p1, "picture");
1255 case btVoid: /* Void. */
1256 strcpy (p1, "void");
1260 sprintf (p1, _("Unknown basic type %d"), (int) basic_type);
1264 p1 += strlen (buffer1);
1266 /* If this is a bitfield, get the bitsize. */
1271 bitsize = AUX_GET_WIDTH (bigendian, &aux_ptr[indx++]);
1272 sprintf (p1, " : %d", bitsize);
1273 p1 += strlen (buffer1);
1276 /* Deal with any qualifiers. */
1277 if (qualifiers[0].type != tqNil)
1279 /* Snarf up any array bounds in the correct order. Arrays
1280 store 5 successive words in the aux. table:
1281 word 0 RNDXR to type of the bounds (ie, int)
1282 word 1 Current file descriptor index
1284 word 3 high bound (or -1 if [])
1285 word 4 stride size in bits. */
1286 for (i = 0; i < 7; i++)
1288 if (qualifiers[i].type == tqArray)
1290 qualifiers[i].low_bound =
1291 AUX_GET_DNLOW (bigendian, &aux_ptr[indx+2]);
1292 qualifiers[i].high_bound =
1293 AUX_GET_DNHIGH (bigendian, &aux_ptr[indx+3]);
1294 qualifiers[i].stride =
1295 AUX_GET_WIDTH (bigendian, &aux_ptr[indx+4]);
1300 /* Now print out the qualifiers. */
1301 for (i = 0; i < 6; i++)
1303 switch (qualifiers[i].type)
1310 strcpy (p2, "ptr to ");
1311 p2 += sizeof ("ptr to ")-1;
1315 strcpy (p2, "volatile ");
1316 p2 += sizeof ("volatile ")-1;
1320 strcpy (p2, "far ");
1321 p2 += sizeof ("far ")-1;
1325 strcpy (p2, "func. ret. ");
1326 p2 += sizeof ("func. ret. ");
1331 int first_array = i;
1334 /* Print array bounds reversed (ie, in the order the C
1335 programmer writes them). C is such a fun language.... */
1336 while (i < 5 && qualifiers[i+1].type == tqArray)
1339 for (j = i; j >= first_array; j--)
1341 strcpy (p2, "array [");
1342 p2 += sizeof ("array [")-1;
1343 if (qualifiers[j].low_bound != 0)
1345 "%ld:%ld {%ld bits}",
1346 (long) qualifiers[j].low_bound,
1347 (long) qualifiers[j].high_bound,
1348 (long) qualifiers[j].stride);
1350 else if (qualifiers[j].high_bound != -1)
1353 (long) (qualifiers[j].high_bound + 1),
1354 (long) (qualifiers[j].stride));
1357 sprintf (p2, " {%ld bits}", (long) (qualifiers[j].stride));
1360 strcpy (p2, "] of ");
1361 p2 += sizeof ("] of ")-1;
1369 strcpy (p2, buffer1);
1373 /* Return information about ECOFF symbol SYMBOL in RET. */
1376 _bfd_ecoff_get_symbol_info (bfd *abfd ATTRIBUTE_UNUSED,
1380 bfd_symbol_info (symbol, ret);
1383 /* Return whether this is a local label. */
1386 _bfd_ecoff_bfd_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED,
1389 return name[0] == '$';
1392 /* Print information about an ECOFF symbol. */
1395 _bfd_ecoff_print_symbol (bfd *abfd,
1398 bfd_print_symbol_type how)
1400 const struct ecoff_debug_swap * const debug_swap
1401 = &ecoff_backend (abfd)->debug_swap;
1402 FILE *file = (FILE *)filep;
1406 case bfd_print_symbol_name:
1407 fprintf (file, "%s", symbol->name);
1409 case bfd_print_symbol_more:
1410 if (ecoffsymbol (symbol)->local)
1414 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native,
1416 fprintf (file, "ecoff local ");
1417 fprintf_vma (file, (bfd_vma) ecoff_sym.value);
1418 fprintf (file, " %x %x", (unsigned) ecoff_sym.st,
1419 (unsigned) ecoff_sym.sc);
1425 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native,
1427 fprintf (file, "ecoff extern ");
1428 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value);
1429 fprintf (file, " %x %x", (unsigned) ecoff_ext.asym.st,
1430 (unsigned) ecoff_ext.asym.sc);
1433 case bfd_print_symbol_all:
1434 /* Print out the symbols in a reasonable way. */
1443 if (ecoffsymbol (symbol)->local)
1445 (*debug_swap->swap_sym_in) (abfd, ecoffsymbol (symbol)->native,
1448 pos = ((((char *) ecoffsymbol (symbol)->native
1449 - (char *) ecoff_data (abfd)->debug_info.external_sym)
1450 / debug_swap->external_sym_size)
1451 + ecoff_data (abfd)->debug_info.symbolic_header.iextMax);
1458 (*debug_swap->swap_ext_in) (abfd, ecoffsymbol (symbol)->native,
1461 pos = (((char *) ecoffsymbol (symbol)->native
1462 - (char *) ecoff_data (abfd)->debug_info.external_ext)
1463 / debug_swap->external_ext_size);
1464 jmptbl = ecoff_ext.jmptbl ? 'j' : ' ';
1465 cobol_main = ecoff_ext.cobol_main ? 'c' : ' ';
1466 weakext = ecoff_ext.weakext ? 'w' : ' ';
1469 fprintf (file, "[%3d] %c ",
1471 fprintf_vma (file, (bfd_vma) ecoff_ext.asym.value);
1472 fprintf (file, " st %x sc %x indx %x %c%c%c %s",
1473 (unsigned) ecoff_ext.asym.st,
1474 (unsigned) ecoff_ext.asym.sc,
1475 (unsigned) ecoff_ext.asym.index,
1476 jmptbl, cobol_main, weakext,
1479 if (ecoffsymbol (symbol)->fdr != NULL
1480 && ecoff_ext.asym.index != indexNil)
1485 bfd_size_type sym_base;
1486 union aux_ext *aux_base;
1488 fdr = ecoffsymbol (symbol)->fdr;
1489 indx = ecoff_ext.asym.index;
1491 /* sym_base is used to map the fdr relative indices which
1492 appear in the file to the position number which we are
1494 sym_base = fdr->isymBase;
1495 if (ecoffsymbol (symbol)->local)
1497 ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
1499 /* aux_base is the start of the aux entries for this file;
1500 asym.index is an offset from this. */
1501 aux_base = (ecoff_data (abfd)->debug_info.external_aux
1504 /* The aux entries are stored in host byte order; the
1505 order is indicated by a bit in the fdr. */
1506 bigendian = fdr->fBigendian;
1508 /* This switch is basically from gcc/mips-tdump.c. */
1509 switch (ecoff_ext.asym.st)
1517 fprintf (file, _("\n End+1 symbol: %ld"),
1518 (long) (indx + sym_base));
1522 if (ecoff_ext.asym.sc == scText
1523 || ecoff_ext.asym.sc == scInfo)
1524 fprintf (file, _("\n First symbol: %ld"),
1525 (long) (indx + sym_base));
1527 fprintf (file, _("\n First symbol: %ld"),
1529 (AUX_GET_ISYM (bigendian,
1530 &aux_base[ecoff_ext.asym.index])
1536 if (ECOFF_IS_STAB (&ecoff_ext.asym))
1538 else if (ecoffsymbol (symbol)->local)
1539 fprintf (file, _("\n End+1 symbol: %-7ld Type: %s"),
1541 (AUX_GET_ISYM (bigendian,
1542 &aux_base[ecoff_ext.asym.index])
1544 ecoff_type_to_string (abfd, fdr, indx + 1));
1546 fprintf (file, _("\n Local symbol: %ld"),
1549 + (ecoff_data (abfd)
1550 ->debug_info.symbolic_header.iextMax)));
1554 fprintf (file, _("\n struct; End+1 symbol: %ld"),
1555 (long) (indx + sym_base));
1559 fprintf (file, _("\n union; End+1 symbol: %ld"),
1560 (long) (indx + sym_base));
1564 fprintf (file, _("\n enum; End+1 symbol: %ld"),
1565 (long) (indx + sym_base));
1569 if (! ECOFF_IS_STAB (&ecoff_ext.asym))
1570 fprintf (file, _("\n Type: %s"),
1571 ecoff_type_to_string (abfd, fdr, indx));
1580 /* Read in the relocs for a section. */
1583 ecoff_slurp_reloc_table (bfd *abfd,
1587 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
1588 arelent *internal_relocs;
1589 bfd_size_type external_reloc_size;
1591 char *external_relocs;
1595 if (section->relocation != NULL
1596 || section->reloc_count == 0
1597 || (section->flags & SEC_CONSTRUCTOR) != 0)
1600 if (! _bfd_ecoff_slurp_symbol_table (abfd))
1603 amt = section->reloc_count;
1604 amt *= sizeof (arelent);
1605 internal_relocs = (arelent *) bfd_alloc (abfd, amt);
1607 external_reloc_size = backend->external_reloc_size;
1608 amt = external_reloc_size * section->reloc_count;
1609 external_relocs = (char *) bfd_alloc (abfd, amt);
1610 if (internal_relocs == NULL || external_relocs == NULL)
1612 if (bfd_seek (abfd, section->rel_filepos, SEEK_SET) != 0)
1614 if (bfd_bread (external_relocs, amt, abfd) != amt)
1617 for (i = 0, rptr = internal_relocs; i < section->reloc_count; i++, rptr++)
1619 struct internal_reloc intern;
1621 (*backend->swap_reloc_in) (abfd,
1622 external_relocs + i * external_reloc_size,
1625 if (intern.r_extern)
1627 /* r_symndx is an index into the external symbols. */
1628 BFD_ASSERT (intern.r_symndx >= 0
1630 < (ecoff_data (abfd)
1631 ->debug_info.symbolic_header.iextMax)));
1632 rptr->sym_ptr_ptr = symbols + intern.r_symndx;
1635 else if (intern.r_symndx == RELOC_SECTION_NONE
1636 || intern.r_symndx == RELOC_SECTION_ABS)
1638 rptr->sym_ptr_ptr = bfd_abs_section_ptr->symbol_ptr_ptr;
1643 const char *sec_name;
1646 /* r_symndx is a section key. */
1647 switch (intern.r_symndx)
1649 case RELOC_SECTION_TEXT: sec_name = _TEXT; break;
1650 case RELOC_SECTION_RDATA: sec_name = _RDATA; break;
1651 case RELOC_SECTION_DATA: sec_name = _DATA; break;
1652 case RELOC_SECTION_SDATA: sec_name = _SDATA; break;
1653 case RELOC_SECTION_SBSS: sec_name = _SBSS; break;
1654 case RELOC_SECTION_BSS: sec_name = _BSS; break;
1655 case RELOC_SECTION_INIT: sec_name = _INIT; break;
1656 case RELOC_SECTION_LIT8: sec_name = _LIT8; break;
1657 case RELOC_SECTION_LIT4: sec_name = _LIT4; break;
1658 case RELOC_SECTION_XDATA: sec_name = _XDATA; break;
1659 case RELOC_SECTION_PDATA: sec_name = _PDATA; break;
1660 case RELOC_SECTION_FINI: sec_name = _FINI; break;
1661 case RELOC_SECTION_LITA: sec_name = _LITA; break;
1662 case RELOC_SECTION_RCONST: sec_name = _RCONST; break;
1666 sec = bfd_get_section_by_name (abfd, sec_name);
1669 rptr->sym_ptr_ptr = sec->symbol_ptr_ptr;
1671 rptr->addend = - bfd_get_section_vma (abfd, sec);
1674 rptr->address = intern.r_vaddr - bfd_get_section_vma (abfd, section);
1676 /* Let the backend select the howto field and do any other
1677 required processing. */
1678 (*backend->adjust_reloc_in) (abfd, &intern, rptr);
1681 bfd_release (abfd, external_relocs);
1683 section->relocation = internal_relocs;
1688 /* Get a canonical list of relocs. */
1691 _bfd_ecoff_canonicalize_reloc (bfd *abfd,
1698 if (section->flags & SEC_CONSTRUCTOR)
1700 arelent_chain *chain;
1702 /* This section has relocs made up by us, not the file, so take
1703 them out of their chain and place them into the data area
1705 for (count = 0, chain = section->constructor_chain;
1706 count < section->reloc_count;
1707 count++, chain = chain->next)
1708 *relptr++ = &chain->relent;
1714 if (! ecoff_slurp_reloc_table (abfd, section, symbols))
1717 tblptr = section->relocation;
1719 for (count = 0; count < section->reloc_count; count++)
1720 *relptr++ = tblptr++;
1725 return section->reloc_count;
1728 /* Provided a BFD, a section and an offset into the section, calculate
1729 and return the name of the source file and the line nearest to the
1733 _bfd_ecoff_find_nearest_line (bfd *abfd,
1734 asymbol **symbols ATTRIBUTE_UNUSED,
1737 const char **filename_ptr,
1738 const char **functionname_ptr,
1739 unsigned int *retline_ptr,
1740 unsigned int *discriminator_ptr)
1742 const struct ecoff_debug_swap * const debug_swap
1743 = &ecoff_backend (abfd)->debug_swap;
1744 struct ecoff_debug_info * const debug_info = &ecoff_data (abfd)->debug_info;
1745 struct ecoff_find_line *line_info;
1747 /* Make sure we have the FDR's. */
1748 if (! _bfd_ecoff_slurp_symbolic_info (abfd, NULL, debug_info)
1749 || bfd_get_symcount (abfd) == 0)
1752 if (ecoff_data (abfd)->find_line_info == NULL)
1754 bfd_size_type amt = sizeof (struct ecoff_find_line);
1756 ecoff_data (abfd)->find_line_info =
1757 (struct ecoff_find_line *) bfd_zalloc (abfd, amt);
1758 if (ecoff_data (abfd)->find_line_info == NULL)
1762 if (discriminator_ptr)
1763 *discriminator_ptr = 0;
1764 line_info = ecoff_data (abfd)->find_line_info;
1765 return _bfd_ecoff_locate_line (abfd, section, offset, debug_info,
1766 debug_swap, line_info, filename_ptr,
1767 functionname_ptr, retline_ptr);
1770 /* Copy private BFD data. This is called by objcopy and strip. We
1771 use it to copy the ECOFF debugging information from one BFD to the
1772 other. It would be theoretically possible to represent the ECOFF
1773 debugging information in the symbol table. However, it would be a
1774 lot of work, and there would be little gain (gas, gdb, and ld
1775 already access the ECOFF debugging information via the
1776 ecoff_debug_info structure, and that structure would have to be
1777 retained in order to support ECOFF debugging in MIPS ELF).
1779 The debugging information for the ECOFF external symbols comes from
1780 the symbol table, so this function only handles the other debugging
1784 _bfd_ecoff_bfd_copy_private_bfd_data (bfd *ibfd, bfd *obfd)
1786 struct ecoff_debug_info *iinfo = &ecoff_data (ibfd)->debug_info;
1787 struct ecoff_debug_info *oinfo = &ecoff_data (obfd)->debug_info;
1789 asymbol **sym_ptr_ptr;
1793 /* We only want to copy information over if both BFD's use ECOFF
1795 if (bfd_get_flavour (ibfd) != bfd_target_ecoff_flavour
1796 || bfd_get_flavour (obfd) != bfd_target_ecoff_flavour)
1799 /* Copy the GP value and the register masks. */
1800 ecoff_data (obfd)->gp = ecoff_data (ibfd)->gp;
1801 ecoff_data (obfd)->gprmask = ecoff_data (ibfd)->gprmask;
1802 ecoff_data (obfd)->fprmask = ecoff_data (ibfd)->fprmask;
1803 for (i = 0; i < 3; i++)
1804 ecoff_data (obfd)->cprmask[i] = ecoff_data (ibfd)->cprmask[i];
1806 /* Copy the version stamp. */
1807 oinfo->symbolic_header.vstamp = iinfo->symbolic_header.vstamp;
1809 /* If there are no symbols, don't copy any debugging information. */
1810 c = bfd_get_symcount (obfd);
1811 sym_ptr_ptr = bfd_get_outsymbols (obfd);
1812 if (c == 0 || sym_ptr_ptr == NULL)
1815 /* See if there are any local symbols. */
1817 for (; c > 0; c--, sym_ptr_ptr++)
1819 if (ecoffsymbol (*sym_ptr_ptr)->local)
1828 /* There are some local symbols. We just bring over all the
1829 debugging information. FIXME: This is not quite the right
1830 thing to do. If the user has asked us to discard all
1831 debugging information, then we are probably going to wind up
1832 keeping it because there will probably be some local symbol
1833 which objcopy did not discard. We should actually break
1834 apart the debugging information and only keep that which
1835 applies to the symbols we want to keep. */
1836 oinfo->symbolic_header.ilineMax = iinfo->symbolic_header.ilineMax;
1837 oinfo->symbolic_header.cbLine = iinfo->symbolic_header.cbLine;
1838 oinfo->line = iinfo->line;
1840 oinfo->symbolic_header.idnMax = iinfo->symbolic_header.idnMax;
1841 oinfo->external_dnr = iinfo->external_dnr;
1843 oinfo->symbolic_header.ipdMax = iinfo->symbolic_header.ipdMax;
1844 oinfo->external_pdr = iinfo->external_pdr;
1846 oinfo->symbolic_header.isymMax = iinfo->symbolic_header.isymMax;
1847 oinfo->external_sym = iinfo->external_sym;
1849 oinfo->symbolic_header.ioptMax = iinfo->symbolic_header.ioptMax;
1850 oinfo->external_opt = iinfo->external_opt;
1852 oinfo->symbolic_header.iauxMax = iinfo->symbolic_header.iauxMax;
1853 oinfo->external_aux = iinfo->external_aux;
1855 oinfo->symbolic_header.issMax = iinfo->symbolic_header.issMax;
1856 oinfo->ss = iinfo->ss;
1858 oinfo->symbolic_header.ifdMax = iinfo->symbolic_header.ifdMax;
1859 oinfo->external_fdr = iinfo->external_fdr;
1861 oinfo->symbolic_header.crfd = iinfo->symbolic_header.crfd;
1862 oinfo->external_rfd = iinfo->external_rfd;
1866 /* We are discarding all the local symbol information. Look
1867 through the external symbols and remove all references to FDR
1868 or aux information. */
1869 c = bfd_get_symcount (obfd);
1870 sym_ptr_ptr = bfd_get_outsymbols (obfd);
1871 for (; c > 0; c--, sym_ptr_ptr++)
1875 (*(ecoff_backend (obfd)->debug_swap.swap_ext_in))
1876 (obfd, ecoffsymbol (*sym_ptr_ptr)->native, &esym);
1878 esym.asym.index = indexNil;
1879 (*(ecoff_backend (obfd)->debug_swap.swap_ext_out))
1880 (obfd, &esym, ecoffsymbol (*sym_ptr_ptr)->native);
1887 /* Set the architecture. The supported architecture is stored in the
1888 backend pointer. We always set the architecture anyhow, since many
1889 callers ignore the return value. */
1892 _bfd_ecoff_set_arch_mach (bfd *abfd,
1893 enum bfd_architecture arch,
1894 unsigned long machine)
1896 bfd_default_set_arch_mach (abfd, arch, machine);
1897 return arch == ecoff_backend (abfd)->arch;
1900 /* Get the size of the section headers. */
1903 _bfd_ecoff_sizeof_headers (bfd *abfd,
1904 struct bfd_link_info *info ATTRIBUTE_UNUSED)
1911 for (current = abfd->sections;
1913 current = current->next)
1916 ret = (bfd_coff_filhsz (abfd)
1917 + bfd_coff_aoutsz (abfd)
1918 + c * bfd_coff_scnhsz (abfd));
1919 return (int) BFD_ALIGN (ret, 16);
1922 /* Get the contents of a section. */
1925 _bfd_ecoff_get_section_contents (bfd *abfd,
1929 bfd_size_type count)
1931 return _bfd_generic_get_section_contents (abfd, section, location,
1935 /* Sort sections by VMA, but put SEC_ALLOC sections first. This is
1936 called via qsort. */
1939 ecoff_sort_hdrs (const void * arg1, const void * arg2)
1941 const asection *hdr1 = *(const asection **) arg1;
1942 const asection *hdr2 = *(const asection **) arg2;
1944 if ((hdr1->flags & SEC_ALLOC) != 0)
1946 if ((hdr2->flags & SEC_ALLOC) == 0)
1951 if ((hdr2->flags & SEC_ALLOC) != 0)
1954 if (hdr1->vma < hdr2->vma)
1956 else if (hdr1->vma > hdr2->vma)
1962 /* Calculate the file position for each section, and set
1966 ecoff_compute_section_file_positions (bfd *abfd)
1968 file_ptr sofar, file_sofar;
1969 asection **sorted_hdrs;
1973 bfd_boolean rdata_in_text;
1974 bfd_boolean first_data, first_nonalloc;
1975 const bfd_vma round = ecoff_backend (abfd)->round;
1978 sofar = _bfd_ecoff_sizeof_headers (abfd, NULL);
1981 /* Sort the sections by VMA. */
1982 amt = abfd->section_count;
1983 amt *= sizeof (asection *);
1984 sorted_hdrs = (asection **) bfd_malloc (amt);
1985 if (sorted_hdrs == NULL)
1987 for (current = abfd->sections, i = 0;
1989 current = current->next, i++)
1990 sorted_hdrs[i] = current;
1991 BFD_ASSERT (i == abfd->section_count);
1993 qsort (sorted_hdrs, abfd->section_count, sizeof (asection *),
1996 /* Some versions of the OSF linker put the .rdata section in the
1997 text segment, and some do not. */
1998 rdata_in_text = ecoff_backend (abfd)->rdata_in_text;
2001 for (i = 0; i < abfd->section_count; i++)
2003 current = sorted_hdrs[i];
2004 if (streq (current->name, _RDATA))
2006 if ((current->flags & SEC_CODE) == 0
2007 && ! streq (current->name, _PDATA)
2008 && ! streq (current->name, _RCONST))
2010 rdata_in_text = FALSE;
2015 ecoff_data (abfd)->rdata_in_text = rdata_in_text;
2018 first_nonalloc = TRUE;
2019 for (i = 0; i < abfd->section_count; i++)
2021 unsigned int alignment_power;
2023 current = sorted_hdrs[i];
2025 /* For the Alpha ECOFF .pdata section the lnnoptr field is
2026 supposed to indicate the number of .pdata entries that are
2027 really in the section. Each entry is 8 bytes. We store this
2028 away in line_filepos before increasing the section size. */
2029 if (streq (current->name, _PDATA))
2030 current->line_filepos = current->size / 8;
2032 alignment_power = current->alignment_power;
2034 /* On Ultrix, the data sections in an executable file must be
2035 aligned to a page boundary within the file. This does not
2036 affect the section size, though. FIXME: Does this work for
2037 other platforms? It requires some modification for the
2038 Alpha, because .rdata on the Alpha goes with the text, not
2040 if ((abfd->flags & EXEC_P) != 0
2041 && (abfd->flags & D_PAGED) != 0
2043 && (current->flags & SEC_CODE) == 0
2045 || ! streq (current->name, _RDATA))
2046 && ! streq (current->name, _PDATA)
2047 && ! streq (current->name, _RCONST))
2049 sofar = (sofar + round - 1) &~ (round - 1);
2050 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2053 else if (streq (current->name, _LIB))
2055 /* On Irix 4, the location of contents of the .lib section
2056 from a shared library section is also rounded up to a
2059 sofar = (sofar + round - 1) &~ (round - 1);
2060 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2062 else if (first_nonalloc
2063 && (current->flags & SEC_ALLOC) == 0
2064 && (abfd->flags & D_PAGED) != 0)
2066 /* Skip up to the next page for an unallocated section, such
2067 as the .comment section on the Alpha. This leaves room
2068 for the .bss section. */
2069 first_nonalloc = FALSE;
2070 sofar = (sofar + round - 1) &~ (round - 1);
2071 file_sofar = (file_sofar + round - 1) &~ (round - 1);
2074 /* Align the sections in the file to the same boundary on
2075 which they are aligned in virtual memory. */
2076 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2077 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2078 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
2080 if ((abfd->flags & D_PAGED) != 0
2081 && (current->flags & SEC_ALLOC) != 0)
2083 sofar += (current->vma - sofar) % round;
2084 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2085 file_sofar += (current->vma - file_sofar) % round;
2088 if ((current->flags & (SEC_HAS_CONTENTS | SEC_LOAD)) != 0)
2089 current->filepos = file_sofar;
2091 sofar += current->size;
2092 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2093 file_sofar += current->size;
2095 /* Make sure that this section is of the right size too. */
2097 sofar = BFD_ALIGN (sofar, 1 << alignment_power);
2098 if ((current->flags & SEC_HAS_CONTENTS) != 0)
2099 file_sofar = BFD_ALIGN (file_sofar, 1 << alignment_power);
2100 current->size += sofar - old_sofar;
2106 ecoff_data (abfd)->reloc_filepos = file_sofar;
2111 /* Determine the location of the relocs for all the sections in the
2112 output file, as well as the location of the symbolic debugging
2115 static bfd_size_type
2116 ecoff_compute_reloc_file_positions (bfd *abfd)
2118 const bfd_size_type external_reloc_size =
2119 ecoff_backend (abfd)->external_reloc_size;
2120 file_ptr reloc_base;
2121 bfd_size_type reloc_size;
2125 if (! abfd->output_has_begun)
2127 if (! ecoff_compute_section_file_positions (abfd))
2129 abfd->output_has_begun = TRUE;
2132 reloc_base = ecoff_data (abfd)->reloc_filepos;
2135 for (current = abfd->sections;
2137 current = current->next)
2139 if (current->reloc_count == 0)
2140 current->rel_filepos = 0;
2143 bfd_size_type relsize;
2145 current->rel_filepos = reloc_base;
2146 relsize = current->reloc_count * external_reloc_size;
2147 reloc_size += relsize;
2148 reloc_base += relsize;
2152 sym_base = ecoff_data (abfd)->reloc_filepos + reloc_size;
2154 /* At least on Ultrix, the symbol table of an executable file must
2155 be aligned to a page boundary. FIXME: Is this true on other
2157 if ((abfd->flags & EXEC_P) != 0
2158 && (abfd->flags & D_PAGED) != 0)
2159 sym_base = ((sym_base + ecoff_backend (abfd)->round - 1)
2160 &~ (ecoff_backend (abfd)->round - 1));
2162 ecoff_data (abfd)->sym_filepos = sym_base;
2167 /* Set the contents of a section. */
2170 _bfd_ecoff_set_section_contents (bfd *abfd,
2172 const void * location,
2174 bfd_size_type count)
2178 /* This must be done first, because bfd_set_section_contents is
2179 going to set output_has_begun to TRUE. */
2180 if (! abfd->output_has_begun
2181 && ! ecoff_compute_section_file_positions (abfd))
2184 /* Handle the .lib section specially so that Irix 4 shared libraries
2185 work out. See coff_set_section_contents in coffcode.h. */
2186 if (streq (section->name, _LIB))
2188 bfd_byte *rec, *recend;
2190 rec = (bfd_byte *) location;
2191 recend = rec + count;
2192 while (rec < recend)
2195 rec += bfd_get_32 (abfd, rec) * 4;
2198 BFD_ASSERT (rec == recend);
2204 pos = section->filepos + offset;
2205 if (bfd_seek (abfd, pos, SEEK_SET) != 0
2206 || bfd_bwrite (location, count, abfd) != count)
2212 /* Get the GP value for an ECOFF file. This is a hook used by
2216 bfd_ecoff_get_gp_value (bfd *abfd)
2218 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2219 || bfd_get_format (abfd) != bfd_object)
2221 bfd_set_error (bfd_error_invalid_operation);
2225 return ecoff_data (abfd)->gp;
2228 /* Set the GP value for an ECOFF file. This is a hook used by the
2232 bfd_ecoff_set_gp_value (bfd *abfd, bfd_vma gp_value)
2234 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2235 || bfd_get_format (abfd) != bfd_object)
2237 bfd_set_error (bfd_error_invalid_operation);
2241 ecoff_data (abfd)->gp = gp_value;
2246 /* Set the register masks for an ECOFF file. This is a hook used by
2250 bfd_ecoff_set_regmasks (bfd *abfd,
2251 unsigned long gprmask,
2252 unsigned long fprmask,
2253 unsigned long *cprmask)
2255 ecoff_data_type *tdata;
2257 if (bfd_get_flavour (abfd) != bfd_target_ecoff_flavour
2258 || bfd_get_format (abfd) != bfd_object)
2260 bfd_set_error (bfd_error_invalid_operation);
2264 tdata = ecoff_data (abfd);
2265 tdata->gprmask = gprmask;
2266 tdata->fprmask = fprmask;
2267 if (cprmask != NULL)
2271 for (i = 0; i < 3; i++)
2272 tdata->cprmask[i] = cprmask[i];
2278 /* Get ECOFF EXTR information for an external symbol. This function
2279 is passed to bfd_ecoff_debug_externals. */
2282 ecoff_get_extr (asymbol *sym, EXTR *esym)
2284 ecoff_symbol_type *ecoff_sym_ptr;
2287 if (bfd_asymbol_flavour (sym) != bfd_target_ecoff_flavour
2288 || ecoffsymbol (sym)->native == NULL)
2290 /* Don't include debugging, local, or section symbols. */
2291 if ((sym->flags & BSF_DEBUGGING) != 0
2292 || (sym->flags & BSF_LOCAL) != 0
2293 || (sym->flags & BSF_SECTION_SYM) != 0)
2297 esym->cobol_main = 0;
2298 esym->weakext = (sym->flags & BSF_WEAK) != 0;
2301 /* FIXME: we can do better than this for st and sc. */
2302 esym->asym.st = stGlobal;
2303 esym->asym.sc = scAbs;
2304 esym->asym.reserved = 0;
2305 esym->asym.index = indexNil;
2309 ecoff_sym_ptr = ecoffsymbol (sym);
2311 if (ecoff_sym_ptr->local)
2314 input_bfd = bfd_asymbol_bfd (sym);
2315 (*(ecoff_backend (input_bfd)->debug_swap.swap_ext_in))
2316 (input_bfd, ecoff_sym_ptr->native, esym);
2318 /* If the symbol was defined by the linker, then esym will be
2319 undefined but sym will not be. Get a better class for such a
2321 if ((esym->asym.sc == scUndefined
2322 || esym->asym.sc == scSUndefined)
2323 && ! bfd_is_und_section (bfd_get_section (sym)))
2324 esym->asym.sc = scAbs;
2326 /* Adjust the FDR index for the symbol by that used for the input
2328 if (esym->ifd != -1)
2330 struct ecoff_debug_info *input_debug;
2332 input_debug = &ecoff_data (input_bfd)->debug_info;
2333 BFD_ASSERT (esym->ifd < input_debug->symbolic_header.ifdMax);
2334 if (input_debug->ifdmap != NULL)
2335 esym->ifd = input_debug->ifdmap[esym->ifd];
2341 /* Set the external symbol index. This routine is passed to
2342 bfd_ecoff_debug_externals. */
2345 ecoff_set_index (asymbol *sym, bfd_size_type indx)
2347 ecoff_set_sym_index (sym, indx);
2350 /* Write out an ECOFF file. */
2353 _bfd_ecoff_write_object_contents (bfd *abfd)
2355 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
2356 const bfd_vma round = backend->round;
2357 const bfd_size_type filhsz = bfd_coff_filhsz (abfd);
2358 const bfd_size_type aoutsz = bfd_coff_aoutsz (abfd);
2359 const bfd_size_type scnhsz = bfd_coff_scnhsz (abfd);
2360 const bfd_size_type external_hdr_size
2361 = backend->debug_swap.external_hdr_size;
2362 const bfd_size_type external_reloc_size = backend->external_reloc_size;
2363 void (* const adjust_reloc_out) (bfd *, const arelent *, struct internal_reloc *)
2364 = backend->adjust_reloc_out;
2365 void (* const swap_reloc_out) (bfd *, const struct internal_reloc *, void *)
2366 = backend->swap_reloc_out;
2367 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
2368 HDRR * const symhdr = &debug->symbolic_header;
2371 bfd_size_type reloc_size;
2372 bfd_size_type text_size;
2374 bfd_boolean set_text_start;
2375 bfd_size_type data_size;
2377 bfd_boolean set_data_start;
2378 bfd_size_type bss_size;
2380 void * reloc_buff = NULL;
2381 struct internal_filehdr internal_f;
2382 struct internal_aouthdr internal_a;
2385 /* Determine where the sections and relocs will go in the output
2387 reloc_size = ecoff_compute_reloc_file_positions (abfd);
2390 for (current = abfd->sections;
2392 current = current->next)
2394 current->target_index = count;
2398 if ((abfd->flags & D_PAGED) != 0)
2399 text_size = _bfd_ecoff_sizeof_headers (abfd, NULL);
2403 set_text_start = FALSE;
2406 set_data_start = FALSE;
2409 /* Write section headers to the file. */
2411 /* Allocate buff big enough to hold a section header,
2412 file header, or a.out header. */
2421 buff = bfd_malloc (siz);
2426 internal_f.f_nscns = 0;
2427 if (bfd_seek (abfd, (file_ptr) (filhsz + aoutsz), SEEK_SET) != 0)
2430 for (current = abfd->sections;
2432 current = current->next)
2434 struct internal_scnhdr section;
2437 ++internal_f.f_nscns;
2439 strncpy (section.s_name, current->name, sizeof section.s_name);
2441 /* This seems to be correct for Irix 4 shared libraries. */
2442 vma = bfd_get_section_vma (abfd, current);
2443 if (streq (current->name, _LIB))
2444 section.s_vaddr = 0;
2446 section.s_vaddr = vma;
2448 section.s_paddr = current->lma;
2449 section.s_size = current->size;
2451 /* If this section is unloadable then the scnptr will be 0. */
2452 if ((current->flags & (SEC_LOAD | SEC_HAS_CONTENTS)) == 0)
2453 section.s_scnptr = 0;
2455 section.s_scnptr = current->filepos;
2456 section.s_relptr = current->rel_filepos;
2458 /* FIXME: the lnnoptr of the .sbss or .sdata section of an
2459 object file produced by the assembler is supposed to point to
2460 information about how much room is required by objects of
2461 various different sizes. I think this only matters if we
2462 want the linker to compute the best size to use, or
2463 something. I don't know what happens if the information is
2465 if (! streq (current->name, _PDATA))
2466 section.s_lnnoptr = 0;
2469 /* The Alpha ECOFF .pdata section uses the lnnoptr field to
2470 hold the number of entries in the section (each entry is
2471 8 bytes). We stored this in the line_filepos field in
2472 ecoff_compute_section_file_positions. */
2473 section.s_lnnoptr = current->line_filepos;
2476 section.s_nreloc = current->reloc_count;
2477 section.s_nlnno = 0;
2478 section.s_flags = ecoff_sec_to_styp_flags (current->name,
2481 if (bfd_coff_swap_scnhdr_out (abfd, (void *) §ion, buff) == 0
2482 || bfd_bwrite (buff, scnhsz, abfd) != scnhsz)
2485 if ((section.s_flags & STYP_TEXT) != 0
2486 || ((section.s_flags & STYP_RDATA) != 0
2487 && ecoff_data (abfd)->rdata_in_text)
2488 || section.s_flags == STYP_PDATA
2489 || (section.s_flags & STYP_DYNAMIC) != 0
2490 || (section.s_flags & STYP_LIBLIST) != 0
2491 || (section.s_flags & STYP_RELDYN) != 0
2492 || section.s_flags == STYP_CONFLIC
2493 || (section.s_flags & STYP_DYNSTR) != 0
2494 || (section.s_flags & STYP_DYNSYM) != 0
2495 || (section.s_flags & STYP_HASH) != 0
2496 || (section.s_flags & STYP_ECOFF_INIT) != 0
2497 || (section.s_flags & STYP_ECOFF_FINI) != 0
2498 || section.s_flags == STYP_RCONST)
2500 text_size += current->size;
2501 if (! set_text_start || text_start > vma)
2504 set_text_start = TRUE;
2507 else if ((section.s_flags & STYP_RDATA) != 0
2508 || (section.s_flags & STYP_DATA) != 0
2509 || (section.s_flags & STYP_LITA) != 0
2510 || (section.s_flags & STYP_LIT8) != 0
2511 || (section.s_flags & STYP_LIT4) != 0
2512 || (section.s_flags & STYP_SDATA) != 0
2513 || section.s_flags == STYP_XDATA
2514 || (section.s_flags & STYP_GOT) != 0)
2516 data_size += current->size;
2517 if (! set_data_start || data_start > vma)
2520 set_data_start = TRUE;
2523 else if ((section.s_flags & STYP_BSS) != 0
2524 || (section.s_flags & STYP_SBSS) != 0)
2525 bss_size += current->size;
2526 else if (section.s_flags == 0
2527 || (section.s_flags & STYP_ECOFF_LIB) != 0
2528 || section.s_flags == STYP_COMMENT)
2534 /* Set up the file header. */
2535 internal_f.f_magic = ecoff_get_magic (abfd);
2537 /* We will NOT put a fucking timestamp in the header here. Every
2538 time you put it back, I will come in and take it out again. I'm
2539 sorry. This field does not belong here. We fill it with a 0 so
2540 it compares the same but is not a reasonable time. --
2542 internal_f.f_timdat = 0;
2544 if (bfd_get_symcount (abfd) != 0)
2546 /* The ECOFF f_nsyms field is not actually the number of
2547 symbols, it's the size of symbolic information header. */
2548 internal_f.f_nsyms = external_hdr_size;
2549 internal_f.f_symptr = ecoff_data (abfd)->sym_filepos;
2553 internal_f.f_nsyms = 0;
2554 internal_f.f_symptr = 0;
2557 internal_f.f_opthdr = aoutsz;
2559 internal_f.f_flags = F_LNNO;
2560 if (reloc_size == 0)
2561 internal_f.f_flags |= F_RELFLG;
2562 if (bfd_get_symcount (abfd) == 0)
2563 internal_f.f_flags |= F_LSYMS;
2564 if (abfd->flags & EXEC_P)
2565 internal_f.f_flags |= F_EXEC;
2567 if (bfd_little_endian (abfd))
2568 internal_f.f_flags |= F_AR32WR;
2570 internal_f.f_flags |= F_AR32W;
2572 /* Set up the ``optional'' header. */
2573 if ((abfd->flags & D_PAGED) != 0)
2574 internal_a.magic = ECOFF_AOUT_ZMAGIC;
2576 internal_a.magic = ECOFF_AOUT_OMAGIC;
2578 /* FIXME: Is this really correct? */
2579 internal_a.vstamp = symhdr->vstamp;
2581 /* At least on Ultrix, these have to be rounded to page boundaries.
2582 FIXME: Is this true on other platforms? */
2583 if ((abfd->flags & D_PAGED) != 0)
2585 internal_a.tsize = (text_size + round - 1) &~ (round - 1);
2586 internal_a.text_start = text_start &~ (round - 1);
2587 internal_a.dsize = (data_size + round - 1) &~ (round - 1);
2588 internal_a.data_start = data_start &~ (round - 1);
2592 internal_a.tsize = text_size;
2593 internal_a.text_start = text_start;
2594 internal_a.dsize = data_size;
2595 internal_a.data_start = data_start;
2598 /* On Ultrix, the initial portions of the .sbss and .bss segments
2599 are at the end of the data section. The bsize field in the
2600 optional header records how many bss bytes are required beyond
2601 those in the data section. The value is not rounded to a page
2603 if (bss_size < internal_a.dsize - data_size)
2606 bss_size -= internal_a.dsize - data_size;
2607 internal_a.bsize = bss_size;
2608 internal_a.bss_start = internal_a.data_start + internal_a.dsize;
2610 internal_a.entry = bfd_get_start_address (abfd);
2612 internal_a.gp_value = ecoff_data (abfd)->gp;
2614 internal_a.gprmask = ecoff_data (abfd)->gprmask;
2615 internal_a.fprmask = ecoff_data (abfd)->fprmask;
2616 for (i = 0; i < 4; i++)
2617 internal_a.cprmask[i] = ecoff_data (abfd)->cprmask[i];
2619 /* Let the backend adjust the headers if necessary. */
2620 if (backend->adjust_headers)
2622 if (! (*backend->adjust_headers) (abfd, &internal_f, &internal_a))
2626 /* Write out the file header and the optional header. */
2627 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0)
2630 bfd_coff_swap_filehdr_out (abfd, (void *) &internal_f, buff);
2631 if (bfd_bwrite (buff, filhsz, abfd) != filhsz)
2634 bfd_coff_swap_aouthdr_out (abfd, (void *) &internal_a, buff);
2635 if (bfd_bwrite (buff, aoutsz, abfd) != aoutsz)
2638 /* Build the external symbol information. This must be done before
2639 writing out the relocs so that we know the symbol indices. We
2640 don't do this if this BFD was created by the backend linker,
2641 since it will have already handled the symbols and relocs. */
2642 if (! ecoff_data (abfd)->linker)
2644 symhdr->iextMax = 0;
2645 symhdr->issExtMax = 0;
2646 debug->external_ext = debug->external_ext_end = NULL;
2647 debug->ssext = debug->ssext_end = NULL;
2648 if (! bfd_ecoff_debug_externals (abfd, debug, &backend->debug_swap,
2649 (abfd->flags & EXEC_P) == 0,
2650 ecoff_get_extr, ecoff_set_index))
2653 /* Write out the relocs. */
2654 for (current = abfd->sections;
2656 current = current->next)
2658 arelent **reloc_ptr_ptr;
2659 arelent **reloc_end;
2663 if (current->reloc_count == 0)
2666 amt = current->reloc_count * external_reloc_size;
2667 reloc_buff = bfd_alloc (abfd, amt);
2668 if (reloc_buff == NULL)
2671 reloc_ptr_ptr = current->orelocation;
2672 reloc_end = reloc_ptr_ptr + current->reloc_count;
2673 out_ptr = (char *) reloc_buff;
2676 reloc_ptr_ptr < reloc_end;
2677 reloc_ptr_ptr++, out_ptr += external_reloc_size)
2681 struct internal_reloc in;
2683 memset ((void *) &in, 0, sizeof in);
2685 reloc = *reloc_ptr_ptr;
2686 sym = *reloc->sym_ptr_ptr;
2688 /* If the howto field has not been initialised then skip this reloc.
2689 This assumes that an error message has been issued elsewhere. */
2690 if (reloc->howto == NULL)
2693 in.r_vaddr = (reloc->address
2694 + bfd_get_section_vma (abfd, current));
2695 in.r_type = reloc->howto->type;
2697 if ((sym->flags & BSF_SECTION_SYM) == 0)
2699 in.r_symndx = ecoff_get_sym_index (*reloc->sym_ptr_ptr);
2713 { _TEXT, RELOC_SECTION_TEXT },
2714 { _RDATA, RELOC_SECTION_RDATA },
2715 { _DATA, RELOC_SECTION_DATA },
2716 { _SDATA, RELOC_SECTION_SDATA },
2717 { _SBSS, RELOC_SECTION_SBSS },
2718 { _BSS, RELOC_SECTION_BSS },
2719 { _INIT, RELOC_SECTION_INIT },
2720 { _LIT8, RELOC_SECTION_LIT8 },
2721 { _LIT4, RELOC_SECTION_LIT4 },
2722 { _XDATA, RELOC_SECTION_XDATA },
2723 { _PDATA, RELOC_SECTION_PDATA },
2724 { _FINI, RELOC_SECTION_FINI },
2725 { _LITA, RELOC_SECTION_LITA },
2726 { "*ABS*", RELOC_SECTION_ABS },
2727 { _RCONST, RELOC_SECTION_RCONST }
2730 name = bfd_get_section_name (abfd, bfd_get_section (sym));
2732 for (j = 0; j < ARRAY_SIZE (section_symndx); j++)
2733 if (streq (name, section_symndx[j].name))
2735 in.r_symndx = section_symndx[j].r_symndx;
2739 if (j == ARRAY_SIZE (section_symndx))
2744 (*adjust_reloc_out) (abfd, reloc, &in);
2746 (*swap_reloc_out) (abfd, &in, (void *) out_ptr);
2749 if (bfd_seek (abfd, current->rel_filepos, SEEK_SET) != 0)
2751 amt = current->reloc_count * external_reloc_size;
2752 if (bfd_bwrite (reloc_buff, amt, abfd) != amt)
2754 bfd_release (abfd, reloc_buff);
2758 /* Write out the symbolic debugging information. */
2759 if (bfd_get_symcount (abfd) > 0)
2761 /* Write out the debugging information. */
2762 if (! bfd_ecoff_write_debug (abfd, debug, &backend->debug_swap,
2763 ecoff_data (abfd)->sym_filepos))
2768 /* The .bss section of a demand paged executable must receive an
2769 entire page. If there are symbols, the symbols will start on the
2770 next page. If there are no symbols, we must fill out the page by
2772 if (bfd_get_symcount (abfd) == 0
2773 && (abfd->flags & EXEC_P) != 0
2774 && (abfd->flags & D_PAGED) != 0)
2778 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2781 if (bfd_bread (&c, (bfd_size_type) 1, abfd) == 0)
2783 if (bfd_seek (abfd, (file_ptr) ecoff_data (abfd)->sym_filepos - 1,
2786 if (bfd_bwrite (&c, (bfd_size_type) 1, abfd) != 1)
2790 if (reloc_buff != NULL)
2791 bfd_release (abfd, reloc_buff);
2796 if (reloc_buff != NULL)
2797 bfd_release (abfd, reloc_buff);
2803 /* Archive handling. ECOFF uses what appears to be a unique type of
2804 archive header (armap). The byte ordering of the armap and the
2805 contents are encoded in the name of the armap itself. At least for
2806 now, we only support archives with the same byte ordering in the
2807 armap and the contents.
2809 The first four bytes in the armap are the number of symbol
2810 definitions. This is always a power of two.
2812 This is followed by the symbol definitions. Each symbol definition
2813 occupies 8 bytes. The first four bytes are the offset from the
2814 start of the armap strings to the null-terminated string naming
2815 this symbol. The second four bytes are the file offset to the
2816 archive member which defines this symbol. If the second four bytes
2817 are 0, then this is not actually a symbol definition, and it should
2820 The symbols are hashed into the armap with a closed hashing scheme.
2821 See the functions below for the details of the algorithm.
2823 After the symbol definitions comes four bytes holding the size of
2824 the string table, followed by the string table itself. */
2826 /* The name of an archive headers looks like this:
2827 __________E[BL]E[BL]_ (with a trailing space).
2828 The trailing space is changed to an X if the archive is changed to
2829 indicate that the armap is out of date.
2831 The Alpha seems to use ________64E[BL]E[BL]_. */
2833 #define ARMAP_BIG_ENDIAN 'B'
2834 #define ARMAP_LITTLE_ENDIAN 'L'
2835 #define ARMAP_MARKER 'E'
2836 #define ARMAP_START_LENGTH 10
2837 #define ARMAP_HEADER_MARKER_INDEX 10
2838 #define ARMAP_HEADER_ENDIAN_INDEX 11
2839 #define ARMAP_OBJECT_MARKER_INDEX 12
2840 #define ARMAP_OBJECT_ENDIAN_INDEX 13
2841 #define ARMAP_END_INDEX 14
2842 #define ARMAP_END "_ "
2844 /* This is a magic number used in the hashing algorithm. */
2845 #define ARMAP_HASH_MAGIC 0x9dd68ab5
2847 /* This returns the hash value to use for a string. It also sets
2848 *REHASH to the rehash adjustment if the first slot is taken. SIZE
2849 is the number of entries in the hash table, and HLOG is the log
2853 ecoff_armap_hash (const char *s,
2854 unsigned int *rehash,
2864 hash = ((hash >> 27) | (hash << 5)) + *s++;
2865 hash *= ARMAP_HASH_MAGIC;
2866 *rehash = (hash & (size - 1)) | 1;
2867 return hash >> (32 - hlog);
2870 /* Read in the armap. */
2873 _bfd_ecoff_slurp_armap (bfd *abfd)
2877 struct areltdata *mapdata;
2878 bfd_size_type parsed_size;
2880 struct artdata *ardata;
2887 /* Get the name of the first element. */
2888 i = bfd_bread ((void *) nextname, (bfd_size_type) 16, abfd);
2894 if (bfd_seek (abfd, (file_ptr) -16, SEEK_CUR) != 0)
2897 /* Irix 4.0.5F apparently can use either an ECOFF armap or a
2898 standard COFF armap. We could move the ECOFF armap stuff into
2899 bfd_slurp_armap, but that seems inappropriate since no other
2900 target uses this format. Instead, we check directly for a COFF
2902 if (CONST_STRNEQ (nextname, "/ "))
2903 return bfd_slurp_armap (abfd);
2905 /* See if the first element is an armap. */
2906 if (! strneq (nextname, ecoff_backend (abfd)->armap_start, ARMAP_START_LENGTH)
2907 || nextname[ARMAP_HEADER_MARKER_INDEX] != ARMAP_MARKER
2908 || (nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
2909 && nextname[ARMAP_HEADER_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
2910 || nextname[ARMAP_OBJECT_MARKER_INDEX] != ARMAP_MARKER
2911 || (nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_BIG_ENDIAN
2912 && nextname[ARMAP_OBJECT_ENDIAN_INDEX] != ARMAP_LITTLE_ENDIAN)
2913 || ! strneq (nextname + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1))
2915 bfd_has_map (abfd) = FALSE;
2919 /* Make sure we have the right byte ordering. */
2920 if (((nextname[ARMAP_HEADER_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
2921 ^ (bfd_header_big_endian (abfd)))
2922 || ((nextname[ARMAP_OBJECT_ENDIAN_INDEX] == ARMAP_BIG_ENDIAN)
2923 ^ (bfd_big_endian (abfd))))
2925 bfd_set_error (bfd_error_wrong_format);
2929 /* Read in the armap. */
2930 ardata = bfd_ardata (abfd);
2931 mapdata = (struct areltdata *) _bfd_read_ar_hdr (abfd);
2932 if (mapdata == NULL)
2934 parsed_size = mapdata->parsed_size;
2937 raw_armap = (char *) bfd_alloc (abfd, parsed_size);
2938 if (raw_armap == NULL)
2941 if (bfd_bread ((void *) raw_armap, parsed_size, abfd) != parsed_size)
2943 if (bfd_get_error () != bfd_error_system_call)
2944 bfd_set_error (bfd_error_malformed_archive);
2945 bfd_release (abfd, (void *) raw_armap);
2949 ardata->tdata = (void *) raw_armap;
2951 count = H_GET_32 (abfd, raw_armap);
2953 ardata->symdef_count = 0;
2954 ardata->cache = NULL;
2956 /* This code used to overlay the symdefs over the raw archive data,
2957 but that doesn't work on a 64 bit host. */
2958 stringbase = raw_armap + count * 8 + 8;
2960 #ifdef CHECK_ARMAP_HASH
2964 /* Double check that I have the hashing algorithm right by making
2965 sure that every symbol can be looked up successfully. */
2967 for (i = 1; i < count; i <<= 1)
2969 BFD_ASSERT (i == count);
2971 raw_ptr = raw_armap + 4;
2972 for (i = 0; i < count; i++, raw_ptr += 8)
2974 unsigned int name_offset, file_offset;
2975 unsigned int hash, rehash, srch;
2977 name_offset = H_GET_32 (abfd, raw_ptr);
2978 file_offset = H_GET_32 (abfd, (raw_ptr + 4));
2979 if (file_offset == 0)
2981 hash = ecoff_armap_hash (stringbase + name_offset, &rehash, count,
2986 /* See if we can rehash to this location. */
2987 for (srch = (hash + rehash) & (count - 1);
2988 srch != hash && srch != i;
2989 srch = (srch + rehash) & (count - 1))
2990 BFD_ASSERT (H_GET_32 (abfd, (raw_armap + 8 + srch * 8)) != 0);
2991 BFD_ASSERT (srch == i);
2995 #endif /* CHECK_ARMAP_HASH */
2997 raw_ptr = raw_armap + 4;
2998 for (i = 0; i < count; i++, raw_ptr += 8)
2999 if (H_GET_32 (abfd, (raw_ptr + 4)) != 0)
3000 ++ardata->symdef_count;
3002 amt = ardata->symdef_count;
3003 amt *= sizeof (carsym);
3004 symdef_ptr = (carsym *) bfd_alloc (abfd, amt);
3008 ardata->symdefs = symdef_ptr;
3010 raw_ptr = raw_armap + 4;
3011 for (i = 0; i < count; i++, raw_ptr += 8)
3013 unsigned int name_offset, file_offset;
3015 file_offset = H_GET_32 (abfd, (raw_ptr + 4));
3016 if (file_offset == 0)
3018 name_offset = H_GET_32 (abfd, raw_ptr);
3019 symdef_ptr->name = stringbase + name_offset;
3020 symdef_ptr->file_offset = file_offset;
3024 ardata->first_file_filepos = bfd_tell (abfd);
3025 /* Pad to an even boundary. */
3026 ardata->first_file_filepos += ardata->first_file_filepos % 2;
3028 bfd_has_map (abfd) = TRUE;
3033 /* Write out an armap. */
3036 _bfd_ecoff_write_armap (bfd *abfd,
3037 unsigned int elength,
3039 unsigned int orl_count,
3042 unsigned int hashsize, hashlog;
3043 bfd_size_type symdefsize;
3045 unsigned int stringsize;
3046 unsigned int mapsize;
3049 struct stat statbuf;
3052 bfd_byte *hashtable;
3056 /* Ultrix appears to use as a hash table size the least power of two
3057 greater than twice the number of entries. */
3058 for (hashlog = 0; ((unsigned int) 1 << hashlog) <= 2 * orl_count; hashlog++)
3060 hashsize = 1 << hashlog;
3062 symdefsize = hashsize * 8;
3064 stringsize = stridx + padit;
3066 /* Include 8 bytes to store symdefsize and stringsize in output. */
3067 mapsize = symdefsize + stringsize + 8;
3069 firstreal = SARMAG + sizeof (struct ar_hdr) + mapsize + elength;
3071 memset ((void *) &hdr, 0, sizeof hdr);
3073 /* Work out the ECOFF armap name. */
3074 strcpy (hdr.ar_name, ecoff_backend (abfd)->armap_start);
3075 hdr.ar_name[ARMAP_HEADER_MARKER_INDEX] = ARMAP_MARKER;
3076 hdr.ar_name[ARMAP_HEADER_ENDIAN_INDEX] =
3077 (bfd_header_big_endian (abfd)
3079 : ARMAP_LITTLE_ENDIAN);
3080 hdr.ar_name[ARMAP_OBJECT_MARKER_INDEX] = ARMAP_MARKER;
3081 hdr.ar_name[ARMAP_OBJECT_ENDIAN_INDEX] =
3082 bfd_big_endian (abfd) ? ARMAP_BIG_ENDIAN : ARMAP_LITTLE_ENDIAN;
3083 memcpy (hdr.ar_name + ARMAP_END_INDEX, ARMAP_END, sizeof ARMAP_END - 1);
3085 /* Write the timestamp of the archive header to be just a little bit
3086 later than the timestamp of the file, otherwise the linker will
3087 complain that the index is out of date. Actually, the Ultrix
3088 linker just checks the archive name; the GNU linker may check the
3090 stat (abfd->filename, &statbuf);
3091 _bfd_ar_spacepad (hdr.ar_date, sizeof (hdr.ar_date), "%ld",
3092 (long) (statbuf.st_mtime + 60));
3094 /* The DECstation uses zeroes for the uid, gid and mode of the
3096 hdr.ar_uid[0] = '0';
3097 hdr.ar_gid[0] = '0';
3098 /* Building gcc ends up extracting the armap as a file - twice. */
3099 hdr.ar_mode[0] = '6';
3100 hdr.ar_mode[1] = '4';
3101 hdr.ar_mode[2] = '4';
3103 _bfd_ar_spacepad (hdr.ar_size, sizeof (hdr.ar_size), "%-10ld", mapsize);
3105 hdr.ar_fmag[0] = '`';
3106 hdr.ar_fmag[1] = '\012';
3108 /* Turn all null bytes in the header into spaces. */
3109 for (i = 0; i < sizeof (struct ar_hdr); i++)
3110 if (((char *) (&hdr))[i] == '\0')
3111 (((char *) (&hdr))[i]) = ' ';
3113 if (bfd_bwrite ((void *) &hdr, (bfd_size_type) sizeof (struct ar_hdr), abfd)
3114 != sizeof (struct ar_hdr))
3117 H_PUT_32 (abfd, hashsize, temp);
3118 if (bfd_bwrite ((void *) temp, (bfd_size_type) 4, abfd) != 4)
3121 hashtable = (bfd_byte *) bfd_zalloc (abfd, symdefsize);
3125 current = abfd->archive_head;
3127 for (i = 0; i < orl_count; i++)
3129 unsigned int hash, rehash = 0;
3131 /* Advance firstreal to the file position of this archive
3133 if (map[i].u.abfd != last_elt)
3137 firstreal += arelt_size (current) + sizeof (struct ar_hdr);
3138 firstreal += firstreal % 2;
3139 current = current->archive_next;
3141 while (current != map[i].u.abfd);
3146 hash = ecoff_armap_hash (*map[i].name, &rehash, hashsize, hashlog);
3147 if (H_GET_32 (abfd, (hashtable + (hash * 8) + 4)) != 0)
3151 /* The desired slot is already taken. */
3152 for (srch = (hash + rehash) & (hashsize - 1);
3154 srch = (srch + rehash) & (hashsize - 1))
3155 if (H_GET_32 (abfd, (hashtable + (srch * 8) + 4)) == 0)
3158 BFD_ASSERT (srch != hash);
3163 H_PUT_32 (abfd, map[i].namidx, (hashtable + hash * 8));
3164 H_PUT_32 (abfd, firstreal, (hashtable + hash * 8 + 4));
3167 if (bfd_bwrite ((void *) hashtable, symdefsize, abfd) != symdefsize)
3170 bfd_release (abfd, hashtable);
3172 /* Now write the strings. */
3173 H_PUT_32 (abfd, stringsize, temp);
3174 if (bfd_bwrite ((void *) temp, (bfd_size_type) 4, abfd) != 4)
3176 for (i = 0; i < orl_count; i++)
3180 len = strlen (*map[i].name) + 1;
3181 if (bfd_bwrite ((void *) (*map[i].name), len, abfd) != len)
3185 /* The spec sez this should be a newline. But in order to be
3186 bug-compatible for DECstation ar we use a null. */
3189 if (bfd_bwrite ("", (bfd_size_type) 1, abfd) != 1)
3196 /* ECOFF linker code. */
3198 /* Routine to create an entry in an ECOFF link hash table. */
3200 static struct bfd_hash_entry *
3201 ecoff_link_hash_newfunc (struct bfd_hash_entry *entry,
3202 struct bfd_hash_table *table,
3205 struct ecoff_link_hash_entry *ret = (struct ecoff_link_hash_entry *) entry;
3207 /* Allocate the structure if it has not already been allocated by a
3210 ret = ((struct ecoff_link_hash_entry *)
3211 bfd_hash_allocate (table, sizeof (struct ecoff_link_hash_entry)));
3215 /* Call the allocation method of the superclass. */
3216 ret = ((struct ecoff_link_hash_entry *)
3217 _bfd_link_hash_newfunc ((struct bfd_hash_entry *) ret,
3222 /* Set local fields. */
3228 memset ((void *) &ret->esym, 0, sizeof ret->esym);
3230 return (struct bfd_hash_entry *) ret;
3233 /* Create an ECOFF link hash table. */
3235 struct bfd_link_hash_table *
3236 _bfd_ecoff_bfd_link_hash_table_create (bfd *abfd)
3238 struct ecoff_link_hash_table *ret;
3239 bfd_size_type amt = sizeof (struct ecoff_link_hash_table);
3241 ret = (struct ecoff_link_hash_table *) bfd_malloc (amt);
3244 if (!_bfd_link_hash_table_init (&ret->root, abfd,
3245 ecoff_link_hash_newfunc,
3246 sizeof (struct ecoff_link_hash_entry)))
3254 /* Look up an entry in an ECOFF link hash table. */
3256 #define ecoff_link_hash_lookup(table, string, create, copy, follow) \
3257 ((struct ecoff_link_hash_entry *) \
3258 bfd_link_hash_lookup (&(table)->root, (string), (create), (copy), (follow)))
3260 /* Get the ECOFF link hash table from the info structure. This is
3263 #define ecoff_hash_table(p) ((struct ecoff_link_hash_table *) ((p)->hash))
3265 /* Add the external symbols of an object file to the global linker
3266 hash table. The external symbols and strings we are passed are
3267 just allocated on the stack, and will be discarded. We must
3268 explicitly save any information we may need later on in the link.
3269 We do not want to read the external symbol information again. */
3272 ecoff_link_add_externals (bfd *abfd,
3273 struct bfd_link_info *info,
3274 void * external_ext,
3277 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3278 void (* const swap_ext_in) (bfd *, void *, EXTR *)
3279 = backend->debug_swap.swap_ext_in;
3280 bfd_size_type external_ext_size = backend->debug_swap.external_ext_size;
3281 unsigned long ext_count;
3282 struct bfd_link_hash_entry **sym_hash;
3287 ext_count = ecoff_data (abfd)->debug_info.symbolic_header.iextMax;
3290 amt *= sizeof (struct bfd_link_hash_entry *);
3291 sym_hash = (struct bfd_link_hash_entry **) bfd_alloc (abfd, amt);
3294 ecoff_data (abfd)->sym_hashes = (struct ecoff_link_hash_entry **) sym_hash;
3296 ext_ptr = (char *) external_ext;
3297 ext_end = ext_ptr + ext_count * external_ext_size;
3298 for (; ext_ptr < ext_end; ext_ptr += external_ext_size, sym_hash++)
3305 struct ecoff_link_hash_entry *h;
3309 (*swap_ext_in) (abfd, (void *) ext_ptr, &esym);
3311 /* Skip debugging symbols. */
3313 switch (esym.asym.st)
3329 /* Get the information for this symbol. */
3330 value = esym.asym.value;
3331 switch (esym.asym.sc)
3351 section = bfd_make_section_old_way (abfd, _TEXT);
3352 value -= section->vma;
3355 section = bfd_make_section_old_way (abfd, _DATA);
3356 value -= section->vma;
3359 section = bfd_make_section_old_way (abfd, _BSS);
3360 value -= section->vma;
3363 section = bfd_abs_section_ptr;
3366 section = bfd_und_section_ptr;
3369 section = bfd_make_section_old_way (abfd, _SDATA);
3370 value -= section->vma;
3373 section = bfd_make_section_old_way (abfd, _SBSS);
3374 value -= section->vma;
3377 section = bfd_make_section_old_way (abfd, _RDATA);
3378 value -= section->vma;
3381 if (value > ecoff_data (abfd)->gp_size)
3383 section = bfd_com_section_ptr;
3388 if (ecoff_scom_section.name == NULL)
3390 /* Initialize the small common section. */
3391 ecoff_scom_section.name = SCOMMON;
3392 ecoff_scom_section.flags = SEC_IS_COMMON;
3393 ecoff_scom_section.output_section = &ecoff_scom_section;
3394 ecoff_scom_section.symbol = &ecoff_scom_symbol;
3395 ecoff_scom_section.symbol_ptr_ptr = &ecoff_scom_symbol_ptr;
3396 ecoff_scom_symbol.name = SCOMMON;
3397 ecoff_scom_symbol.flags = BSF_SECTION_SYM;
3398 ecoff_scom_symbol.section = &ecoff_scom_section;
3399 ecoff_scom_symbol_ptr = &ecoff_scom_symbol;
3401 section = &ecoff_scom_section;
3404 section = bfd_und_section_ptr;
3407 section = bfd_make_section_old_way (abfd, _INIT);
3408 value -= section->vma;
3411 section = bfd_make_section_old_way (abfd, _FINI);
3412 value -= section->vma;
3415 section = bfd_make_section_old_way (abfd, _RCONST);
3416 value -= section->vma;
3420 if (section == NULL)
3423 name = ssext + esym.asym.iss;
3425 if (! (_bfd_generic_link_add_one_symbol
3427 (flagword) (esym.weakext ? BSF_WEAK : BSF_GLOBAL),
3428 section, value, NULL, TRUE, TRUE, sym_hash)))
3431 h = (struct ecoff_link_hash_entry *) *sym_hash;
3433 /* If we are building an ECOFF hash table, save the external
3434 symbol information. */
3435 if (bfd_get_flavour (info->output_bfd) == bfd_get_flavour (abfd))
3438 || (! bfd_is_und_section (section)
3439 && (! bfd_is_com_section (section)
3440 || (h->root.type != bfd_link_hash_defined
3441 && h->root.type != bfd_link_hash_defweak))))
3447 /* Remember whether this symbol was small undefined. */
3448 if (esym.asym.sc == scSUndefined)
3451 /* If this symbol was ever small undefined, it needs to wind
3452 up in a GP relative section. We can't control the
3453 section of a defined symbol, but we can control the
3454 section of a common symbol. This case is actually needed
3455 on Ultrix 4.2 to handle the symbol cred in -lckrb. */
3457 && h->root.type == bfd_link_hash_common
3458 && streq (h->root.u.c.p->section->name, SCOMMON))
3460 h->root.u.c.p->section = bfd_make_section_old_way (abfd,
3462 h->root.u.c.p->section->flags = SEC_ALLOC;
3463 if (h->esym.asym.sc == scCommon)
3464 h->esym.asym.sc = scSCommon;
3472 /* Add symbols from an ECOFF object file to the global linker hash
3476 ecoff_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
3479 bfd_size_type external_ext_size;
3480 void * external_ext = NULL;
3481 bfd_size_type esize;
3485 if (! ecoff_slurp_symbolic_header (abfd))
3488 /* If there are no symbols, we don't want it. */
3489 if (bfd_get_symcount (abfd) == 0)
3492 symhdr = &ecoff_data (abfd)->debug_info.symbolic_header;
3494 /* Read in the external symbols and external strings. */
3495 external_ext_size = ecoff_backend (abfd)->debug_swap.external_ext_size;
3496 esize = symhdr->iextMax * external_ext_size;
3497 external_ext = bfd_malloc (esize);
3498 if (external_ext == NULL && esize != 0)
3501 if (bfd_seek (abfd, (file_ptr) symhdr->cbExtOffset, SEEK_SET) != 0
3502 || bfd_bread (external_ext, esize, abfd) != esize)
3505 ssext = (char *) bfd_malloc ((bfd_size_type) symhdr->issExtMax);
3506 if (ssext == NULL && symhdr->issExtMax != 0)
3509 if (bfd_seek (abfd, (file_ptr) symhdr->cbSsExtOffset, SEEK_SET) != 0
3510 || (bfd_bread (ssext, (bfd_size_type) symhdr->issExtMax, abfd)
3511 != (bfd_size_type) symhdr->issExtMax))
3514 result = ecoff_link_add_externals (abfd, info, external_ext, ssext);
3518 if (external_ext != NULL)
3519 free (external_ext);
3525 if (external_ext != NULL)
3526 free (external_ext);
3530 /* This is called if we used _bfd_generic_link_add_archive_symbols
3531 because we were not dealing with an ECOFF archive. */
3534 ecoff_link_check_archive_element (bfd *abfd,
3535 struct bfd_link_info *info,
3536 struct bfd_link_hash_entry *h,
3538 bfd_boolean *pneeded)
3542 /* Unlike the generic linker, we do not pull in elements because
3543 of common symbols. */
3544 if (h->type != bfd_link_hash_undefined)
3547 /* Include this element. */
3548 if (!(*info->callbacks->add_archive_element) (info, abfd, name, &abfd))
3552 return ecoff_link_add_object_symbols (abfd, info);
3555 /* Add the symbols from an archive file to the global hash table.
3556 This looks through the undefined symbols, looks each one up in the
3557 archive hash table, and adds any associated object file. We do not
3558 use _bfd_generic_link_add_archive_symbols because ECOFF archives
3559 already have a hash table, so there is no reason to construct
3563 ecoff_link_add_archive_symbols (bfd *abfd, struct bfd_link_info *info)
3565 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
3566 const bfd_byte *raw_armap;
3567 struct bfd_link_hash_entry **pundef;
3568 unsigned int armap_count;
3569 unsigned int armap_log;
3571 const bfd_byte *hashtable;
3572 const char *stringbase;
3574 if (! bfd_has_map (abfd))
3576 /* An empty archive is a special case. */
3577 if (bfd_openr_next_archived_file (abfd, NULL) == NULL)
3579 bfd_set_error (bfd_error_no_armap);
3583 /* If we don't have any raw data for this archive, as can happen on
3584 Irix 4.0.5F, we call the generic routine.
3585 FIXME: We should be more clever about this, since someday tdata
3586 may get to something for a generic archive. */
3587 raw_armap = (const bfd_byte *) bfd_ardata (abfd)->tdata;
3588 if (raw_armap == NULL)
3589 return (_bfd_generic_link_add_archive_symbols
3590 (abfd, info, ecoff_link_check_archive_element));
3592 armap_count = H_GET_32 (abfd, raw_armap);
3595 for (i = 1; i < armap_count; i <<= 1)
3597 BFD_ASSERT (i == armap_count);
3599 hashtable = raw_armap + 4;
3600 stringbase = (const char *) raw_armap + armap_count * 8 + 8;
3602 /* Look through the list of undefined symbols. */
3603 pundef = &info->hash->undefs;
3604 while (*pundef != NULL)
3606 struct bfd_link_hash_entry *h;
3607 unsigned int hash, rehash = 0;
3608 unsigned int file_offset;
3614 /* When a symbol is defined, it is not necessarily removed from
3616 if (h->type != bfd_link_hash_undefined
3617 && h->type != bfd_link_hash_common)
3619 /* Remove this entry from the list, for general cleanliness
3620 and because we are going to look through the list again
3621 if we search any more libraries. We can't remove the
3622 entry if it is the tail, because that would lose any
3623 entries we add to the list later on. */
3624 if (*pundef != info->hash->undefs_tail)
3625 *pundef = (*pundef)->u.undef.next;
3627 pundef = &(*pundef)->u.undef.next;
3631 /* Native ECOFF linkers do not pull in archive elements merely
3632 to satisfy common definitions, so neither do we. We leave
3633 them on the list, though, in case we are linking against some
3634 other object format. */
3635 if (h->type != bfd_link_hash_undefined)
3637 pundef = &(*pundef)->u.undef.next;
3641 /* Look for this symbol in the archive hash table. */
3642 hash = ecoff_armap_hash (h->root.string, &rehash, armap_count,
3645 file_offset = H_GET_32 (abfd, hashtable + (hash * 8) + 4);
3646 if (file_offset == 0)
3648 /* Nothing in this slot. */
3649 pundef = &(*pundef)->u.undef.next;
3653 name = stringbase + H_GET_32 (abfd, hashtable + (hash * 8));
3654 if (name[0] != h->root.string[0]
3655 || ! streq (name, h->root.string))
3660 /* That was the wrong symbol. Try rehashing. */
3662 for (srch = (hash + rehash) & (armap_count - 1);
3664 srch = (srch + rehash) & (armap_count - 1))
3666 file_offset = H_GET_32 (abfd, hashtable + (srch * 8) + 4);
3667 if (file_offset == 0)
3669 name = stringbase + H_GET_32 (abfd, hashtable + (srch * 8));
3670 if (name[0] == h->root.string[0]
3671 && streq (name, h->root.string))
3680 pundef = &(*pundef)->u.undef.next;
3687 element = (*backend->get_elt_at_filepos) (abfd, (file_ptr) file_offset);
3688 if (element == NULL)
3691 if (! bfd_check_format (element, bfd_object))
3694 /* Unlike the generic linker, we know that this element provides
3695 a definition for an undefined symbol and we know that we want
3696 to include it. We don't need to check anything. */
3697 if (!(*info->callbacks
3698 ->add_archive_element) (info, element, name, &element))
3700 if (! ecoff_link_add_object_symbols (element, info))
3703 pundef = &(*pundef)->u.undef.next;
3709 /* Given an ECOFF BFD, add symbols to the global hash table as
3713 _bfd_ecoff_bfd_link_add_symbols (bfd *abfd, struct bfd_link_info *info)
3715 switch (bfd_get_format (abfd))
3718 return ecoff_link_add_object_symbols (abfd, info);
3720 return ecoff_link_add_archive_symbols (abfd, info);
3722 bfd_set_error (bfd_error_wrong_format);
3728 /* ECOFF final link routines. */
3730 /* Structure used to pass information to ecoff_link_write_external. */
3735 struct bfd_link_info *info;
3738 /* Accumulate the debugging information for an input BFD into the
3739 output BFD. This must read in the symbolic information of the
3743 ecoff_final_link_debug_accumulate (bfd *output_bfd,
3745 struct bfd_link_info *info,
3748 struct ecoff_debug_info * const debug = &ecoff_data (input_bfd)->debug_info;
3749 const struct ecoff_debug_swap * const swap =
3750 &ecoff_backend (input_bfd)->debug_swap;
3751 HDRR *symhdr = &debug->symbolic_header;
3754 #define READ(ptr, offset, count, size, type) \
3755 if (symhdr->count == 0) \
3756 debug->ptr = NULL; \
3759 bfd_size_type amt = (bfd_size_type) size * symhdr->count; \
3760 debug->ptr = (type) bfd_malloc (amt); \
3761 if (debug->ptr == NULL) \
3764 goto return_something; \
3766 if (bfd_seek (input_bfd, (file_ptr) symhdr->offset, SEEK_SET) != 0 \
3767 || bfd_bread (debug->ptr, amt, input_bfd) != amt) \
3770 goto return_something; \
3774 /* If raw_syments is not NULL, then the data was already by read by
3775 _bfd_ecoff_slurp_symbolic_info. */
3776 if (ecoff_data (input_bfd)->raw_syments == NULL)
3778 READ (line, cbLineOffset, cbLine, sizeof (unsigned char),
3780 READ (external_dnr, cbDnOffset, idnMax, swap->external_dnr_size, void *);
3781 READ (external_pdr, cbPdOffset, ipdMax, swap->external_pdr_size, void *);
3782 READ (external_sym, cbSymOffset, isymMax, swap->external_sym_size, void *);
3783 READ (external_opt, cbOptOffset, ioptMax, swap->external_opt_size, void *);
3784 READ (external_aux, cbAuxOffset, iauxMax, sizeof (union aux_ext),
3786 READ (ss, cbSsOffset, issMax, sizeof (char), char *);
3787 READ (external_fdr, cbFdOffset, ifdMax, swap->external_fdr_size, void *);
3788 READ (external_rfd, cbRfdOffset, crfd, swap->external_rfd_size, void *);
3792 /* We do not read the external strings or the external symbols. */
3794 ret = (bfd_ecoff_debug_accumulate
3795 (handle, output_bfd, &ecoff_data (output_bfd)->debug_info,
3796 &ecoff_backend (output_bfd)->debug_swap,
3797 input_bfd, debug, swap, info));
3800 if (ecoff_data (input_bfd)->raw_syments == NULL)
3802 if (debug->line != NULL)
3804 if (debug->external_dnr != NULL)
3805 free (debug->external_dnr);
3806 if (debug->external_pdr != NULL)
3807 free (debug->external_pdr);
3808 if (debug->external_sym != NULL)
3809 free (debug->external_sym);
3810 if (debug->external_opt != NULL)
3811 free (debug->external_opt);
3812 if (debug->external_aux != NULL)
3813 free (debug->external_aux);
3814 if (debug->ss != NULL)
3816 if (debug->external_fdr != NULL)
3817 free (debug->external_fdr);
3818 if (debug->external_rfd != NULL)
3819 free (debug->external_rfd);
3821 /* Make sure we don't accidentally follow one of these pointers
3822 into freed memory. */
3824 debug->external_dnr = NULL;
3825 debug->external_pdr = NULL;
3826 debug->external_sym = NULL;
3827 debug->external_opt = NULL;
3828 debug->external_aux = NULL;
3830 debug->external_fdr = NULL;
3831 debug->external_rfd = NULL;
3837 /* Relocate and write an ECOFF section into an ECOFF output file. */
3840 ecoff_indirect_link_order (bfd *output_bfd,
3841 struct bfd_link_info *info,
3842 asection *output_section,
3843 struct bfd_link_order *link_order)
3845 asection *input_section;
3847 bfd_byte *contents = NULL;
3848 bfd_size_type external_reloc_size;
3849 bfd_size_type external_relocs_size;
3850 void * external_relocs = NULL;
3852 BFD_ASSERT ((output_section->flags & SEC_HAS_CONTENTS) != 0);
3854 input_section = link_order->u.indirect.section;
3855 input_bfd = input_section->owner;
3856 if (input_section->size == 0)
3859 BFD_ASSERT (input_section->output_section == output_section);
3860 BFD_ASSERT (input_section->output_offset == link_order->offset);
3861 BFD_ASSERT (input_section->size == link_order->size);
3863 /* Get the section contents. */
3864 if (!bfd_malloc_and_get_section (input_bfd, input_section, &contents))
3867 /* Get the relocs. If we are relaxing MIPS code, they will already
3868 have been read in. Otherwise, we read them in now. */
3869 external_reloc_size = ecoff_backend (input_bfd)->external_reloc_size;
3870 external_relocs_size = external_reloc_size * input_section->reloc_count;
3872 external_relocs = bfd_malloc (external_relocs_size);
3873 if (external_relocs == NULL && external_relocs_size != 0)
3876 if (bfd_seek (input_bfd, input_section->rel_filepos, SEEK_SET) != 0
3877 || (bfd_bread (external_relocs, external_relocs_size, input_bfd)
3878 != external_relocs_size))
3881 /* Relocate the section contents. */
3882 if (! ((*ecoff_backend (input_bfd)->relocate_section)
3883 (output_bfd, info, input_bfd, input_section, contents,
3887 /* Write out the relocated section. */
3888 if (! bfd_set_section_contents (output_bfd,
3891 input_section->output_offset,
3892 input_section->size))
3895 /* If we are producing relocatable output, the relocs were
3896 modified, and we write them out now. We use the reloc_count
3897 field of output_section to keep track of the number of relocs we
3898 have output so far. */
3899 if (bfd_link_relocatable (info))
3901 file_ptr pos = (output_section->rel_filepos
3902 + output_section->reloc_count * external_reloc_size);
3903 if (bfd_seek (output_bfd, pos, SEEK_SET) != 0
3904 || (bfd_bwrite (external_relocs, external_relocs_size, output_bfd)
3905 != external_relocs_size))
3907 output_section->reloc_count += input_section->reloc_count;
3910 if (contents != NULL)
3912 if (external_relocs != NULL)
3913 free (external_relocs);
3917 if (contents != NULL)
3919 if (external_relocs != NULL)
3920 free (external_relocs);
3924 /* Generate a reloc when linking an ECOFF file. This is a reloc
3925 requested by the linker, and does come from any input file. This
3926 is used to build constructor and destructor tables when linking
3930 ecoff_reloc_link_order (bfd *output_bfd,
3931 struct bfd_link_info *info,
3932 asection *output_section,
3933 struct bfd_link_order *link_order)
3935 enum bfd_link_order_type type;
3939 struct internal_reloc in;
3940 bfd_size_type external_reloc_size;
3945 type = link_order->type;
3947 addend = link_order->u.reloc.p->addend;
3949 /* We set up an arelent to pass to the backend adjust_reloc_out
3951 rel.address = link_order->offset;
3953 rel.howto = bfd_reloc_type_lookup (output_bfd, link_order->u.reloc.p->reloc);
3956 bfd_set_error (bfd_error_bad_value);
3960 if (type == bfd_section_reloc_link_order)
3962 section = link_order->u.reloc.p->u.section;
3963 rel.sym_ptr_ptr = section->symbol_ptr_ptr;
3967 struct bfd_link_hash_entry *h;
3969 /* Treat a reloc against a defined symbol as though it were
3970 actually against the section. */
3971 h = bfd_wrapped_link_hash_lookup (output_bfd, info,
3972 link_order->u.reloc.p->u.name,
3973 FALSE, FALSE, FALSE);
3975 && (h->type == bfd_link_hash_defined
3976 || h->type == bfd_link_hash_defweak))
3978 type = bfd_section_reloc_link_order;
3979 section = h->u.def.section->output_section;
3980 /* It seems that we ought to add the symbol value to the
3981 addend here, but in practice it has already been added
3982 because it was passed to constructor_callback. */
3983 addend += section->vma + h->u.def.section->output_offset;
3987 /* We can't set up a reloc against a symbol correctly,
3988 because we have no asymbol structure. Currently no
3989 adjust_reloc_out routine cares. */
3990 rel.sym_ptr_ptr = NULL;
3994 /* All ECOFF relocs are in-place. Put the addend into the object
3997 BFD_ASSERT (rel.howto->partial_inplace);
4001 bfd_reloc_status_type rstat;
4004 size = bfd_get_reloc_size (rel.howto);
4005 buf = (bfd_byte *) bfd_zmalloc (size);
4006 if (buf == NULL && size != 0)
4008 rstat = _bfd_relocate_contents (rel.howto, output_bfd,
4009 (bfd_vma) addend, buf);
4015 case bfd_reloc_outofrange:
4017 case bfd_reloc_overflow:
4018 if (! ((*info->callbacks->reloc_overflow)
4020 (link_order->type == bfd_section_reloc_link_order
4021 ? bfd_section_name (output_bfd, section)
4022 : link_order->u.reloc.p->u.name),
4023 rel.howto->name, addend, NULL,
4024 NULL, (bfd_vma) 0)))
4031 ok = bfd_set_section_contents (output_bfd, output_section, (void *) buf,
4032 (file_ptr) link_order->offset, size);
4040 /* Move the information into an internal_reloc structure. */
4041 in.r_vaddr = (rel.address
4042 + bfd_get_section_vma (output_bfd, output_section));
4043 in.r_type = rel.howto->type;
4045 if (type == bfd_symbol_reloc_link_order)
4047 struct ecoff_link_hash_entry *h;
4049 h = ((struct ecoff_link_hash_entry *)
4050 bfd_wrapped_link_hash_lookup (output_bfd, info,
4051 link_order->u.reloc.p->u.name,
4052 FALSE, FALSE, TRUE));
4055 in.r_symndx = h->indx;
4058 if (! ((*info->callbacks->unattached_reloc)
4059 (info, link_order->u.reloc.p->u.name, NULL,
4060 NULL, (bfd_vma) 0)))
4077 { _TEXT, RELOC_SECTION_TEXT },
4078 { _RDATA, RELOC_SECTION_RDATA },
4079 { _DATA, RELOC_SECTION_DATA },
4080 { _SDATA, RELOC_SECTION_SDATA },
4081 { _SBSS, RELOC_SECTION_SBSS },
4082 { _BSS, RELOC_SECTION_BSS },
4083 { _INIT, RELOC_SECTION_INIT },
4084 { _LIT8, RELOC_SECTION_LIT8 },
4085 { _LIT4, RELOC_SECTION_LIT4 },
4086 { _XDATA, RELOC_SECTION_XDATA },
4087 { _PDATA, RELOC_SECTION_PDATA },
4088 { _FINI, RELOC_SECTION_FINI },
4089 { _LITA, RELOC_SECTION_LITA },
4090 { "*ABS*", RELOC_SECTION_ABS },
4091 { _RCONST, RELOC_SECTION_RCONST }
4094 name = bfd_get_section_name (output_bfd, section);
4096 for (i = 0; i < ARRAY_SIZE (section_symndx); i++)
4097 if (streq (name, section_symndx[i].name))
4099 in.r_symndx = section_symndx[i].r_symndx;
4103 if (i == ARRAY_SIZE (section_symndx))
4109 /* Let the BFD backend adjust the reloc. */
4110 (*ecoff_backend (output_bfd)->adjust_reloc_out) (output_bfd, &rel, &in);
4112 /* Get some memory and swap out the reloc. */
4113 external_reloc_size = ecoff_backend (output_bfd)->external_reloc_size;
4114 rbuf = (bfd_byte *) bfd_malloc (external_reloc_size);
4118 (*ecoff_backend (output_bfd)->swap_reloc_out) (output_bfd, &in, (void *) rbuf);
4120 pos = (output_section->rel_filepos
4121 + output_section->reloc_count * external_reloc_size);
4122 ok = (bfd_seek (output_bfd, pos, SEEK_SET) == 0
4123 && (bfd_bwrite ((void *) rbuf, external_reloc_size, output_bfd)
4124 == external_reloc_size));
4127 ++output_section->reloc_count;
4134 /* Put out information for an external symbol. These come only from
4138 ecoff_link_write_external (struct bfd_hash_entry *bh, void * data)
4140 struct ecoff_link_hash_entry *h = (struct ecoff_link_hash_entry *) bh;
4141 struct extsym_info *einfo = (struct extsym_info *) data;
4142 bfd *output_bfd = einfo->abfd;
4145 if (h->root.type == bfd_link_hash_warning)
4147 h = (struct ecoff_link_hash_entry *) h->root.u.i.link;
4148 if (h->root.type == bfd_link_hash_new)
4152 /* We need to check if this symbol is being stripped. */
4153 if (h->root.type == bfd_link_hash_undefined
4154 || h->root.type == bfd_link_hash_undefweak)
4156 else if (einfo->info->strip == strip_all
4157 || (einfo->info->strip == strip_some
4158 && bfd_hash_lookup (einfo->info->keep_hash,
4159 h->root.root.string,
4160 FALSE, FALSE) == NULL))
4165 if (strip || h->written)
4168 if (h->abfd == NULL)
4171 h->esym.cobol_main = 0;
4172 h->esym.weakext = 0;
4173 h->esym.reserved = 0;
4174 h->esym.ifd = ifdNil;
4175 h->esym.asym.value = 0;
4176 h->esym.asym.st = stGlobal;
4178 if (h->root.type != bfd_link_hash_defined
4179 && h->root.type != bfd_link_hash_defweak)
4180 h->esym.asym.sc = scAbs;
4183 asection *output_section;
4191 section_storage_classes [] =
4195 { _SDATA, scSData },
4196 { _RDATA, scRData },
4201 { _PDATA, scPData },
4202 { _XDATA, scXData },
4203 { _RCONST, scRConst }
4206 output_section = h->root.u.def.section->output_section;
4207 name = bfd_section_name (output_section->owner, output_section);
4209 for (i = 0; i < ARRAY_SIZE (section_storage_classes); i++)
4210 if (streq (name, section_storage_classes[i].name))
4212 h->esym.asym.sc = section_storage_classes[i].sc;
4216 if (i == ARRAY_SIZE (section_storage_classes))
4217 h->esym.asym.sc = scAbs;
4220 h->esym.asym.reserved = 0;
4221 h->esym.asym.index = indexNil;
4223 else if (h->esym.ifd != -1)
4225 struct ecoff_debug_info *debug;
4227 /* Adjust the FDR index for the symbol by that used for the
4229 debug = &ecoff_data (h->abfd)->debug_info;
4230 BFD_ASSERT (h->esym.ifd >= 0
4231 && h->esym.ifd < debug->symbolic_header.ifdMax);
4232 h->esym.ifd = debug->ifdmap[h->esym.ifd];
4235 switch (h->root.type)
4238 case bfd_link_hash_warning:
4239 case bfd_link_hash_new:
4241 case bfd_link_hash_undefined:
4242 case bfd_link_hash_undefweak:
4243 if (h->esym.asym.sc != scUndefined
4244 && h->esym.asym.sc != scSUndefined)
4245 h->esym.asym.sc = scUndefined;
4247 case bfd_link_hash_defined:
4248 case bfd_link_hash_defweak:
4249 if (h->esym.asym.sc == scUndefined
4250 || h->esym.asym.sc == scSUndefined)
4251 h->esym.asym.sc = scAbs;
4252 else if (h->esym.asym.sc == scCommon)
4253 h->esym.asym.sc = scBss;
4254 else if (h->esym.asym.sc == scSCommon)
4255 h->esym.asym.sc = scSBss;
4256 h->esym.asym.value = (h->root.u.def.value
4257 + h->root.u.def.section->output_section->vma
4258 + h->root.u.def.section->output_offset);
4260 case bfd_link_hash_common:
4261 if (h->esym.asym.sc != scCommon
4262 && h->esym.asym.sc != scSCommon)
4263 h->esym.asym.sc = scCommon;
4264 h->esym.asym.value = h->root.u.c.size;
4266 case bfd_link_hash_indirect:
4267 /* We ignore these symbols, since the indirected symbol is
4268 already in the hash table. */
4272 /* bfd_ecoff_debug_one_external uses iextMax to keep track of the
4274 h->indx = ecoff_data (output_bfd)->debug_info.symbolic_header.iextMax;
4277 return (bfd_ecoff_debug_one_external
4278 (output_bfd, &ecoff_data (output_bfd)->debug_info,
4279 &ecoff_backend (output_bfd)->debug_swap, h->root.root.string,
4283 /* ECOFF final link routine. This looks through all the input BFDs
4284 and gathers together all the debugging information, and then
4285 processes all the link order information. This may cause it to
4286 close and reopen some input BFDs; I'll see how bad this is. */
4289 _bfd_ecoff_bfd_final_link (bfd *abfd, struct bfd_link_info *info)
4291 const struct ecoff_backend_data * const backend = ecoff_backend (abfd);
4292 struct ecoff_debug_info * const debug = &ecoff_data (abfd)->debug_info;
4297 struct bfd_link_order *p;
4298 struct extsym_info einfo;
4300 /* We accumulate the debugging information counts in the symbolic
4302 symhdr = &debug->symbolic_header;
4304 symhdr->ilineMax = 0;
4308 symhdr->isymMax = 0;
4309 symhdr->ioptMax = 0;
4310 symhdr->iauxMax = 0;
4312 symhdr->issExtMax = 0;
4315 symhdr->iextMax = 0;
4317 /* We accumulate the debugging information itself in the debug_info
4320 debug->external_dnr = NULL;
4321 debug->external_pdr = NULL;
4322 debug->external_sym = NULL;
4323 debug->external_opt = NULL;
4324 debug->external_aux = NULL;
4326 debug->ssext = debug->ssext_end = NULL;
4327 debug->external_fdr = NULL;
4328 debug->external_rfd = NULL;
4329 debug->external_ext = debug->external_ext_end = NULL;
4331 handle = bfd_ecoff_debug_init (abfd, debug, &backend->debug_swap, info);
4335 /* Accumulate the debugging symbols from each input BFD. */
4336 for (input_bfd = info->input_bfds;
4338 input_bfd = input_bfd->link.next)
4342 if (bfd_get_flavour (input_bfd) == bfd_target_ecoff_flavour)
4344 /* Arbitrarily set the symbolic header vstamp to the vstamp
4345 of the first object file in the link. */
4346 if (symhdr->vstamp == 0)
4348 = ecoff_data (input_bfd)->debug_info.symbolic_header.vstamp;
4349 ret = ecoff_final_link_debug_accumulate (abfd, input_bfd, info,
4353 ret = bfd_ecoff_debug_accumulate_other (handle, abfd,
4354 debug, &backend->debug_swap,
4359 /* Combine the register masks. */
4360 ecoff_data (abfd)->gprmask |= ecoff_data (input_bfd)->gprmask;
4361 ecoff_data (abfd)->fprmask |= ecoff_data (input_bfd)->fprmask;
4362 ecoff_data (abfd)->cprmask[0] |= ecoff_data (input_bfd)->cprmask[0];
4363 ecoff_data (abfd)->cprmask[1] |= ecoff_data (input_bfd)->cprmask[1];
4364 ecoff_data (abfd)->cprmask[2] |= ecoff_data (input_bfd)->cprmask[2];
4365 ecoff_data (abfd)->cprmask[3] |= ecoff_data (input_bfd)->cprmask[3];
4368 /* Write out the external symbols. */
4371 bfd_hash_traverse (&info->hash->table, ecoff_link_write_external, &einfo);
4373 if (bfd_link_relocatable (info))
4375 /* We need to make a pass over the link_orders to count up the
4376 number of relocations we will need to output, so that we know
4377 how much space they will take up. */
4378 for (o = abfd->sections; o != NULL; o = o->next)
4381 for (p = o->map_head.link_order;
4384 if (p->type == bfd_indirect_link_order)
4385 o->reloc_count += p->u.indirect.section->reloc_count;
4386 else if (p->type == bfd_section_reloc_link_order
4387 || p->type == bfd_symbol_reloc_link_order)
4392 /* Compute the reloc and symbol file positions. */
4393 ecoff_compute_reloc_file_positions (abfd);
4395 /* Write out the debugging information. */
4396 if (! bfd_ecoff_write_accumulated_debug (handle, abfd, debug,
4397 &backend->debug_swap, info,
4398 ecoff_data (abfd)->sym_filepos))
4401 bfd_ecoff_debug_free (handle, abfd, debug, &backend->debug_swap, info);
4403 if (bfd_link_relocatable (info))
4405 /* Now reset the reloc_count field of the sections in the output
4406 BFD to 0, so that we can use them to keep track of how many
4407 relocs we have output thus far. */
4408 for (o = abfd->sections; o != NULL; o = o->next)
4412 /* Get a value for the GP register. */
4413 if (ecoff_data (abfd)->gp == 0)
4415 struct bfd_link_hash_entry *h;
4417 h = bfd_link_hash_lookup (info->hash, "_gp", FALSE, FALSE, TRUE);
4419 && h->type == bfd_link_hash_defined)
4420 ecoff_data (abfd)->gp = (h->u.def.value
4421 + h->u.def.section->output_section->vma
4422 + h->u.def.section->output_offset);
4423 else if (bfd_link_relocatable (info))
4427 /* Make up a value. */
4429 for (o = abfd->sections; o != NULL; o = o->next)
4432 && (streq (o->name, _SBSS)
4433 || streq (o->name, _SDATA)
4434 || streq (o->name, _LIT4)
4435 || streq (o->name, _LIT8)
4436 || streq (o->name, _LITA)))
4439 ecoff_data (abfd)->gp = lo + 0x8000;
4443 /* If the relocate_section function needs to do a reloc
4444 involving the GP value, it should make a reloc_dangerous
4445 callback to warn that GP is not defined. */
4449 for (o = abfd->sections; o != NULL; o = o->next)
4451 for (p = o->map_head.link_order;
4455 if (p->type == bfd_indirect_link_order
4456 && (bfd_get_flavour (p->u.indirect.section->owner)
4457 == bfd_target_ecoff_flavour))
4459 if (! ecoff_indirect_link_order (abfd, info, o, p))
4462 else if (p->type == bfd_section_reloc_link_order
4463 || p->type == bfd_symbol_reloc_link_order)
4465 if (! ecoff_reloc_link_order (abfd, info, o, p))
4470 if (! _bfd_default_link_order (abfd, info, o, p))
4476 bfd_get_symcount (abfd) = symhdr->iextMax + symhdr->isymMax;
4478 ecoff_data (abfd)->linker = TRUE;