1 /* Support for the generic parts of COFF, for BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
3 Written by Cygnus Support.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
21 /* Most of this hacked by Steve Chamberlain, sac@cygnus.com.
22 Split out of coffcode.h by Ian Taylor, ian@cygnus.com. */
24 /* This file contains COFF code that is not dependent on any
25 particular COFF target. There is only one version of this file in
26 libbfd.a, so no target specific code may be put in here. Or, to
29 ********** DO NOT PUT TARGET SPECIFIC CODE IN THIS FILE **********
31 If you need to add some target specific behaviour, add a new hook
32 function to bfd_coff_backend_data.
34 Some of these functions are also called by the ECOFF routines.
35 Those functions may not use any COFF specific information, such as
41 #include "coff/internal.h"
44 static boolean coff_write_symbol PARAMS ((bfd *, asymbol *,
45 combined_entry_type *,
47 static boolean coff_write_alien_symbol PARAMS ((bfd *, asymbol *,
49 static boolean coff_write_native_symbol PARAMS ((bfd *, coff_symbol_type *,
52 static asection bfd_debug_section = { "*DEBUG*" };
54 /* Take a section header read from a coff file (in HOST byte order),
55 and make a BFD "section" out of it. This is used by ECOFF. */
57 make_a_section_from_file (abfd, hdr, target_index)
59 struct internal_scnhdr *hdr;
60 unsigned int target_index;
62 asection *return_section;
65 /* Assorted wastage to null-terminate the name, thanks AT&T! */
66 name = bfd_alloc(abfd, sizeof (hdr->s_name)+1);
68 bfd_set_error (bfd_error_no_memory);
71 strncpy(name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
72 name[sizeof (hdr->s_name)] = 0;
74 return_section = bfd_make_section(abfd, name);
75 if (return_section == NULL)
76 return_section = bfd_coff_make_section_hook (abfd, name);
78 /* Handle several sections of the same name. For example, if an executable
79 has two .bss sections, GDB better be able to find both of them
81 if (return_section == NULL)
82 return_section = bfd_make_section_anyway (abfd, name);
84 if (return_section == NULL)
87 /* s_paddr is presumed to be = to s_vaddr */
89 return_section->vma = hdr->s_vaddr;
90 return_section->_raw_size = hdr->s_size;
91 return_section->filepos = hdr->s_scnptr;
92 return_section->rel_filepos = hdr->s_relptr;
93 return_section->reloc_count = hdr->s_nreloc;
95 bfd_coff_set_alignment_hook (abfd, return_section, hdr);
97 return_section->line_filepos = hdr->s_lnnoptr;
99 return_section->lineno_count = hdr->s_nlnno;
100 return_section->userdata = NULL;
101 return_section->next = (asection *) NULL;
102 return_section->flags = bfd_coff_styp_to_sec_flags_hook (abfd, hdr);
104 return_section->target_index = target_index;
106 /* At least on i386-coff, the line number count for a shared library
107 section must be ignored. */
108 if ((return_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
109 return_section->lineno_count = 0;
111 if (hdr->s_nreloc != 0)
112 return_section->flags |= SEC_RELOC;
113 /* FIXME: should this check 'hdr->s_size > 0' */
114 if (hdr->s_scnptr != 0)
115 return_section->flags |= SEC_HAS_CONTENTS;
119 /* Read in a COFF object and make it into a BFD. This is used by
124 coff_real_object_p (abfd, nscns, internal_f, internal_a)
127 struct internal_filehdr *internal_f;
128 struct internal_aouthdr *internal_a;
131 size_t readsize; /* length of file_info */
133 char *external_sections;
135 /* Build a play area */
136 tdata = bfd_coff_mkobject_hook (abfd, (PTR) internal_f, (PTR) internal_a);
140 scnhsz = bfd_coff_scnhsz (abfd);
141 readsize = nscns * scnhsz;
142 external_sections = (char *)bfd_alloc(abfd, readsize);
143 if (!external_sections)
145 bfd_set_error (bfd_error_no_memory);
149 if (bfd_read((PTR)external_sections, 1, readsize, abfd) != readsize) {
153 /* Now copy data as required; construct all asections etc */
156 for (i = 0; i < nscns; i++) {
157 struct internal_scnhdr tmp;
158 bfd_coff_swap_scnhdr_in(abfd, (PTR) (external_sections + i * scnhsz),
160 make_a_section_from_file(abfd,&tmp, i+1);
164 /* make_abs_section(abfd);*/
166 if (bfd_coff_set_arch_mach_hook (abfd, (PTR) internal_f) == false)
169 if (!(internal_f->f_flags & F_RELFLG))
170 abfd->flags |= HAS_RELOC;
171 if ((internal_f->f_flags & F_EXEC))
172 abfd->flags |= EXEC_P;
173 if (!(internal_f->f_flags & F_LNNO))
174 abfd->flags |= HAS_LINENO;
175 if (!(internal_f->f_flags & F_LSYMS))
176 abfd->flags |= HAS_LOCALS;
179 bfd_get_symcount(abfd) = internal_f->f_nsyms;
180 if (internal_f->f_nsyms)
181 abfd->flags |= HAS_SYMS;
183 if (internal_a != (struct internal_aouthdr *) NULL)
184 bfd_get_start_address (abfd) = internal_a->entry;
186 bfd_get_start_address (abfd) = 0;
190 bfd_release(abfd, tdata);
191 return (bfd_target *)NULL;
194 /* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
195 not a COFF file. This is also used by ECOFF. */
205 struct internal_filehdr internal_f;
206 struct internal_aouthdr internal_a;
208 /* figure out how much to read */
209 filhsz = bfd_coff_filhsz (abfd);
210 aoutsz = bfd_coff_aoutsz (abfd);
212 filehdr = bfd_alloc (abfd, filhsz);
215 if (bfd_read(filehdr, 1, filhsz, abfd) != filhsz)
217 if (bfd_get_error () != bfd_error_system_call)
218 bfd_set_error (bfd_error_wrong_format);
221 bfd_coff_swap_filehdr_in(abfd, filehdr, &internal_f);
222 bfd_release (abfd, filehdr);
224 if (bfd_coff_bad_format_hook (abfd, &internal_f) == false) {
225 bfd_set_error (bfd_error_wrong_format);
228 nscns =internal_f.f_nscns;
230 if (internal_f.f_opthdr) {
233 opthdr = bfd_alloc (abfd, aoutsz);
236 if (bfd_read(opthdr, 1,aoutsz, abfd) != aoutsz) {
239 bfd_coff_swap_aouthdr_in(abfd, opthdr, (PTR)&internal_a);
242 /* Seek past the opt hdr stuff */
243 if (bfd_seek(abfd, (file_ptr) (internal_f.f_opthdr + filhsz), SEEK_SET)
247 return coff_real_object_p(abfd, nscns, &internal_f,
248 (internal_f.f_opthdr != 0
250 : (struct internal_aouthdr *) NULL));
253 /* Get the BFD section from a COFF symbol section number. */
256 coff_section_from_bfd_index (abfd, index)
260 struct sec *answer = abfd->sections;
264 return &bfd_abs_section;
266 if (index == N_UNDEF)
268 return &bfd_und_section;
272 return &bfd_debug_section;
277 if (answer->target_index == index)
279 answer = answer->next;
282 /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
283 has a bad symbol table in biglitpow.o. */
284 return &bfd_und_section;
287 /* Get the upper bound of a COFF symbol table. */
290 coff_get_symtab_upper_bound(abfd)
293 if (!bfd_coff_slurp_symbol_table(abfd))
296 return (bfd_get_symcount(abfd) + 1) * (sizeof(coff_symbol_type *));
300 /* Canonicalize a COFF symbol table. */
303 coff_get_symtab (abfd, alocation)
307 unsigned int counter = 0;
308 coff_symbol_type *symbase;
309 coff_symbol_type **location = (coff_symbol_type **) (alocation);
310 if (!bfd_coff_slurp_symbol_table(abfd))
313 symbase = obj_symbols(abfd);
314 while (counter < bfd_get_symcount(abfd))
316 /* This nasty code looks at the symbol to decide whether or
317 not it is descibes a constructor/destructor entry point. It
318 is structured this way to (hopefully) speed non matches */
320 if (0 && symbase->symbol.name[9] == '$')
322 bfd_constructor_entry(abfd,
323 (asymbol **)location,
324 symbase->symbol.name[10] == 'I' ?
328 *(location++) = symbase++;
332 return bfd_get_symcount(abfd);
335 /* Set lineno_count for the output sections of a COFF file. */
338 coff_count_linenumbers (abfd)
341 unsigned int limit = bfd_get_symcount(abfd);
346 asection *s = abfd->sections->output_section;
348 BFD_ASSERT(s->lineno_count == 0);
354 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
355 asymbol *q_maybe = *p;
356 if (bfd_asymbol_flavour(q_maybe) == bfd_target_coff_flavour) {
357 coff_symbol_type *q = coffsymbol(q_maybe);
360 This symbol has a linenumber, increment the owning
361 section's linenumber count
363 alent *l = q->lineno;
364 q->symbol.section->output_section->lineno_count++;
367 while (l->line_number) {
369 q->symbol.section->output_section->lineno_count++;
378 /* Takes a bfd and a symbol, returns a pointer to the coff specific
379 area of the symbol if there is one. */
383 coff_symbol_from (ignore_abfd, symbol)
387 if (bfd_asymbol_flavour(symbol) != bfd_target_coff_flavour)
388 return (coff_symbol_type *)NULL;
390 if (bfd_asymbol_bfd(symbol)->tdata.coff_obj_data == (coff_data_type*)NULL)
391 return (coff_symbol_type *)NULL;
393 return (coff_symbol_type *) symbol;
397 fixup_symbol_value (coff_symbol_ptr, syment)
398 coff_symbol_type *coff_symbol_ptr;
399 struct internal_syment *syment;
402 /* Normalize the symbol flags */
403 if (bfd_is_com_section (coff_symbol_ptr->symbol.section)) {
404 /* a common symbol is undefined with a value */
405 syment->n_scnum = N_UNDEF;
406 syment->n_value = coff_symbol_ptr->symbol.value;
408 else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) {
409 syment->n_value = coff_symbol_ptr->symbol.value;
411 else if (coff_symbol_ptr->symbol.section == & bfd_und_section) {
412 syment->n_scnum = N_UNDEF;
416 if (coff_symbol_ptr->symbol.section) {
418 coff_symbol_ptr->symbol.section->output_section->target_index;
421 coff_symbol_ptr->symbol.value +
422 coff_symbol_ptr->symbol.section->output_offset +
423 coff_symbol_ptr->symbol.section->output_section->vma;
427 /* This can happen, but I don't know why yet (steve@cygnus.com) */
428 syment->n_scnum = N_ABS;
429 syment->n_value = coff_symbol_ptr->symbol.value;
434 /* run through all the symbols in the symbol table and work out what
435 their indexes into the symbol table will be when output
437 Coff requires that each C_FILE symbol points to the next one in the
438 chain, and that the last one points to the first external symbol. We
443 coff_renumber_symbols (bfd_ptr)
446 unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
447 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
448 unsigned int native_index = 0;
449 struct internal_syment *last_file = (struct internal_syment *)NULL;
450 unsigned int symbol_index;
452 /* COFF demands that undefined symbols come after all other symbols.
453 Since we don't need to impose this extra knowledge on all our client
454 programs, deal with that here. Sort the symbol table; just move the
455 undefined symbols to the end, leaving the rest alone. */
456 /* @@ Do we have some condition we could test for, so we don't always
457 have to do this? I don't think relocatability is quite right, but
458 I'm not certain. [raeburn:19920508.1711EST] */
463 newsyms = (asymbol **) bfd_alloc_by_size_t (bfd_ptr,
465 * (symbol_count + 1));
468 bfd_set_error (bfd_error_no_memory);
471 bfd_ptr->outsymbols = newsyms;
472 for (i = 0; i < symbol_count; i++)
473 if (symbol_ptr_ptr[i]->section != &bfd_und_section)
474 *newsyms++ = symbol_ptr_ptr[i];
475 for (i = 0; i < symbol_count; i++)
476 if (symbol_ptr_ptr[i]->section == &bfd_und_section)
477 *newsyms++ = symbol_ptr_ptr[i];
478 *newsyms = (asymbol *) NULL;
479 symbol_ptr_ptr = bfd_ptr->outsymbols;
482 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
484 coff_symbol_type *coff_symbol_ptr = coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
485 if (coff_symbol_ptr && coff_symbol_ptr->native) {
486 combined_entry_type *s = coff_symbol_ptr->native;
489 if (s->u.syment.n_sclass == C_FILE)
491 if (last_file != (struct internal_syment *)NULL) {
492 last_file->n_value = native_index;
494 last_file = &(s->u.syment);
498 /* Modify the symbol values according to their section and
501 fixup_symbol_value(coff_symbol_ptr, &(s->u.syment));
503 for (i = 0; i < s->u.syment.n_numaux + 1; i++) {
504 s[i].offset = native_index ++;
511 obj_conv_table_size (bfd_ptr) = native_index;
516 Run thorough the symbol table again, and fix it so that all pointers to
517 entries are changed to the entries' index in the output symbol table.
521 coff_mangle_symbols (bfd_ptr)
524 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
525 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
526 unsigned int symbol_index;
528 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
530 coff_symbol_type *coff_symbol_ptr =
531 coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
533 if (coff_symbol_ptr && coff_symbol_ptr->native)
536 combined_entry_type *s = coff_symbol_ptr->native;
540 /* FIXME: We should use a union here. */
541 s->u.syment.n_value =
542 ((combined_entry_type *) s->u.syment.n_value)->offset;
545 for (i = 0; i < s->u.syment.n_numaux ; i++)
547 combined_entry_type *a = s + i + 1;
550 a->u.auxent.x_sym.x_tagndx.l =
551 a->u.auxent.x_sym.x_tagndx.p->offset;
556 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
557 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
562 a->u.auxent.x_csect.x_scnlen.l =
563 a->u.auxent.x_csect.x_scnlen.p->offset;
571 static bfd_size_type string_size;
572 static bfd_size_type debug_string_size;
573 static asection *debug_string_section;
576 coff_fix_symbol_name (abfd, symbol, native)
579 combined_entry_type *native;
581 unsigned int name_length;
582 union internal_auxent *auxent;
583 char * name = ( char *)(symbol->name);
585 if (name == (char *) NULL) {
586 /* coff symbols always have names, so we'll make one up */
587 symbol->name = "strange";
588 name = (char *)symbol->name;
590 name_length = strlen(name);
592 if (native->u.syment.n_sclass == C_FILE) {
593 strncpy(native->u.syment._n._n_name, ".file", SYMNMLEN);
594 auxent = &(native+1)->u.auxent;
596 if (bfd_coff_long_filenames (abfd)) {
597 if (name_length <= FILNMLEN) {
598 strncpy(auxent->x_file.x_fname, name, FILNMLEN);
601 auxent->x_file.x_n.x_offset = string_size + 4;
602 auxent->x_file.x_n.x_zeroes = 0;
603 string_size += name_length + 1;
607 strncpy(auxent->x_file.x_fname, name, FILNMLEN);
608 if (name_length > FILNMLEN) {
609 name[FILNMLEN] = '\0';
614 { /* NOT A C_FILE SYMBOL */
615 if (name_length <= SYMNMLEN)
617 /* This name will fit into the symbol neatly */
618 strncpy(native->u.syment._n._n_name, symbol->name, SYMNMLEN);
620 else if (! bfd_coff_symname_in_debug (abfd, &native->u.syment))
622 native->u.syment._n._n_n._n_offset = string_size + 4;
623 native->u.syment._n._n_n._n_zeroes = 0;
624 string_size += name_length + 1;
631 /* This name should be written into the .debug section. For
632 some reason each name is preceded by a two byte length
633 and also followed by a null byte. FIXME: We assume that
634 the .debug section has already been created, and that it
636 if (debug_string_section == (asection *) NULL)
637 debug_string_section = bfd_get_section_by_name (abfd, ".debug");
638 filepos = bfd_tell (abfd);
639 bfd_put_16 (abfd, name_length + 1, buf);
640 if (! bfd_set_section_contents (abfd,
641 debug_string_section,
643 (file_ptr) debug_string_size,
645 || ! bfd_set_section_contents (abfd,
646 debug_string_section,
648 (file_ptr) debug_string_size + 2,
649 (bfd_size_type) name_length + 1))
651 if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
653 native->u.syment._n._n_n._n_offset = debug_string_size + 2;
654 native->u.syment._n._n_n._n_zeroes = 0;
655 debug_string_size += name_length + 3;
660 /* We need to keep track of the symbol index so that when we write out
661 the relocs we can get the index for a symbol. This method is a
664 #define set_index(symbol, idx) ((symbol)->udata = (PTR) (idx))
666 /* Write a symbol out to a COFF file. */
669 coff_write_symbol (abfd, symbol, native, written)
672 combined_entry_type *native;
673 unsigned int *written;
675 unsigned int numaux = native->u.syment.n_numaux;
676 int type = native->u.syment.n_type;
677 int class = native->u.syment.n_sclass;
679 bfd_size_type symesz;
681 /* @@ bfd_debug_section isn't accessible outside this file, but we
682 know that C_FILE symbols belong there. So move them. */
683 if (native->u.syment.n_sclass == C_FILE)
684 symbol->section = &bfd_debug_section;
686 if (symbol->section == &bfd_abs_section)
688 native->u.syment.n_scnum = N_ABS;
690 else if (symbol->section == &bfd_debug_section)
692 native->u.syment.n_scnum = N_DEBUG;
694 else if (symbol->section == &bfd_und_section)
696 native->u.syment.n_scnum = N_UNDEF;
700 native->u.syment.n_scnum =
701 symbol->section->output_section->target_index;
704 coff_fix_symbol_name (abfd, symbol, native);
706 symesz = bfd_coff_symesz (abfd);
707 buf = bfd_alloc (abfd, symesz);
710 bfd_set_error (bfd_error_no_memory);
713 bfd_coff_swap_sym_out (abfd, &native->u.syment, buf);
714 if (bfd_write (buf, 1, symesz, abfd) != symesz)
716 bfd_release (abfd, buf);
718 if (native->u.syment.n_numaux > 0)
720 bfd_size_type auxesz;
723 auxesz = bfd_coff_auxesz (abfd);
724 buf = bfd_alloc (abfd, auxesz);
727 bfd_set_error (bfd_error_no_memory);
730 for (j = 0; j < native->u.syment.n_numaux; j++)
732 bfd_coff_swap_aux_out (abfd,
733 &((native + j + 1)->u.auxent),
737 native->u.syment.n_numaux,
739 if (bfd_write (buf, 1, auxesz, abfd)!= auxesz)
742 bfd_release (abfd, buf);
745 /* Store the index for use when we write out the relocs. */
746 set_index (symbol, *written);
748 *written += numaux + 1;
752 /* Write out a symbol to a COFF file that does not come from a COFF
753 file originally. This symbol may have been created by the linker,
754 or we may be linking a non COFF file to a COFF file. */
757 coff_write_alien_symbol (abfd, symbol, written)
760 unsigned int *written;
762 combined_entry_type *native;
763 combined_entry_type dummy;
766 native->u.syment.n_type = T_NULL;
767 native->u.syment.n_flags = 0;
768 if (symbol->section == &bfd_und_section)
770 native->u.syment.n_scnum = N_UNDEF;
771 native->u.syment.n_value = symbol->value;
773 else if (bfd_is_com_section (symbol->section))
775 native->u.syment.n_scnum = N_UNDEF;
776 native->u.syment.n_value = symbol->value;
778 else if (symbol->flags & BSF_DEBUGGING)
780 /* Remove the symbol name so that it does not take up any space.
781 COFF won't know what to do with it anyhow. */
786 native->u.syment.n_scnum =
787 symbol->section->output_section->target_index;
788 native->u.syment.n_value = (symbol->value
789 + symbol->section->output_section->vma
790 + symbol->section->output_offset);
792 /* Copy the any flags from the the file header into the symbol.
795 coff_symbol_type *c = coff_symbol_from (abfd, symbol);
796 if (c != (coff_symbol_type *) NULL)
797 native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
801 native->u.syment.n_type = 0;
802 if (symbol->flags & BSF_LOCAL)
803 native->u.syment.n_sclass = C_STAT;
805 native->u.syment.n_sclass = C_EXT;
806 native->u.syment.n_numaux = 0;
808 return coff_write_symbol (abfd, symbol, native, written);
811 /* Write a native symbol to a COFF file. */
814 coff_write_native_symbol (abfd, symbol, written)
816 coff_symbol_type *symbol;
817 unsigned int *written;
819 combined_entry_type *native = symbol->native;
820 alent *lineno = symbol->lineno;
822 /* If this symbol has an associated line number, we must store the
823 symbol index in the line number field. We also tag the auxent to
824 point to the right place in the lineno table. */
825 if (lineno && !symbol->done_lineno)
827 unsigned int count = 0;
828 lineno[count].u.offset = *written;
829 if (native->u.syment.n_numaux)
831 union internal_auxent *a = &((native+1)->u.auxent);
833 a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
834 symbol->symbol.section->output_section->moving_line_filepos;
837 /* Count and relocate all other linenumbers. */
839 while (lineno[count].line_number != 0)
843 I've been told this, but still need proof:
844 > The second bug is also in `bfd/coffcode.h'. This bug
845 > causes the linker to screw up the pc-relocations for
846 > all the line numbers in COFF code. This bug isn't only
847 > specific to A29K implementations, but affects all
848 > systems using COFF format binaries. Note that in COFF
849 > object files, the line number core offsets output by
850 > the assembler are relative to the start of each
851 > procedure, not to the start of the .text section. This
852 > patch relocates the line numbers relative to the
853 > `native->u.syment.n_value' instead of the section
855 > modular!olson@cs.arizona.edu (Jon Olson)
857 lineno[count].u.offset += native->u.syment.n_value;
859 lineno[count].u.offset +=
860 (symbol->symbol.section->output_section->vma
861 + symbol->symbol.section->output_offset);
865 symbol->done_lineno = true;
867 symbol->symbol.section->output_section->moving_line_filepos +=
868 count * bfd_coff_linesz (abfd);
871 return coff_write_symbol (abfd, &(symbol->symbol), native, written);
874 /* Write out the COFF symbols. */
877 coff_write_symbols (abfd)
881 unsigned int limit = bfd_get_symcount(abfd);
882 unsigned int written = 0;
886 debug_string_size = 0;
888 /* Seek to the right place */
889 if (bfd_seek (abfd, obj_sym_filepos(abfd), SEEK_SET) != 0)
892 /* Output all the symbols we have */
895 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
897 asymbol *symbol = *p;
898 coff_symbol_type *c_symbol = coff_symbol_from (abfd, symbol);
900 if (c_symbol == (coff_symbol_type *) NULL
901 || c_symbol->native == (combined_entry_type *)NULL)
903 if (! coff_write_alien_symbol (abfd, symbol, &written))
908 if (! coff_write_native_symbol (abfd, c_symbol, &written))
913 bfd_get_symcount (abfd) = written;
915 /* Now write out strings */
917 if (string_size != 0)
919 unsigned int size = string_size + 4;
922 bfd_h_put_32 (abfd, size, buffer);
923 if (bfd_write ((PTR) buffer, 1, sizeof (buffer), abfd) != sizeof (buffer))
925 for (p = abfd->outsymbols, i = 0;
930 size_t name_length = strlen (q->name);
931 coff_symbol_type *c_symbol = coff_symbol_from (abfd, q);
934 /* Figure out whether the symbol name should go in the string
935 table. Symbol names that are short enough are stored
936 directly in the syment structure. File names permit a
937 different, longer, length in the syment structure. On
938 XCOFF, some symbol names are stored in the .debug section
939 rather than in the string table. */
942 || c_symbol->native == NULL)
944 /* This is not a COFF symbol, so it certainly is not a
945 file name, nor does it go in the .debug section. */
948 else if (bfd_coff_symname_in_debug (abfd,
949 &c_symbol->native->u.syment))
951 /* This symbol name is in the XCOFF .debug section.
952 Don't write it into the string table. */
953 maxlen = name_length;
955 else if (c_symbol->native->u.syment.n_sclass == C_FILE)
960 if (name_length > maxlen)
962 if (bfd_write ((PTR) (q->name), 1, name_length + 1, abfd)
970 /* We would normally not write anything here, but we'll write
971 out 4 so that any stupid coff reader which tries to read the
972 string table even when there isn't one won't croak. */
973 unsigned int size = 4;
976 bfd_h_put_32 (abfd, size, buffer);
977 if (bfd_write ((PTR) buffer, 1, 4, abfd) != 4)
981 /* Make sure the .debug section was created to be the correct size.
982 We should create it ourselves on the fly, but we don't because
983 BFD won't let us write to any section until we know how large all
984 the sections are. We could still do it by making another pass
985 over the symbols. FIXME. */
986 BFD_ASSERT (debug_string_size == 0
987 || (debug_string_section != (asection *) NULL
988 && (BFD_ALIGN (debug_string_size,
989 1 << debug_string_section->alignment_power)
990 == bfd_section_size (abfd, debug_string_section))));
996 coff_write_linenumbers (abfd)
1000 bfd_size_type linesz;
1003 linesz = bfd_coff_linesz (abfd);
1004 buff = bfd_alloc (abfd, linesz);
1007 bfd_set_error (bfd_error_no_memory);
1010 for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
1011 if (s->lineno_count) {
1012 asymbol **q = abfd->outsymbols;
1013 if (bfd_seek(abfd, s->line_filepos, SEEK_SET) != 0)
1015 /* Find all the linenumbers in this section */
1018 if (p->section->output_section == s) {
1020 BFD_SEND(bfd_asymbol_bfd(p), _get_lineno, (bfd_asymbol_bfd(p), p));
1022 /* Found a linenumber entry, output */
1023 struct internal_lineno out;
1024 memset( (PTR)&out, 0, sizeof(out));
1026 out.l_addr.l_symndx = l->u.offset;
1027 bfd_coff_swap_lineno_out(abfd, &out, buff);
1028 if (bfd_write(buff, 1, linesz, abfd) != linesz)
1031 while (l->line_number) {
1032 out.l_lnno = l->line_number;
1033 out.l_addr.l_symndx = l->u.offset;
1034 bfd_coff_swap_lineno_out(abfd, &out, buff);
1035 if (bfd_write(buff, 1, linesz, abfd) != linesz)
1045 bfd_release (abfd, buff);
1051 coff_get_lineno (ignore_abfd, symbol)
1055 return coffsymbol(symbol)->lineno;
1059 coff_section_symbol (abfd, name)
1063 asection *sec = bfd_make_section_old_way (abfd, name);
1065 combined_entry_type *csym;
1068 csym = coff_symbol_from (abfd, sym)->native;
1069 /* Make sure back-end COFF stuff is there. */
1073 coff_symbol_type sym;
1074 /* @@FIXME This shouldn't use a fixed size!! */
1075 combined_entry_type e[10];
1078 f = (struct foo *) bfd_alloc_by_size_t (abfd, sizeof (*f));
1081 bfd_set_error (bfd_error_no_error);
1084 memset ((char *) f, 0, sizeof (*f));
1085 coff_symbol_from (abfd, sym)->native = csym = f->e;
1087 csym[0].u.syment.n_sclass = C_STAT;
1088 csym[0].u.syment.n_numaux = 1;
1089 /* SF_SET_STATICS (sym); @@ ??? */
1090 csym[1].u.auxent.x_scn.x_scnlen = sec->_raw_size;
1091 csym[1].u.auxent.x_scn.x_nreloc = sec->reloc_count;
1092 csym[1].u.auxent.x_scn.x_nlinno = sec->lineno_count;
1094 if (sec->output_section == NULL)
1096 sec->output_section = sec;
1097 sec->output_offset = 0;
1103 /* This function transforms the offsets into the symbol table into
1104 pointers to syments. */
1107 coff_pointerize_aux (abfd, table_base, type, class, auxent)
1109 combined_entry_type *table_base;
1112 combined_entry_type *auxent;
1114 /* Don't bother if this is a file or a section */
1115 if (class == C_STAT && type == T_NULL) return;
1116 if (class == C_FILE) return;
1118 /* Otherwise patch up */
1119 #define N_TMASK coff_data (abfd)->local_n_tmask
1120 #define N_BTSHFT coff_data (abfd)->local_n_btshft
1121 if (ISFCN(type) || ISTAG(class) || class == C_BLOCK) {
1122 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = table_base +
1123 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
1124 auxent->fix_end = 1;
1126 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1127 generate one, so we must be careful to ignore it. */
1128 if (auxent->u.auxent.x_sym.x_tagndx.l > 0) {
1129 auxent->u.auxent.x_sym.x_tagndx.p =
1130 table_base + auxent->u.auxent.x_sym.x_tagndx.l;
1131 auxent->fix_tag = 1;
1136 build_string_table (abfd)
1139 char string_table_size_buffer[4];
1140 unsigned int string_table_size;
1143 /* At this point we should be "seek"'d to the end of the
1144 symbols === the symbol table size. */
1145 if (bfd_read((char *) string_table_size_buffer,
1146 sizeof(string_table_size_buffer),
1147 1, abfd) != sizeof(string_table_size))
1150 string_table_size = bfd_h_get_32(abfd, (bfd_byte *) string_table_size_buffer);
1152 if ((string_table = (PTR) bfd_alloc(abfd, string_table_size -= 4)) == NULL) {
1153 bfd_set_error (bfd_error_no_memory);
1155 } /* on mallocation error */
1156 if (bfd_read(string_table, string_table_size, 1, abfd) != string_table_size)
1158 return string_table;
1161 /* Allocate space for the ".debug" section, and read it.
1162 We did not read the debug section until now, because
1163 we didn't want to go to the trouble until someone needed it. */
1166 build_debug_section (abfd)
1169 char *debug_section;
1172 asection *sect = bfd_get_section_by_name (abfd, ".debug");
1175 bfd_set_error (bfd_error_no_debug_section);
1179 debug_section = (PTR) bfd_alloc (abfd,
1180 bfd_get_section_size_before_reloc (sect));
1181 if (debug_section == NULL) {
1182 bfd_set_error (bfd_error_no_memory);
1186 /* Seek to the beginning of the `.debug' section and read it.
1187 Save the current position first; it is needed by our caller.
1188 Then read debug section and reset the file pointer. */
1190 position = bfd_tell (abfd);
1191 if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0
1192 || (bfd_read (debug_section,
1193 bfd_get_section_size_before_reloc (sect), 1, abfd)
1194 != bfd_get_section_size_before_reloc(sect))
1195 || bfd_seek (abfd, position, SEEK_SET) != 0)
1197 return debug_section;
1201 /* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1202 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1203 be \0-terminated. */
1205 copy_name (abfd, name, maxlen)
1213 for (len = 0; len < maxlen; ++len) {
1214 if (name[len] == '\0') {
1219 if ((newname = (PTR) bfd_alloc(abfd, len+1)) == NULL) {
1220 bfd_set_error (bfd_error_no_memory);
1223 strncpy(newname, name, len);
1224 newname[len] = '\0';
1228 /* Read a symbol table into freshly bfd_allocated memory, swap it, and
1229 knit the symbol names into a normalized form. By normalized here I
1230 mean that all symbols have an n_offset pointer that points to a null-
1231 terminated string. */
1233 combined_entry_type *
1234 coff_get_normalized_symtab (abfd)
1237 combined_entry_type *internal;
1238 combined_entry_type *internal_ptr;
1239 combined_entry_type *symbol_ptr;
1240 combined_entry_type *internal_end;
1241 bfd_size_type symesz;
1245 char *string_table = NULL;
1246 char *debug_section = NULL;
1249 unsigned int raw_size;
1250 if (obj_raw_syments(abfd) != (combined_entry_type *)NULL) {
1251 return obj_raw_syments(abfd);
1253 if ((size = bfd_get_symcount(abfd) * sizeof(combined_entry_type)) == 0) {
1254 bfd_set_error (bfd_error_no_symbols);
1258 internal = (combined_entry_type *)bfd_alloc(abfd, size);
1261 bfd_set_error (bfd_error_no_memory);
1264 internal_end = internal + bfd_get_symcount(abfd);
1266 symesz = bfd_coff_symesz (abfd);
1267 raw_size = bfd_get_symcount(abfd) * symesz;
1268 raw = bfd_alloc(abfd,raw_size);
1271 bfd_set_error (bfd_error_no_memory);
1275 if (bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET) == -1
1276 || bfd_read(raw, raw_size, 1, abfd) != raw_size)
1278 /* mark the end of the symbols */
1279 raw_end = (char *) raw + bfd_get_symcount(abfd) * symesz;
1281 FIXME SOMEDAY. A string table size of zero is very weird, but
1282 probably possible. If one shows up, it will probably kill us.
1285 /* Swap all the raw entries */
1286 for (raw_src = (char *) raw, internal_ptr = internal;
1288 raw_src += symesz, internal_ptr++) {
1291 bfd_coff_swap_sym_in(abfd, (PTR)raw_src, (PTR)&internal_ptr->u.syment);
1292 internal_ptr->fix_value = 0;
1293 internal_ptr->fix_tag = 0;
1294 internal_ptr->fix_end = 0;
1295 internal_ptr->fix_scnlen = 0;
1296 symbol_ptr = internal_ptr;
1299 i < symbol_ptr->u.syment.n_numaux;
1305 internal_ptr->fix_value = 0;
1306 internal_ptr->fix_tag = 0;
1307 internal_ptr->fix_end = 0;
1308 internal_ptr->fix_scnlen = 0;
1309 bfd_coff_swap_aux_in(abfd, (PTR) raw_src,
1310 symbol_ptr->u.syment.n_type,
1311 symbol_ptr->u.syment.n_sclass,
1312 i, symbol_ptr->u.syment.n_numaux,
1313 &(internal_ptr->u.auxent));
1314 /* Remember that bal entries arn't pointerized */
1315 if (i != 1 || symbol_ptr->u.syment.n_sclass != C_LEAFPROC)
1318 coff_pointerize_aux(abfd,
1320 symbol_ptr->u.syment.n_type,
1321 symbol_ptr->u.syment.n_sclass,
1328 /* Free all the raw stuff */
1329 bfd_release(abfd, raw);
1331 for (internal_ptr = internal; internal_ptr < internal_end;
1334 if (internal_ptr->u.syment.n_sclass == C_FILE) {
1335 /* make a file symbol point to the name in the auxent, since
1336 the text ".file" is redundant */
1337 if ((internal_ptr+1)->u.auxent.x_file.x_n.x_zeroes == 0) {
1338 /* the filename is a long one, point into the string table */
1339 if (string_table == NULL) {
1340 string_table = build_string_table(abfd);
1343 internal_ptr->u.syment._n._n_n._n_offset =
1344 (long) (string_table - 4 +
1345 (internal_ptr+1)->u.auxent.x_file.x_n.x_offset);
1348 /* ordinary short filename, put into memory anyway */
1349 internal_ptr->u.syment._n._n_n._n_offset = (long)
1350 copy_name(abfd, (internal_ptr+1)->u.auxent.x_file.x_fname,
1355 if (internal_ptr->u.syment._n._n_n._n_zeroes != 0) {
1356 /* This is a "short" name. Make it long. */
1357 unsigned long i = 0;
1358 char *newstring = NULL;
1360 /* find the length of this string without walking into memory
1362 for (i = 0; i < 8; ++i) {
1363 if (internal_ptr->u.syment._n._n_name[i] == '\0') {
1365 } /* if end of string */
1366 } /* possible lengths of this string. */
1368 if ((newstring = (PTR) bfd_alloc(abfd, ++i)) == NULL) {
1369 bfd_set_error (bfd_error_no_memory);
1372 memset(newstring, 0, i);
1373 strncpy(newstring, internal_ptr->u.syment._n._n_name, i-1);
1374 internal_ptr->u.syment._n._n_n._n_offset = (long int) newstring;
1375 internal_ptr->u.syment._n._n_n._n_zeroes = 0;
1377 else if (internal_ptr->u.syment._n._n_n._n_offset == 0)
1378 internal_ptr->u.syment._n._n_n._n_offset = (long int) "";
1379 else if (!bfd_coff_symname_in_debug(abfd, &internal_ptr->u.syment)) {
1380 /* Long name already. Point symbol at the string in the table. */
1381 if (string_table == NULL) {
1382 string_table = build_string_table(abfd);
1384 internal_ptr->u.syment._n._n_n._n_offset = (long int)
1385 (string_table - 4 + internal_ptr->u.syment._n._n_n._n_offset);
1388 /* Long name in debug section. Very similar. */
1389 if (debug_section == NULL) {
1390 debug_section = build_debug_section(abfd);
1392 internal_ptr->u.syment._n._n_n._n_offset = (long int)
1393 (debug_section + internal_ptr->u.syment._n._n_n._n_offset);
1396 internal_ptr += internal_ptr->u.syment.n_numaux;
1399 obj_raw_syments(abfd) = internal;
1400 obj_raw_syment_count(abfd) = internal_ptr - internal;
1403 } /* coff_get_normalized_symtab() */
1406 coff_get_reloc_upper_bound (abfd, asect)
1410 if (bfd_get_format(abfd) != bfd_object) {
1411 bfd_set_error (bfd_error_invalid_operation);
1414 return (asect->reloc_count + 1) * sizeof(arelent *);
1418 coff_make_empty_symbol (abfd)
1421 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type));
1423 bfd_set_error (bfd_error_no_memory);
1426 memset (new, 0, sizeof *new);
1427 new->symbol.section = 0;
1429 new->lineno = (alent *) NULL;
1430 new->done_lineno = false;
1431 new->symbol.the_bfd = abfd;
1432 return &new->symbol;
1435 /* Make a debugging symbol. */
1438 coff_bfd_make_debug_symbol (abfd, ptr, sz)
1443 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type));
1445 bfd_set_error (bfd_error_no_memory);
1448 /* @@ This shouldn't be using a constant multiplier. */
1449 new->native = (combined_entry_type *) bfd_zalloc (abfd, sizeof (combined_entry_type) * 10);
1452 bfd_set_error (bfd_error_no_memory);
1455 new->symbol.section = &bfd_debug_section;
1456 new->lineno = (alent *) NULL;
1457 new->done_lineno = false;
1458 new->symbol.the_bfd = abfd;
1459 return &new->symbol;
1464 coff_get_symbol_info (abfd, symbol, ret)
1469 bfd_symbol_info (symbol, ret);
1472 /* Print out information about COFF symbol. */
1475 coff_print_symbol (abfd, filep, symbol, how)
1479 bfd_print_symbol_type how;
1481 FILE *file = (FILE *) filep;
1485 case bfd_print_symbol_name:
1486 fprintf (file, "%s", symbol->name);
1489 case bfd_print_symbol_more:
1490 fprintf (file, "coff %s %s",
1491 coffsymbol(symbol)->native ? "n" : "g",
1492 coffsymbol(symbol)->lineno ? "l" : " ");
1495 case bfd_print_symbol_all:
1496 if (coffsymbol(symbol)->native)
1499 combined_entry_type *combined = coffsymbol (symbol)->native;
1500 combined_entry_type *root = obj_raw_syments (abfd);
1501 struct lineno_cache_entry *l = coffsymbol(symbol)->lineno;
1503 fprintf (file,"[%3d]", combined - root);
1506 "(sc %2d)(fl 0x%02x)(ty %3x)(sc %3d) (nx %d) 0x%08lx %s",
1507 combined->u.syment.n_scnum,
1508 combined->u.syment.n_flags,
1509 combined->u.syment.n_type,
1510 combined->u.syment.n_sclass,
1511 combined->u.syment.n_numaux,
1512 (unsigned long) combined->u.syment.n_value,
1515 for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
1517 combined_entry_type *auxp = combined + aux + 1;
1521 tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
1523 tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
1525 fprintf (file, "\n");
1526 switch (combined->u.syment.n_sclass)
1529 fprintf (file, "File ");
1533 fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
1534 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
1535 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
1543 fprintf (file, "\n%s :", l->u.sym->name);
1545 while (l->line_number)
1547 fprintf (file, "\n%4d : 0x%lx",
1550 (l->u.offset + symbol->section->vma)));
1557 bfd_print_symbol_vandf ((PTR) file, symbol);
1558 fprintf (file, " %-5s %s %s %s",
1559 symbol->section->name,
1560 coffsymbol(symbol)->native ? "n" : "g",
1561 coffsymbol(symbol)->lineno ? "l" : " ",
1567 /* Provided a BFD, a section and an offset into the section, calculate
1568 and return the name of the source file and the line nearest to the
1573 coff_find_nearest_line (abfd, section, ignore_symbols, offset, filename_ptr,
1574 functionname_ptr, line_ptr)
1577 asymbol **ignore_symbols;
1579 CONST char **filename_ptr;
1580 CONST char **functionname_ptr;
1581 unsigned int *line_ptr;
1583 static bfd *cache_abfd;
1584 static asection *cache_section;
1585 static bfd_vma cache_offset;
1586 static unsigned int cache_i;
1587 static CONST char *cache_function;
1588 static unsigned int line_base = 0;
1591 coff_data_type *cof = coff_data(abfd);
1592 /* Run through the raw syments if available */
1593 combined_entry_type *p;
1598 *functionname_ptr = 0;
1601 /* Don't try and find line numbers in a non coff file */
1602 if (abfd->xvec->flavour != bfd_target_coff_flavour)
1608 p = cof->raw_syments;
1610 for (i = 0; i < cof->raw_syment_count; i++) {
1611 if (p->u.syment.n_sclass == C_FILE) {
1612 /* File name has been moved into symbol */
1613 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
1616 p += 1 + p->u.syment.n_numaux;
1618 /* Now wander though the raw linenumbers of the section */
1620 If this is the same BFD as we were previously called with and this is
1621 the same section, and the offset we want is further down then we can
1622 prime the lookup loop
1624 if (abfd == cache_abfd &&
1625 section == cache_section &&
1626 offset >= cache_offset) {
1628 *functionname_ptr = cache_function;
1633 l = §ion->lineno[i];
1635 for (; i < section->lineno_count; i++) {
1636 if (l->line_number == 0) {
1637 /* Get the symbol this line number points at */
1638 coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
1639 if (coff->symbol.value > offset)
1641 *functionname_ptr = coff->symbol.name;
1643 combined_entry_type *s = coff->native;
1644 s = s + 1 + s->u.syment.n_numaux;
1646 S should now point to the .bf of the function
1648 if (s->u.syment.n_numaux) {
1650 The linenumber is stored in the auxent
1652 union internal_auxent *a = &((s + 1)->u.auxent);
1653 line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
1654 *line_ptr = line_base;
1659 if (l->u.offset > offset)
1661 *line_ptr = l->line_number + line_base - 1;
1667 cache_section = section;
1668 cache_offset = offset;
1670 cache_function = *functionname_ptr;
1676 coff_sizeof_headers (abfd, reloc)
1682 if (reloc == false) {
1683 size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
1686 size = bfd_coff_filhsz (abfd);
1689 size += abfd->section_count * bfd_coff_scnhsz (abfd);