1 /* Support for the generic parts of COFF, for BFD.
2 Copyright 1990, 91, 92, 93, 94, 1995 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. */
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 #define STRING_SIZE_SIZE (4)
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);
69 bfd_set_error (bfd_error_no_memory);
72 strncpy (name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
73 name[sizeof (hdr->s_name)] = 0;
75 return_section = bfd_make_section (abfd, name);
76 if (return_section == NULL)
77 return_section = bfd_coff_make_section_hook (abfd, name);
79 /* Handle several sections of the same name. For example, if an executable
80 has two .bss sections, GDB better be able to find both of them
82 if (return_section == NULL)
83 return_section = bfd_make_section_anyway (abfd, name);
85 if (return_section == NULL)
88 /* s_paddr is presumed to be = to s_vaddr */
90 return_section->vma = hdr->s_vaddr;
91 return_section->_raw_size = hdr->s_size;
92 return_section->filepos = hdr->s_scnptr;
93 return_section->rel_filepos = hdr->s_relptr;
94 return_section->reloc_count = hdr->s_nreloc;
96 bfd_coff_set_alignment_hook (abfd, return_section, hdr);
98 return_section->line_filepos = hdr->s_lnnoptr;
100 return_section->lineno_count = hdr->s_nlnno;
101 return_section->userdata = NULL;
102 return_section->next = (asection *) NULL;
103 return_section->flags = bfd_coff_styp_to_sec_flags_hook (abfd, hdr, name);
105 return_section->target_index = target_index;
107 /* At least on i386-coff, the line number count for a shared library
108 section must be ignored. */
109 if ((return_section->flags & SEC_COFF_SHARED_LIBRARY) != 0)
110 return_section->lineno_count = 0;
112 if (hdr->s_nreloc != 0)
113 return_section->flags |= SEC_RELOC;
114 /* FIXME: should this check 'hdr->s_size > 0' */
115 if (hdr->s_scnptr != 0)
116 return_section->flags |= SEC_HAS_CONTENTS;
120 /* Read in a COFF object and make it into a BFD. This is used by
123 static const bfd_target *
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)
152 /* Now copy data as required; construct all asections etc */
156 for (i = 0; i < nscns; i++)
158 struct internal_scnhdr tmp;
159 bfd_coff_swap_scnhdr_in (abfd, (PTR) (external_sections + i * scnhsz),
161 make_a_section_from_file (abfd, &tmp, i + 1);
165 /* make_abs_section (abfd); */
167 if (bfd_coff_set_arch_mach_hook (abfd, (PTR) internal_f) == false)
170 if (!(internal_f->f_flags & F_RELFLG))
171 abfd->flags |= HAS_RELOC;
172 if ((internal_f->f_flags & F_EXEC))
173 abfd->flags |= EXEC_P;
174 if (!(internal_f->f_flags & F_LNNO))
175 abfd->flags |= HAS_LINENO;
176 if (!(internal_f->f_flags & F_LSYMS))
177 abfd->flags |= HAS_LOCALS;
179 /* FIXME: How can we set D_PAGED correctly? */
180 if ((internal_f->f_flags & F_EXEC) != 0)
181 abfd->flags |= D_PAGED;
183 bfd_get_symcount (abfd) = internal_f->f_nsyms;
184 if (internal_f->f_nsyms)
185 abfd->flags |= HAS_SYMS;
187 if (internal_a != (struct internal_aouthdr *) NULL)
188 bfd_get_start_address (abfd) = internal_a->entry;
190 bfd_get_start_address (abfd) = 0;
194 bfd_release (abfd, tdata);
195 return (const bfd_target *) NULL;
198 /* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
199 not a COFF file. This is also used by ECOFF. */
209 struct internal_filehdr internal_f;
210 struct internal_aouthdr internal_a;
212 /* figure out how much to read */
213 filhsz = bfd_coff_filhsz (abfd);
214 aoutsz = bfd_coff_aoutsz (abfd);
216 filehdr = bfd_alloc (abfd, filhsz);
219 if (bfd_read (filehdr, 1, filhsz, abfd) != filhsz)
221 if (bfd_get_error () != bfd_error_system_call)
222 bfd_set_error (bfd_error_wrong_format);
225 bfd_coff_swap_filehdr_in (abfd, filehdr, &internal_f);
226 bfd_release (abfd, filehdr);
228 if (bfd_coff_bad_format_hook (abfd, &internal_f) == false)
230 bfd_set_error (bfd_error_wrong_format);
233 nscns = internal_f.f_nscns;
235 if (internal_f.f_opthdr)
239 opthdr = bfd_alloc (abfd, aoutsz);
242 if (bfd_read (opthdr, 1, aoutsz, abfd) != aoutsz)
246 bfd_coff_swap_aouthdr_in (abfd, opthdr, (PTR) & internal_a);
249 /* Seek past the opt hdr stuff */
250 if (bfd_seek (abfd, (file_ptr) (internal_f.f_opthdr + filhsz), SEEK_SET)
254 return coff_real_object_p (abfd, nscns, &internal_f,
255 (internal_f.f_opthdr != 0
257 : (struct internal_aouthdr *) NULL));
260 /* Get the BFD section from a COFF symbol section number. */
263 coff_section_from_bfd_index (abfd, index)
267 struct sec *answer = abfd->sections;
270 return bfd_abs_section_ptr;
271 if (index == N_UNDEF)
272 return bfd_und_section_ptr;
273 if (index == N_DEBUG)
274 return bfd_abs_section_ptr;
278 if (answer->target_index == index)
280 answer = answer->next;
283 /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
284 has a bad symbol table in biglitpow.o. */
285 return bfd_und_section_ptr;
288 /* Get the upper bound of a COFF symbol table. */
291 coff_get_symtab_upper_bound (abfd)
294 if (!bfd_coff_slurp_symbol_table (abfd))
297 return (bfd_get_symcount (abfd) + 1) * (sizeof (coff_symbol_type *));
301 /* Canonicalize a COFF symbol table. */
304 coff_get_symtab (abfd, alocation)
308 unsigned int counter;
309 coff_symbol_type *symbase;
310 coff_symbol_type **location = (coff_symbol_type **) alocation;
312 if (!bfd_coff_slurp_symbol_table (abfd))
315 symbase = obj_symbols (abfd);
316 counter = bfd_get_symcount (abfd);
317 while (counter-- > 0)
318 *location++ = symbase++;
322 return bfd_get_symcount (abfd);
325 /* Set lineno_count for the output sections of a COFF file. */
328 coff_count_linenumbers (abfd)
331 unsigned int limit = bfd_get_symcount (abfd);
339 /* This may be from the backend linker, in which case the
340 lineno_count in the sections is correct. */
341 for (s = abfd->sections; s != NULL; s = s->next)
342 total += s->lineno_count;
346 for (s = abfd->sections; s != NULL; s = s->next)
347 BFD_ASSERT (s->lineno_count == 0);
349 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
351 asymbol *q_maybe = *p;
353 if (bfd_asymbol_flavour (q_maybe) == bfd_target_coff_flavour)
355 coff_symbol_type *q = coffsymbol (q_maybe);
357 if (q->lineno != NULL)
359 /* This symbol has line numbers. Increment the owning
360 section's linenumber count. */
361 alent *l = q->lineno;
363 ++q->symbol.section->output_section->lineno_count;
366 while (l->line_number != 0)
369 ++q->symbol.section->output_section->lineno_count;
379 /* Takes a bfd and a symbol, returns a pointer to the coff specific
380 area of the symbol if there is one. */
384 coff_symbol_from (ignore_abfd, symbol)
388 if (bfd_asymbol_flavour (symbol) != bfd_target_coff_flavour)
389 return (coff_symbol_type *) NULL;
391 if (bfd_asymbol_bfd (symbol)->tdata.coff_obj_data == (coff_data_type *) NULL)
392 return (coff_symbol_type *) NULL;
394 return (coff_symbol_type *) symbol;
398 fixup_symbol_value (coff_symbol_ptr, syment)
399 coff_symbol_type *coff_symbol_ptr;
400 struct internal_syment *syment;
403 /* Normalize the symbol flags */
404 if (bfd_is_com_section (coff_symbol_ptr->symbol.section))
406 /* a common symbol is undefined with a value */
407 syment->n_scnum = N_UNDEF;
408 syment->n_value = coff_symbol_ptr->symbol.value;
410 else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING)
412 syment->n_value = coff_symbol_ptr->symbol.value;
414 else if (bfd_is_und_section (coff_symbol_ptr->symbol.section))
416 syment->n_scnum = N_UNDEF;
421 if (coff_symbol_ptr->symbol.section)
424 coff_symbol_ptr->symbol.section->output_section->target_index;
427 coff_symbol_ptr->symbol.value +
428 coff_symbol_ptr->symbol.section->output_offset +
429 coff_symbol_ptr->symbol.section->output_section->vma;
435 syment->n_scnum = N_ABS;
436 syment->n_value = coff_symbol_ptr->symbol.value;
441 /* Run through all the symbols in the symbol table and work out what
442 their indexes into the symbol table will be when output.
444 Coff requires that each C_FILE symbol points to the next one in the
445 chain, and that the last one points to the first external symbol. We
449 coff_renumber_symbols (bfd_ptr)
452 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
453 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
454 unsigned int native_index = 0;
455 struct internal_syment *last_file = (struct internal_syment *) NULL;
456 unsigned int symbol_index;
458 /* COFF demands that undefined symbols come after all other symbols.
459 Since we don't need to impose this extra knowledge on all our client
460 programs, deal with that here. Sort the symbol table; just move the
461 undefined symbols to the end, leaving the rest alone. */
462 /* @@ Do we have some condition we could test for, so we don't always
463 have to do this? I don't think relocatability is quite right, but
464 I'm not certain. [raeburn:19920508.1711EST] */
469 newsyms = (asymbol **) bfd_alloc_by_size_t (bfd_ptr,
471 * (symbol_count + 1));
474 bfd_set_error (bfd_error_no_memory);
477 bfd_ptr->outsymbols = newsyms;
478 for (i = 0; i < symbol_count; i++)
479 if (!bfd_is_und_section (symbol_ptr_ptr[i]->section))
480 *newsyms++ = symbol_ptr_ptr[i];
481 for (i = 0; i < symbol_count; i++)
482 if (bfd_is_und_section (symbol_ptr_ptr[i]->section))
483 *newsyms++ = symbol_ptr_ptr[i];
484 *newsyms = (asymbol *) NULL;
485 symbol_ptr_ptr = bfd_ptr->outsymbols;
488 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
490 coff_symbol_type *coff_symbol_ptr = coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
491 if (coff_symbol_ptr && coff_symbol_ptr->native)
493 combined_entry_type *s = coff_symbol_ptr->native;
496 if (s->u.syment.n_sclass == C_FILE)
498 if (last_file != (struct internal_syment *) NULL)
499 last_file->n_value = native_index;
500 last_file = &(s->u.syment);
505 /* Modify the symbol values according to their section and
508 fixup_symbol_value (coff_symbol_ptr, &(s->u.syment));
510 for (i = 0; i < s->u.syment.n_numaux + 1; i++)
511 s[i].offset = native_index++;
518 obj_conv_table_size (bfd_ptr) = native_index;
522 /* Run thorough the symbol table again, and fix it so that all
523 pointers to entries are changed to the entries' index in the output
527 coff_mangle_symbols (bfd_ptr)
530 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
531 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
532 unsigned int symbol_index;
534 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
536 coff_symbol_type *coff_symbol_ptr =
537 coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
539 if (coff_symbol_ptr && coff_symbol_ptr->native)
542 combined_entry_type *s = coff_symbol_ptr->native;
546 /* FIXME: We should use a union here. */
547 s->u.syment.n_value =
548 ((combined_entry_type *) s->u.syment.n_value)->offset;
551 for (i = 0; i < s->u.syment.n_numaux; i++)
553 combined_entry_type *a = s + i + 1;
556 a->u.auxent.x_sym.x_tagndx.l =
557 a->u.auxent.x_sym.x_tagndx.p->offset;
562 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
563 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
568 a->u.auxent.x_csect.x_scnlen.l =
569 a->u.auxent.x_csect.x_scnlen.p->offset;
577 static bfd_size_type string_size;
578 static bfd_size_type debug_string_size;
579 static asection *debug_string_section;
582 coff_fix_symbol_name (abfd, symbol, native)
585 combined_entry_type *native;
587 unsigned int name_length;
588 union internal_auxent *auxent;
589 char *name = (char *) (symbol->name);
591 if (name == (char *) NULL)
593 /* coff symbols always have names, so we'll make one up */
594 symbol->name = "strange";
595 name = (char *) symbol->name;
597 name_length = strlen (name);
599 if (native->u.syment.n_sclass == C_FILE)
601 strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN);
602 auxent = &(native + 1)->u.auxent;
604 if (bfd_coff_long_filenames (abfd))
606 if (name_length <= FILNMLEN)
608 strncpy (auxent->x_file.x_fname, name, FILNMLEN);
612 auxent->x_file.x_n.x_offset = string_size + STRING_SIZE_SIZE;
613 auxent->x_file.x_n.x_zeroes = 0;
614 string_size += name_length + 1;
619 strncpy (auxent->x_file.x_fname, name, FILNMLEN);
620 if (name_length > FILNMLEN)
622 name[FILNMLEN] = '\0';
627 { /* NOT A C_FILE SYMBOL */
628 if (name_length <= SYMNMLEN)
630 /* This name will fit into the symbol neatly */
631 strncpy (native->u.syment._n._n_name, symbol->name, SYMNMLEN);
633 else if (!bfd_coff_symname_in_debug (abfd, &native->u.syment))
635 native->u.syment._n._n_n._n_offset = string_size + STRING_SIZE_SIZE;
636 native->u.syment._n._n_n._n_zeroes = 0;
637 string_size += name_length + 1;
644 /* This name should be written into the .debug section. For
645 some reason each name is preceded by a two byte length
646 and also followed by a null byte. FIXME: We assume that
647 the .debug section has already been created, and that it
649 if (debug_string_section == (asection *) NULL)
650 debug_string_section = bfd_get_section_by_name (abfd, ".debug");
651 filepos = bfd_tell (abfd);
652 bfd_put_16 (abfd, name_length + 1, buf);
653 if (!bfd_set_section_contents (abfd,
654 debug_string_section,
656 (file_ptr) debug_string_size,
658 || !bfd_set_section_contents (abfd,
659 debug_string_section,
661 (file_ptr) debug_string_size + 2,
662 (bfd_size_type) name_length + 1))
664 if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
666 native->u.syment._n._n_n._n_offset = debug_string_size + 2;
667 native->u.syment._n._n_n._n_zeroes = 0;
668 debug_string_size += name_length + 3;
673 /* We need to keep track of the symbol index so that when we write out
674 the relocs we can get the index for a symbol. This method is a
677 #define set_index(symbol, idx) ((symbol)->udata.i = (idx))
679 /* Write a symbol out to a COFF file. */
682 coff_write_symbol (abfd, symbol, native, written)
685 combined_entry_type *native;
686 unsigned int *written;
688 unsigned int numaux = native->u.syment.n_numaux;
689 int type = native->u.syment.n_type;
690 int class = native->u.syment.n_sclass;
692 bfd_size_type symesz;
694 if (native->u.syment.n_sclass == C_FILE)
695 symbol->flags |= BSF_DEBUGGING;
697 if (symbol->flags & BSF_DEBUGGING)
699 native->u.syment.n_scnum = N_DEBUG;
701 else if (bfd_is_abs_section (symbol->section))
703 native->u.syment.n_scnum = N_ABS;
705 else if (bfd_is_und_section (symbol->section))
707 native->u.syment.n_scnum = N_UNDEF;
711 native->u.syment.n_scnum =
712 symbol->section->output_section->target_index;
715 coff_fix_symbol_name (abfd, symbol, native);
717 symesz = bfd_coff_symesz (abfd);
718 buf = bfd_alloc (abfd, symesz);
721 bfd_set_error (bfd_error_no_memory);
724 bfd_coff_swap_sym_out (abfd, &native->u.syment, buf);
725 if (bfd_write (buf, 1, symesz, abfd) != symesz)
727 bfd_release (abfd, buf);
729 if (native->u.syment.n_numaux > 0)
731 bfd_size_type auxesz;
734 auxesz = bfd_coff_auxesz (abfd);
735 buf = bfd_alloc (abfd, auxesz);
738 bfd_set_error (bfd_error_no_memory);
741 for (j = 0; j < native->u.syment.n_numaux; j++)
743 bfd_coff_swap_aux_out (abfd,
744 &((native + j + 1)->u.auxent),
748 native->u.syment.n_numaux,
750 if (bfd_write (buf, 1, auxesz, abfd) != auxesz)
753 bfd_release (abfd, buf);
756 /* Store the index for use when we write out the relocs. */
757 set_index (symbol, *written);
759 *written += numaux + 1;
763 /* Write out a symbol to a COFF file that does not come from a COFF
764 file originally. This symbol may have been created by the linker,
765 or we may be linking a non COFF file to a COFF file. */
768 coff_write_alien_symbol (abfd, symbol, written)
771 unsigned int *written;
773 combined_entry_type *native;
774 combined_entry_type dummy;
777 native->u.syment.n_type = T_NULL;
778 native->u.syment.n_flags = 0;
779 if (bfd_is_und_section (symbol->section))
781 native->u.syment.n_scnum = N_UNDEF;
782 native->u.syment.n_value = symbol->value;
784 else if (bfd_is_com_section (symbol->section))
786 native->u.syment.n_scnum = N_UNDEF;
787 native->u.syment.n_value = symbol->value;
789 else if (symbol->flags & BSF_DEBUGGING)
791 /* There isn't much point to writing out a debugging symbol
792 unless we are prepared to convert it into COFF debugging
793 format. So, we just ignore them. We must clobber the symbol
794 name to keep it from being put in the string table. */
800 native->u.syment.n_scnum =
801 symbol->section->output_section->target_index;
802 native->u.syment.n_value = (symbol->value
803 + symbol->section->output_section->vma
804 + symbol->section->output_offset);
806 /* Copy the any flags from the the file header into the symbol.
809 coff_symbol_type *c = coff_symbol_from (abfd, symbol);
810 if (c != (coff_symbol_type *) NULL)
811 native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
815 native->u.syment.n_type = 0;
816 if (symbol->flags & BSF_LOCAL)
817 native->u.syment.n_sclass = C_STAT;
819 native->u.syment.n_sclass = C_EXT;
820 native->u.syment.n_numaux = 0;
822 return coff_write_symbol (abfd, symbol, native, written);
825 /* Write a native symbol to a COFF file. */
828 coff_write_native_symbol (abfd, symbol, written)
830 coff_symbol_type *symbol;
831 unsigned int *written;
833 combined_entry_type *native = symbol->native;
834 alent *lineno = symbol->lineno;
836 /* If this symbol has an associated line number, we must store the
837 symbol index in the line number field. We also tag the auxent to
838 point to the right place in the lineno table. */
839 if (lineno && !symbol->done_lineno)
841 unsigned int count = 0;
842 lineno[count].u.offset = *written;
843 if (native->u.syment.n_numaux)
845 union internal_auxent *a = &((native + 1)->u.auxent);
847 a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
848 symbol->symbol.section->output_section->moving_line_filepos;
851 /* Count and relocate all other linenumbers. */
853 while (lineno[count].line_number != 0)
857 I've been told this, but still need proof:
858 > The second bug is also in `bfd/coffcode.h'. This bug
859 > causes the linker to screw up the pc-relocations for
860 > all the line numbers in COFF code. This bug isn't only
861 > specific to A29K implementations, but affects all
862 > systems using COFF format binaries. Note that in COFF
863 > object files, the line number core offsets output by
864 > the assembler are relative to the start of each
865 > procedure, not to the start of the .text section. This
866 > patch relocates the line numbers relative to the
867 > `native->u.syment.n_value' instead of the section
871 lineno[count].u.offset += native->u.syment.n_value;
873 lineno[count].u.offset +=
874 (symbol->symbol.section->output_section->vma
875 + symbol->symbol.section->output_offset);
879 symbol->done_lineno = true;
881 symbol->symbol.section->output_section->moving_line_filepos +=
882 count * bfd_coff_linesz (abfd);
885 return coff_write_symbol (abfd, &(symbol->symbol), native, written);
888 /* Write out the COFF symbols. */
891 coff_write_symbols (abfd)
895 unsigned int limit = bfd_get_symcount (abfd);
896 unsigned int written = 0;
900 debug_string_size = 0;
902 /* Seek to the right place */
903 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
906 /* Output all the symbols we have */
909 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
911 asymbol *symbol = *p;
912 coff_symbol_type *c_symbol = coff_symbol_from (abfd, symbol);
914 if (c_symbol == (coff_symbol_type *) NULL
915 || c_symbol->native == (combined_entry_type *) NULL)
917 if (!coff_write_alien_symbol (abfd, symbol, &written))
922 if (!coff_write_native_symbol (abfd, c_symbol, &written))
927 obj_raw_syment_count (abfd) = written;
929 /* Now write out strings */
931 if (string_size != 0)
933 unsigned int size = string_size + STRING_SIZE_SIZE;
934 bfd_byte buffer[STRING_SIZE_SIZE];
936 #if STRING_SIZE_SIZE == 4
937 bfd_h_put_32 (abfd, size, buffer);
939 #error Change bfd_h_put_32
941 if (bfd_write ((PTR) buffer, 1, sizeof (buffer), abfd) != sizeof (buffer))
943 for (p = abfd->outsymbols, i = 0;
948 size_t name_length = strlen (q->name);
949 coff_symbol_type *c_symbol = coff_symbol_from (abfd, q);
952 /* Figure out whether the symbol name should go in the string
953 table. Symbol names that are short enough are stored
954 directly in the syment structure. File names permit a
955 different, longer, length in the syment structure. On
956 XCOFF, some symbol names are stored in the .debug section
957 rather than in the string table. */
960 || c_symbol->native == NULL)
962 /* This is not a COFF symbol, so it certainly is not a
963 file name, nor does it go in the .debug section. */
966 else if (bfd_coff_symname_in_debug (abfd,
967 &c_symbol->native->u.syment))
969 /* This symbol name is in the XCOFF .debug section.
970 Don't write it into the string table. */
971 maxlen = name_length;
973 else if (c_symbol->native->u.syment.n_sclass == C_FILE)
978 if (name_length > maxlen)
980 if (bfd_write ((PTR) (q->name), 1, name_length + 1, abfd)
988 /* We would normally not write anything here, but we'll write
989 out 4 so that any stupid coff reader which tries to read the
990 string table even when there isn't one won't croak. */
991 unsigned int size = STRING_SIZE_SIZE;
992 bfd_byte buffer[STRING_SIZE_SIZE];
994 #if STRING_SIZE_SIZE == 4
995 bfd_h_put_32 (abfd, size, buffer);
997 #error Change bfd_h_put_32
999 if (bfd_write ((PTR) buffer, 1, STRING_SIZE_SIZE, abfd)
1000 != STRING_SIZE_SIZE)
1004 /* Make sure the .debug section was created to be the correct size.
1005 We should create it ourselves on the fly, but we don't because
1006 BFD won't let us write to any section until we know how large all
1007 the sections are. We could still do it by making another pass
1008 over the symbols. FIXME. */
1009 BFD_ASSERT (debug_string_size == 0
1010 || (debug_string_section != (asection *) NULL
1011 && (BFD_ALIGN (debug_string_size,
1012 1 << debug_string_section->alignment_power)
1013 == bfd_section_size (abfd, debug_string_section))));
1019 coff_write_linenumbers (abfd)
1023 bfd_size_type linesz;
1026 linesz = bfd_coff_linesz (abfd);
1027 buff = bfd_alloc (abfd, linesz);
1030 bfd_set_error (bfd_error_no_memory);
1033 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1035 if (s->lineno_count)
1037 asymbol **q = abfd->outsymbols;
1038 if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0)
1040 /* Find all the linenumbers in this section */
1044 if (p->section->output_section == s)
1047 BFD_SEND (bfd_asymbol_bfd (p), _get_lineno,
1048 (bfd_asymbol_bfd (p), p));
1051 /* Found a linenumber entry, output */
1052 struct internal_lineno out;
1053 memset ((PTR) & out, 0, sizeof (out));
1055 out.l_addr.l_symndx = l->u.offset;
1056 bfd_coff_swap_lineno_out (abfd, &out, buff);
1057 if (bfd_write (buff, 1, linesz, abfd) != linesz)
1060 while (l->line_number)
1062 out.l_lnno = l->line_number;
1063 out.l_addr.l_symndx = l->u.offset;
1064 bfd_coff_swap_lineno_out (abfd, &out, buff);
1065 if (bfd_write (buff, 1, linesz, abfd) != linesz)
1075 bfd_release (abfd, buff);
1081 coff_get_lineno (ignore_abfd, symbol)
1085 return coffsymbol (symbol)->lineno;
1089 coff_section_symbol (abfd, name)
1093 asection *sec = bfd_make_section_old_way (abfd, name);
1095 combined_entry_type *csym;
1098 csym = coff_symbol_from (abfd, sym)->native;
1099 /* Make sure back-end COFF stuff is there. */
1104 coff_symbol_type sym;
1105 /* @@FIXME This shouldn't use a fixed size!! */
1106 combined_entry_type e[10];
1109 f = (struct foo *) bfd_alloc_by_size_t (abfd, sizeof (*f));
1112 bfd_set_error (bfd_error_no_error);
1115 memset ((char *) f, 0, sizeof (*f));
1116 coff_symbol_from (abfd, sym)->native = csym = f->e;
1118 csym[0].u.syment.n_sclass = C_STAT;
1119 csym[0].u.syment.n_numaux = 1;
1120 /* SF_SET_STATICS (sym); @@ ??? */
1121 csym[1].u.auxent.x_scn.x_scnlen = sec->_raw_size;
1122 csym[1].u.auxent.x_scn.x_nreloc = sec->reloc_count;
1123 csym[1].u.auxent.x_scn.x_nlinno = sec->lineno_count;
1125 if (sec->output_section == NULL)
1127 sec->output_section = sec;
1128 sec->output_offset = 0;
1134 /* This function transforms the offsets into the symbol table into
1135 pointers to syments. */
1138 coff_pointerize_aux (abfd, table_base, type, class, auxent)
1140 combined_entry_type *table_base;
1143 combined_entry_type *auxent;
1145 /* Don't bother if this is a file or a section */
1146 if (class == C_STAT && type == T_NULL)
1148 if (class == C_FILE)
1151 /* Otherwise patch up */
1152 #define N_TMASK coff_data (abfd)->local_n_tmask
1153 #define N_BTSHFT coff_data (abfd)->local_n_btshft
1154 if ((ISFCN (type) || ISTAG (class) || class == C_BLOCK)
1155 && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l > 0)
1157 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p =
1159 + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l);
1160 auxent->fix_end = 1;
1162 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1163 generate one, so we must be careful to ignore it. */
1164 if (auxent->u.auxent.x_sym.x_tagndx.l > 0)
1166 auxent->u.auxent.x_sym.x_tagndx.p =
1167 table_base + auxent->u.auxent.x_sym.x_tagndx.l;
1168 auxent->fix_tag = 1;
1173 build_string_table (abfd)
1176 char string_table_size_buffer[STRING_SIZE_SIZE];
1177 unsigned int string_table_size;
1180 /* At this point we should be "seek"'d to the end of the
1181 symbols === the symbol table size. */
1182 if (bfd_read ((char *) string_table_size_buffer,
1183 sizeof (string_table_size_buffer),
1184 1, abfd) != sizeof (string_table_size))
1187 #if STRING_SIZE_SIZE == 4
1188 string_table_size = bfd_h_get_32 (abfd, (bfd_byte *) string_table_size_buffer);
1190 #error Change bfd_h_get_32
1193 if ((string_table = (PTR) bfd_alloc (abfd,
1194 string_table_size -= STRING_SIZE_SIZE))
1197 bfd_set_error (bfd_error_no_memory);
1199 } /* on mallocation error */
1200 if (bfd_read (string_table, string_table_size, 1, abfd) != string_table_size)
1202 return string_table;
1205 /* Allocate space for the ".debug" section, and read it.
1206 We did not read the debug section until now, because
1207 we didn't want to go to the trouble until someone needed it. */
1210 build_debug_section (abfd)
1213 char *debug_section;
1216 asection *sect = bfd_get_section_by_name (abfd, ".debug");
1220 bfd_set_error (bfd_error_no_debug_section);
1224 debug_section = (PTR) bfd_alloc (abfd,
1225 bfd_get_section_size_before_reloc (sect));
1226 if (debug_section == NULL)
1228 bfd_set_error (bfd_error_no_memory);
1232 /* Seek to the beginning of the `.debug' section and read it.
1233 Save the current position first; it is needed by our caller.
1234 Then read debug section and reset the file pointer. */
1236 position = bfd_tell (abfd);
1237 if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0
1238 || (bfd_read (debug_section,
1239 bfd_get_section_size_before_reloc (sect), 1, abfd)
1240 != bfd_get_section_size_before_reloc (sect))
1241 || bfd_seek (abfd, position, SEEK_SET) != 0)
1243 return debug_section;
1247 /* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1248 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1249 be \0-terminated. */
1251 copy_name (abfd, name, maxlen)
1259 for (len = 0; len < maxlen; ++len)
1261 if (name[len] == '\0')
1267 if ((newname = (PTR) bfd_alloc (abfd, len + 1)) == NULL)
1269 bfd_set_error (bfd_error_no_memory);
1272 strncpy (newname, name, len);
1273 newname[len] = '\0';
1277 /* Read a symbol table into freshly bfd_allocated memory, swap it, and
1278 knit the symbol names into a normalized form. By normalized here I
1279 mean that all symbols have an n_offset pointer that points to a null-
1280 terminated string. */
1282 combined_entry_type *
1283 coff_get_normalized_symtab (abfd)
1286 combined_entry_type *internal;
1287 combined_entry_type *internal_ptr;
1288 combined_entry_type *symbol_ptr;
1289 combined_entry_type *internal_end;
1290 bfd_size_type symesz;
1294 char *string_table = NULL;
1295 char *debug_section = NULL;
1297 unsigned int raw_size;
1299 if (obj_raw_syments (abfd) != NULL)
1300 return obj_raw_syments (abfd);
1302 size = obj_raw_syment_count (abfd) * sizeof (combined_entry_type);
1303 internal = (combined_entry_type *) bfd_alloc (abfd, size);
1304 if (internal == NULL && size != 0)
1306 bfd_set_error (bfd_error_no_memory);
1309 internal_end = internal + obj_raw_syment_count (abfd);
1311 symesz = bfd_coff_symesz (abfd);
1312 raw_size = obj_raw_syment_count (abfd) * symesz;
1313 raw = bfd_alloc (abfd, raw_size);
1314 if (raw == NULL && raw_size != 0)
1316 bfd_set_error (bfd_error_no_memory);
1320 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) == -1
1321 || bfd_read (raw, raw_size, 1, abfd) != raw_size)
1324 /* mark the end of the symbols */
1325 raw_end = (char *) raw + obj_raw_syment_count (abfd) * symesz;
1327 /* FIXME SOMEDAY. A string table size of zero is very weird, but
1328 probably possible. If one shows up, it will probably kill us. */
1330 /* Swap all the raw entries */
1331 for (raw_src = (char *) raw, internal_ptr = internal;
1333 raw_src += symesz, internal_ptr++)
1337 bfd_coff_swap_sym_in (abfd, (PTR) raw_src,
1338 (PTR) & internal_ptr->u.syment);
1339 internal_ptr->fix_value = 0;
1340 internal_ptr->fix_tag = 0;
1341 internal_ptr->fix_end = 0;
1342 internal_ptr->fix_scnlen = 0;
1343 symbol_ptr = internal_ptr;
1346 i < symbol_ptr->u.syment.n_numaux;
1352 internal_ptr->fix_value = 0;
1353 internal_ptr->fix_tag = 0;
1354 internal_ptr->fix_end = 0;
1355 internal_ptr->fix_scnlen = 0;
1356 bfd_coff_swap_aux_in (abfd, (PTR) raw_src,
1357 symbol_ptr->u.syment.n_type,
1358 symbol_ptr->u.syment.n_sclass,
1359 i, symbol_ptr->u.syment.n_numaux,
1360 &(internal_ptr->u.auxent));
1361 /* Remember that bal entries arn't pointerized */
1362 if (i != 1 || symbol_ptr->u.syment.n_sclass != C_LEAFPROC)
1365 coff_pointerize_aux (abfd,
1367 symbol_ptr->u.syment.n_type,
1368 symbol_ptr->u.syment.n_sclass,
1375 /* Free all the raw stuff */
1377 bfd_release (abfd, raw);
1379 for (internal_ptr = internal; internal_ptr < internal_end;
1382 if (internal_ptr->u.syment.n_sclass == C_FILE
1383 && internal_ptr->u.syment.n_numaux > 0)
1385 /* make a file symbol point to the name in the auxent, since
1386 the text ".file" is redundant */
1387 if ((internal_ptr + 1)->u.auxent.x_file.x_n.x_zeroes == 0)
1389 /* the filename is a long one, point into the string table */
1390 if (string_table == NULL)
1391 string_table = build_string_table (abfd);
1393 internal_ptr->u.syment._n._n_n._n_offset =
1394 (long) (string_table - STRING_SIZE_SIZE +
1395 (internal_ptr + 1)->u.auxent.x_file.x_n.x_offset);
1399 /* ordinary short filename, put into memory anyway */
1400 internal_ptr->u.syment._n._n_n._n_offset = (long)
1401 copy_name (abfd, (internal_ptr + 1)->u.auxent.x_file.x_fname,
1407 if (internal_ptr->u.syment._n._n_n._n_zeroes != 0)
1409 /* This is a "short" name. Make it long. */
1410 unsigned long i = 0;
1411 char *newstring = NULL;
1413 /* find the length of this string without walking into memory
1415 for (i = 0; i < 8; ++i)
1417 if (internal_ptr->u.syment._n._n_name[i] == '\0')
1420 } /* if end of string */
1421 } /* possible lengths of this string. */
1423 if ((newstring = (PTR) bfd_alloc (abfd, ++i)) == NULL)
1425 bfd_set_error (bfd_error_no_memory);
1428 memset (newstring, 0, i);
1429 strncpy (newstring, internal_ptr->u.syment._n._n_name, i - 1);
1430 internal_ptr->u.syment._n._n_n._n_offset = (long int) newstring;
1431 internal_ptr->u.syment._n._n_n._n_zeroes = 0;
1433 else if (internal_ptr->u.syment._n._n_n._n_offset == 0)
1434 internal_ptr->u.syment._n._n_n._n_offset = (long int) "";
1435 else if (!bfd_coff_symname_in_debug (abfd, &internal_ptr->u.syment))
1437 /* Long name already. Point symbol at the string in the
1439 if (string_table == NULL)
1440 string_table = build_string_table (abfd);
1441 internal_ptr->u.syment._n._n_n._n_offset = (long int)
1444 + internal_ptr->u.syment._n._n_n._n_offset);
1448 /* Long name in debug section. Very similar. */
1449 if (debug_section == NULL)
1450 debug_section = build_debug_section (abfd);
1451 internal_ptr->u.syment._n._n_n._n_offset = (long int)
1452 (debug_section + internal_ptr->u.syment._n._n_n._n_offset);
1455 internal_ptr += internal_ptr->u.syment.n_numaux;
1458 obj_raw_syments (abfd) = internal;
1459 BFD_ASSERT (obj_raw_syment_count (abfd) == internal_ptr - internal);
1462 } /* coff_get_normalized_symtab() */
1465 coff_get_reloc_upper_bound (abfd, asect)
1469 if (bfd_get_format (abfd) != bfd_object)
1471 bfd_set_error (bfd_error_invalid_operation);
1474 return (asect->reloc_count + 1) * sizeof (arelent *);
1478 coff_make_empty_symbol (abfd)
1481 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc (abfd, sizeof (coff_symbol_type));
1484 bfd_set_error (bfd_error_no_memory);
1487 memset (new, 0, sizeof *new);
1488 new->symbol.section = 0;
1490 new->lineno = (alent *) NULL;
1491 new->done_lineno = false;
1492 new->symbol.the_bfd = abfd;
1493 return &new->symbol;
1496 /* Make a debugging symbol. */
1499 coff_bfd_make_debug_symbol (abfd, ptr, sz)
1504 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc (abfd, sizeof (coff_symbol_type));
1507 bfd_set_error (bfd_error_no_memory);
1510 /* @@ This shouldn't be using a constant multiplier. */
1511 new->native = (combined_entry_type *) bfd_zalloc (abfd, sizeof (combined_entry_type) * 10);
1514 bfd_set_error (bfd_error_no_memory);
1517 new->symbol.section = bfd_abs_section_ptr;
1518 new->symbol.flags = BSF_DEBUGGING;
1519 new->lineno = (alent *) NULL;
1520 new->done_lineno = false;
1521 new->symbol.the_bfd = abfd;
1522 return &new->symbol;
1527 coff_get_symbol_info (abfd, symbol, ret)
1532 bfd_symbol_info (symbol, ret);
1535 /* Print out information about COFF symbol. */
1538 coff_print_symbol (abfd, filep, symbol, how)
1542 bfd_print_symbol_type how;
1544 FILE *file = (FILE *) filep;
1548 case bfd_print_symbol_name:
1549 fprintf (file, "%s", symbol->name);
1552 case bfd_print_symbol_more:
1553 fprintf (file, "coff %s %s",
1554 coffsymbol (symbol)->native ? "n" : "g",
1555 coffsymbol (symbol)->lineno ? "l" : " ");
1558 case bfd_print_symbol_all:
1559 if (coffsymbol (symbol)->native)
1562 combined_entry_type *combined = coffsymbol (symbol)->native;
1563 combined_entry_type *root = obj_raw_syments (abfd);
1564 struct lineno_cache_entry *l = coffsymbol (symbol)->lineno;
1566 fprintf (file, "[%3ld]", (long) (combined - root));
1569 "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x%08lx %s",
1570 combined->u.syment.n_scnum,
1571 combined->u.syment.n_flags,
1572 combined->u.syment.n_type,
1573 combined->u.syment.n_sclass,
1574 combined->u.syment.n_numaux,
1575 (unsigned long) combined->u.syment.n_value,
1578 for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
1580 combined_entry_type *auxp = combined + aux + 1;
1584 tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
1586 tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
1588 fprintf (file, "\n");
1589 switch (combined->u.syment.n_sclass)
1592 fprintf (file, "File ");
1596 if (combined->u.syment.n_type == T_NULL)
1597 /* probably a section symbol? */
1599 fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d",
1600 (long) auxp->u.auxent.x_scn.x_scnlen,
1601 auxp->u.auxent.x_scn.x_nreloc,
1602 auxp->u.auxent.x_scn.x_nlinno);
1605 /* else fall through */
1608 fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
1609 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
1610 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
1613 fprintf (file, " endndx %ld",
1615 (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
1623 fprintf (file, "\n%s :", l->u.sym->name);
1625 while (l->line_number)
1627 fprintf (file, "\n%4d : 0x%lx",
1630 (l->u.offset + symbol->section->vma)));
1637 bfd_print_symbol_vandf ((PTR) file, symbol);
1638 fprintf (file, " %-5s %s %s %s",
1639 symbol->section->name,
1640 coffsymbol (symbol)->native ? "n" : "g",
1641 coffsymbol (symbol)->lineno ? "l" : " ",
1647 /* Provided a BFD, a section and an offset into the section, calculate
1648 and return the name of the source file and the line nearest to the
1653 coff_find_nearest_line (abfd, section, ignore_symbols, offset, filename_ptr,
1654 functionname_ptr, line_ptr)
1657 asymbol **ignore_symbols;
1659 CONST char **filename_ptr;
1660 CONST char **functionname_ptr;
1661 unsigned int *line_ptr;
1663 static bfd *cache_abfd;
1664 static asection *cache_section;
1665 static bfd_vma cache_offset;
1666 static unsigned int cache_i;
1667 static CONST char *cache_function;
1668 static unsigned int line_base = 0;
1671 coff_data_type *cof = coff_data (abfd);
1672 /* Run through the raw syments if available */
1673 combined_entry_type *p;
1674 combined_entry_type *pend;
1679 *functionname_ptr = 0;
1682 /* Don't try and find line numbers in a non coff file */
1683 if (abfd->xvec->flavour != bfd_target_coff_flavour)
1689 /* Find the first C_FILE symbol. */
1690 p = cof->raw_syments;
1691 pend = p + cof->raw_syment_count;
1694 if (p->u.syment.n_sclass == C_FILE)
1696 p += 1 + p->u.syment.n_numaux;
1703 /* Look through the C_FILE symbols to find the best one. */
1704 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
1705 maxdiff = (bfd_vma) 0 - (bfd_vma) 1;
1708 combined_entry_type *p2;
1710 for (p2 = p + 1 + p->u.syment.n_numaux;
1712 p2 += 1 + p2->u.syment.n_numaux)
1714 if (p2->u.syment.n_scnum > 0
1716 == coff_section_from_bfd_index (abfd,
1717 p2->u.syment.n_scnum)))
1719 if (p2->u.syment.n_sclass == C_FILE)
1727 && offset >= p2->u.syment.n_value
1728 && offset - p2->u.syment.n_value < maxdiff)
1730 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
1731 maxdiff = offset - p2->u.syment.n_value;
1734 /* Avoid endless loops on erroneous files by ensuring that
1735 we always move forward in the file. */
1736 if (p - cof->raw_syments >= p->u.syment.n_value)
1739 p = cof->raw_syments + p->u.syment.n_value;
1740 if (p > pend || p->u.syment.n_sclass != C_FILE)
1745 /* Now wander though the raw linenumbers of the section */
1746 /* If this is the same BFD as we were previously called with and
1747 this is the same section, and the offset we want is further down
1748 then we can prime the lookup loop. */
1749 if (abfd == cache_abfd &&
1750 section == cache_section &&
1751 offset >= cache_offset)
1754 *functionname_ptr = cache_function;
1760 l = §ion->lineno[i];
1762 for (; i < section->lineno_count; i++)
1764 if (l->line_number == 0)
1766 /* Get the symbol this line number points at */
1767 coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
1768 if (coff->symbol.value > offset)
1770 *functionname_ptr = coff->symbol.name;
1773 combined_entry_type *s = coff->native;
1774 s = s + 1 + s->u.syment.n_numaux;
1776 /* In XCOFF a debugging symbol can follow the function
1778 if (s->u.syment.n_scnum == N_DEBUG)
1779 s = s + 1 + s->u.syment.n_numaux;
1782 S should now point to the .bf of the function
1784 if (s->u.syment.n_numaux)
1787 The linenumber is stored in the auxent
1789 union internal_auxent *a = &((s + 1)->u.auxent);
1790 line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
1791 *line_ptr = line_base;
1797 if (l->u.offset + bfd_get_section_vma (abfd, section) > offset)
1799 *line_ptr = l->line_number + line_base - 1;
1805 cache_section = section;
1806 cache_offset = offset;
1808 cache_function = *functionname_ptr;
1814 coff_sizeof_headers (abfd, reloc)
1822 size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
1826 size = bfd_coff_filhsz (abfd);
1829 size += abfd->section_count * bfd_coff_scnhsz (abfd);