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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, 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 void coff_fix_symbol_name
45 PARAMS ((bfd *, asymbol *, combined_entry_type *, bfd_size_type *,
46 asection **, bfd_size_type *));
47 static boolean coff_write_symbol
48 PARAMS ((bfd *, asymbol *, combined_entry_type *, unsigned int *,
49 bfd_size_type *, asection **, bfd_size_type *));
50 static boolean coff_write_alien_symbol
51 PARAMS ((bfd *, asymbol *, unsigned int *, bfd_size_type *,
52 asection **, bfd_size_type *));
53 static boolean coff_write_native_symbol
54 PARAMS ((bfd *, coff_symbol_type *, unsigned int *, bfd_size_type *,
55 asection **, bfd_size_type *));
56 static void coff_pointerize_aux
57 PARAMS ((bfd *, combined_entry_type *, combined_entry_type *,
58 unsigned int, combined_entry_type *));
60 #define STRING_SIZE_SIZE (4)
62 /* Take a section header read from a coff file (in HOST byte order),
63 and make a BFD "section" out of it. This is used by ECOFF. */
65 make_a_section_from_file (abfd, hdr, target_index)
67 struct internal_scnhdr *hdr;
68 unsigned int target_index;
70 asection *return_section;
73 /* Assorted wastage to null-terminate the name, thanks AT&T! */
74 name = bfd_alloc (abfd, sizeof (hdr->s_name) + 1);
77 bfd_set_error (bfd_error_no_memory);
80 strncpy (name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
81 name[sizeof (hdr->s_name)] = 0;
83 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->lma = return_section->vma;
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;
130 flagword oflags = abfd->flags;
131 bfd_vma ostart = bfd_get_start_address (abfd);
133 size_t readsize; /* length of file_info */
135 char *external_sections;
137 if (!(internal_f->f_flags & F_RELFLG))
138 abfd->flags |= HAS_RELOC;
139 if ((internal_f->f_flags & F_EXEC))
140 abfd->flags |= EXEC_P;
141 if (!(internal_f->f_flags & F_LNNO))
142 abfd->flags |= HAS_LINENO;
143 if (!(internal_f->f_flags & F_LSYMS))
144 abfd->flags |= HAS_LOCALS;
146 /* FIXME: How can we set D_PAGED correctly? */
147 if ((internal_f->f_flags & F_EXEC) != 0)
148 abfd->flags |= D_PAGED;
150 bfd_get_symcount (abfd) = internal_f->f_nsyms;
151 if (internal_f->f_nsyms)
152 abfd->flags |= HAS_SYMS;
154 if (internal_a != (struct internal_aouthdr *) NULL)
155 bfd_get_start_address (abfd) = internal_a->entry;
157 bfd_get_start_address (abfd) = 0;
159 /* Set up the tdata area. ECOFF uses its own routine, and overrides
161 tdata = bfd_coff_mkobject_hook (abfd, (PTR) internal_f, (PTR) internal_a);
165 scnhsz = bfd_coff_scnhsz (abfd);
166 readsize = nscns * scnhsz;
167 external_sections = (char *) bfd_alloc (abfd, readsize);
168 if (!external_sections)
170 bfd_set_error (bfd_error_no_memory);
174 if (bfd_read ((PTR) external_sections, 1, readsize, abfd) != readsize)
177 /* Now copy data as required; construct all asections etc */
181 for (i = 0; i < nscns; i++)
183 struct internal_scnhdr tmp;
184 bfd_coff_swap_scnhdr_in (abfd,
185 (PTR) (external_sections + i * scnhsz),
187 make_a_section_from_file (abfd, &tmp, i + 1);
191 /* make_abs_section (abfd); */
193 if (bfd_coff_set_arch_mach_hook (abfd, (PTR) internal_f) == false)
199 bfd_release (abfd, tdata);
200 abfd->flags = oflags;
201 bfd_get_start_address (abfd) = ostart;
202 return (const bfd_target *) NULL;
205 /* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
206 not a COFF file. This is also used by ECOFF. */
216 struct internal_filehdr internal_f;
217 struct internal_aouthdr internal_a;
219 /* figure out how much to read */
220 filhsz = bfd_coff_filhsz (abfd);
221 aoutsz = bfd_coff_aoutsz (abfd);
223 filehdr = bfd_alloc (abfd, filhsz);
226 if (bfd_read (filehdr, 1, filhsz, abfd) != filhsz)
228 if (bfd_get_error () != bfd_error_system_call)
229 bfd_set_error (bfd_error_wrong_format);
232 bfd_coff_swap_filehdr_in (abfd, filehdr, &internal_f);
233 bfd_release (abfd, filehdr);
235 if (bfd_coff_bad_format_hook (abfd, &internal_f) == false)
237 bfd_set_error (bfd_error_wrong_format);
240 nscns = internal_f.f_nscns;
242 if (internal_f.f_opthdr)
246 opthdr = bfd_alloc (abfd, aoutsz);
249 if (bfd_read (opthdr, 1, aoutsz, abfd) != aoutsz)
253 bfd_coff_swap_aouthdr_in (abfd, opthdr, (PTR) & internal_a);
256 /* Seek past the opt hdr stuff */
257 if (bfd_seek (abfd, (file_ptr) (internal_f.f_opthdr + filhsz), SEEK_SET)
261 return coff_real_object_p (abfd, nscns, &internal_f,
262 (internal_f.f_opthdr != 0
264 : (struct internal_aouthdr *) NULL));
267 /* Get the BFD section from a COFF symbol section number. */
270 coff_section_from_bfd_index (abfd, index)
274 struct sec *answer = abfd->sections;
277 return bfd_abs_section_ptr;
278 if (index == N_UNDEF)
279 return bfd_und_section_ptr;
280 if (index == N_DEBUG)
281 return bfd_abs_section_ptr;
285 if (answer->target_index == index)
287 answer = answer->next;
290 /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
291 has a bad symbol table in biglitpow.o. */
292 return bfd_und_section_ptr;
295 /* Get the upper bound of a COFF symbol table. */
298 coff_get_symtab_upper_bound (abfd)
301 if (!bfd_coff_slurp_symbol_table (abfd))
304 return (bfd_get_symcount (abfd) + 1) * (sizeof (coff_symbol_type *));
308 /* Canonicalize a COFF symbol table. */
311 coff_get_symtab (abfd, alocation)
315 unsigned int counter;
316 coff_symbol_type *symbase;
317 coff_symbol_type **location = (coff_symbol_type **) alocation;
319 if (!bfd_coff_slurp_symbol_table (abfd))
322 symbase = obj_symbols (abfd);
323 counter = bfd_get_symcount (abfd);
324 while (counter-- > 0)
325 *location++ = symbase++;
329 return bfd_get_symcount (abfd);
332 /* Set lineno_count for the output sections of a COFF file. */
335 coff_count_linenumbers (abfd)
338 unsigned int limit = bfd_get_symcount (abfd);
346 /* This may be from the backend linker, in which case the
347 lineno_count in the sections is correct. */
348 for (s = abfd->sections; s != NULL; s = s->next)
349 total += s->lineno_count;
353 for (s = abfd->sections; s != NULL; s = s->next)
354 BFD_ASSERT (s->lineno_count == 0);
356 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
358 asymbol *q_maybe = *p;
360 if (bfd_asymbol_flavour (q_maybe) == bfd_target_coff_flavour)
362 coff_symbol_type *q = coffsymbol (q_maybe);
364 if (q->lineno != NULL)
366 /* This symbol has line numbers. Increment the owning
367 section's linenumber count. */
368 alent *l = q->lineno;
370 ++q->symbol.section->output_section->lineno_count;
373 while (l->line_number != 0)
376 ++q->symbol.section->output_section->lineno_count;
386 /* Takes a bfd and a symbol, returns a pointer to the coff specific
387 area of the symbol if there is one. */
391 coff_symbol_from (ignore_abfd, symbol)
395 if (bfd_asymbol_flavour (symbol) != bfd_target_coff_flavour)
396 return (coff_symbol_type *) NULL;
398 if (bfd_asymbol_bfd (symbol)->tdata.coff_obj_data == (coff_data_type *) NULL)
399 return (coff_symbol_type *) NULL;
401 return (coff_symbol_type *) symbol;
405 fixup_symbol_value (coff_symbol_ptr, syment)
406 coff_symbol_type *coff_symbol_ptr;
407 struct internal_syment *syment;
410 /* Normalize the symbol flags */
411 if (bfd_is_com_section (coff_symbol_ptr->symbol.section))
413 /* a common symbol is undefined with a value */
414 syment->n_scnum = N_UNDEF;
415 syment->n_value = coff_symbol_ptr->symbol.value;
417 else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING)
419 syment->n_value = coff_symbol_ptr->symbol.value;
421 else if (bfd_is_und_section (coff_symbol_ptr->symbol.section))
423 syment->n_scnum = N_UNDEF;
428 if (coff_symbol_ptr->symbol.section)
431 coff_symbol_ptr->symbol.section->output_section->target_index;
434 coff_symbol_ptr->symbol.value +
435 coff_symbol_ptr->symbol.section->output_offset +
436 coff_symbol_ptr->symbol.section->output_section->vma;
441 /* This can happen, but I don't know why yet (steve@cygnus.com) */
442 syment->n_scnum = N_ABS;
443 syment->n_value = coff_symbol_ptr->symbol.value;
448 /* Run through all the symbols in the symbol table and work out what
449 their indexes into the symbol table will be when output.
451 Coff requires that each C_FILE symbol points to the next one in the
452 chain, and that the last one points to the first external symbol. We
456 coff_renumber_symbols (bfd_ptr, first_undef)
460 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
461 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
462 unsigned int native_index = 0;
463 struct internal_syment *last_file = (struct internal_syment *) NULL;
464 unsigned int symbol_index;
466 /* COFF demands that undefined symbols come after all other symbols.
467 Since we don't need to impose this extra knowledge on all our
468 client programs, deal with that here. Sort the symbol table;
469 just move the undefined symbols to the end, leaving the rest
470 alone. The O'Reilly book says that defined global symbols come
471 at the end before the undefined symbols, so we do that here as
473 /* @@ Do we have some condition we could test for, so we don't always
474 have to do this? I don't think relocatability is quite right, but
475 I'm not certain. [raeburn:19920508.1711EST] */
480 newsyms = (asymbol **) bfd_alloc_by_size_t (bfd_ptr,
482 * (symbol_count + 1));
485 bfd_set_error (bfd_error_no_memory);
488 bfd_ptr->outsymbols = newsyms;
489 for (i = 0; i < symbol_count; i++)
490 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) != 0
491 || (!bfd_is_und_section (symbol_ptr_ptr[i]->section)
492 && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL | BSF_FUNCTION))
494 *newsyms++ = symbol_ptr_ptr[i];
496 for (i = 0; i < symbol_count; i++)
497 if (!bfd_is_und_section (symbol_ptr_ptr[i]->section)
498 && ((symbol_ptr_ptr[i]->flags & (BSF_GLOBAL
502 *newsyms++ = symbol_ptr_ptr[i];
504 *first_undef = newsyms - bfd_ptr->outsymbols;
506 for (i = 0; i < symbol_count; i++)
507 if ((symbol_ptr_ptr[i]->flags & BSF_NOT_AT_END) == 0
508 && bfd_is_und_section (symbol_ptr_ptr[i]->section))
509 *newsyms++ = symbol_ptr_ptr[i];
510 *newsyms = (asymbol *) NULL;
511 symbol_ptr_ptr = bfd_ptr->outsymbols;
514 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
516 coff_symbol_type *coff_symbol_ptr = coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
517 symbol_ptr_ptr[symbol_index]->udata.i = symbol_index;
518 if (coff_symbol_ptr && coff_symbol_ptr->native)
520 combined_entry_type *s = coff_symbol_ptr->native;
523 if (s->u.syment.n_sclass == C_FILE)
525 if (last_file != (struct internal_syment *) NULL)
526 last_file->n_value = native_index;
527 last_file = &(s->u.syment);
532 /* Modify the symbol values according to their section and
535 fixup_symbol_value (coff_symbol_ptr, &(s->u.syment));
537 for (i = 0; i < s->u.syment.n_numaux + 1; i++)
538 s[i].offset = native_index++;
545 obj_conv_table_size (bfd_ptr) = native_index;
550 /* Run thorough the symbol table again, and fix it so that all
551 pointers to entries are changed to the entries' index in the output
555 coff_mangle_symbols (bfd_ptr)
558 unsigned int symbol_count = bfd_get_symcount (bfd_ptr);
559 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
560 unsigned int symbol_index;
562 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
564 coff_symbol_type *coff_symbol_ptr =
565 coff_symbol_from (bfd_ptr, symbol_ptr_ptr[symbol_index]);
567 if (coff_symbol_ptr && coff_symbol_ptr->native)
570 combined_entry_type *s = coff_symbol_ptr->native;
574 /* FIXME: We should use a union here. */
575 s->u.syment.n_value =
576 ((combined_entry_type *) s->u.syment.n_value)->offset;
581 /* The value is the offset into the line number entries
582 for the symbol's section. On output, the symbol's
583 section should be N_DEBUG. */
584 s->u.syment.n_value =
585 (coff_symbol_ptr->symbol.section->output_section->line_filepos
586 + s->u.syment.n_value * bfd_coff_linesz (bfd_ptr));
587 coff_symbol_ptr->symbol.section =
588 coff_section_from_bfd_index (bfd_ptr, N_DEBUG);
589 BFD_ASSERT (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING);
591 for (i = 0; i < s->u.syment.n_numaux; i++)
593 combined_entry_type *a = s + i + 1;
596 a->u.auxent.x_sym.x_tagndx.l =
597 a->u.auxent.x_sym.x_tagndx.p->offset;
602 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
603 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
608 a->u.auxent.x_csect.x_scnlen.l =
609 a->u.auxent.x_csect.x_scnlen.p->offset;
618 coff_fix_symbol_name (abfd, symbol, native, string_size_p,
619 debug_string_section_p, debug_string_size_p)
622 combined_entry_type *native;
623 bfd_size_type *string_size_p;
624 asection **debug_string_section_p;
625 bfd_size_type *debug_string_size_p;
627 unsigned int name_length;
628 union internal_auxent *auxent;
629 char *name = (char *) (symbol->name);
631 if (name == (char *) NULL)
633 /* coff symbols always have names, so we'll make one up */
634 symbol->name = "strange";
635 name = (char *) symbol->name;
637 name_length = strlen (name);
639 if (native->u.syment.n_sclass == C_FILE
640 && native->u.syment.n_numaux > 0)
642 strncpy (native->u.syment._n._n_name, ".file", SYMNMLEN);
643 auxent = &(native + 1)->u.auxent;
645 if (bfd_coff_long_filenames (abfd))
647 if (name_length <= FILNMLEN)
649 strncpy (auxent->x_file.x_fname, name, FILNMLEN);
653 auxent->x_file.x_n.x_offset = *string_size_p + STRING_SIZE_SIZE;
654 auxent->x_file.x_n.x_zeroes = 0;
655 *string_size_p += name_length + 1;
660 strncpy (auxent->x_file.x_fname, name, FILNMLEN);
661 if (name_length > FILNMLEN)
663 name[FILNMLEN] = '\0';
669 if (name_length <= SYMNMLEN)
671 /* This name will fit into the symbol neatly */
672 strncpy (native->u.syment._n._n_name, symbol->name, SYMNMLEN);
674 else if (!bfd_coff_symname_in_debug (abfd, &native->u.syment))
676 native->u.syment._n._n_n._n_offset = (*string_size_p
678 native->u.syment._n._n_n._n_zeroes = 0;
679 *string_size_p += name_length + 1;
686 /* This name should be written into the .debug section. For
687 some reason each name is preceded by a two byte length
688 and also followed by a null byte. FIXME: We assume that
689 the .debug section has already been created, and that it
691 if (*debug_string_section_p == (asection *) NULL)
692 *debug_string_section_p = bfd_get_section_by_name (abfd, ".debug");
693 filepos = bfd_tell (abfd);
694 bfd_put_16 (abfd, name_length + 1, buf);
695 if (!bfd_set_section_contents (abfd,
696 *debug_string_section_p,
698 (file_ptr) *debug_string_size_p,
700 || !bfd_set_section_contents (abfd,
701 *debug_string_section_p,
703 ((file_ptr) *debug_string_size_p
705 (bfd_size_type) name_length + 1))
707 if (bfd_seek (abfd, filepos, SEEK_SET) != 0)
709 native->u.syment._n._n_n._n_offset = *debug_string_size_p + 2;
710 native->u.syment._n._n_n._n_zeroes = 0;
711 *debug_string_size_p += name_length + 3;
716 /* We need to keep track of the symbol index so that when we write out
717 the relocs we can get the index for a symbol. This method is a
720 #define set_index(symbol, idx) ((symbol)->udata.i = (idx))
722 /* Write a symbol out to a COFF file. */
725 coff_write_symbol (abfd, symbol, native, written, string_size_p,
726 debug_string_section_p, debug_string_size_p)
729 combined_entry_type *native;
730 unsigned int *written;
731 bfd_size_type *string_size_p;
732 asection **debug_string_section_p;
733 bfd_size_type *debug_string_size_p;
735 unsigned int numaux = native->u.syment.n_numaux;
736 int type = native->u.syment.n_type;
737 int class = native->u.syment.n_sclass;
739 bfd_size_type symesz;
741 if (native->u.syment.n_sclass == C_FILE)
742 symbol->flags |= BSF_DEBUGGING;
744 if (symbol->flags & BSF_DEBUGGING
745 && bfd_is_abs_section (symbol->section))
747 native->u.syment.n_scnum = N_DEBUG;
749 else if (bfd_is_abs_section (symbol->section))
751 native->u.syment.n_scnum = N_ABS;
753 else if (bfd_is_und_section (symbol->section))
755 native->u.syment.n_scnum = N_UNDEF;
759 native->u.syment.n_scnum =
760 symbol->section->output_section->target_index;
763 coff_fix_symbol_name (abfd, symbol, native, string_size_p,
764 debug_string_section_p, debug_string_size_p);
766 symesz = bfd_coff_symesz (abfd);
767 buf = bfd_alloc (abfd, symesz);
770 bfd_set_error (bfd_error_no_memory);
773 bfd_coff_swap_sym_out (abfd, &native->u.syment, buf);
774 if (bfd_write (buf, 1, symesz, abfd) != symesz)
776 bfd_release (abfd, buf);
778 if (native->u.syment.n_numaux > 0)
780 bfd_size_type auxesz;
783 auxesz = bfd_coff_auxesz (abfd);
784 buf = bfd_alloc (abfd, auxesz);
787 bfd_set_error (bfd_error_no_memory);
790 for (j = 0; j < native->u.syment.n_numaux; j++)
792 bfd_coff_swap_aux_out (abfd,
793 &((native + j + 1)->u.auxent),
797 native->u.syment.n_numaux,
799 if (bfd_write (buf, 1, auxesz, abfd) != auxesz)
802 bfd_release (abfd, buf);
805 /* Store the index for use when we write out the relocs. */
806 set_index (symbol, *written);
808 *written += numaux + 1;
812 /* Write out a symbol to a COFF file that does not come from a COFF
813 file originally. This symbol may have been created by the linker,
814 or we may be linking a non COFF file to a COFF file. */
817 coff_write_alien_symbol (abfd, symbol, written, string_size_p,
818 debug_string_section_p, debug_string_size_p)
821 unsigned int *written;
822 bfd_size_type *string_size_p;
823 asection **debug_string_section_p;
824 bfd_size_type *debug_string_size_p;
826 combined_entry_type *native;
827 combined_entry_type dummy;
830 native->u.syment.n_type = T_NULL;
831 native->u.syment.n_flags = 0;
832 if (bfd_is_und_section (symbol->section))
834 native->u.syment.n_scnum = N_UNDEF;
835 native->u.syment.n_value = symbol->value;
837 else if (bfd_is_com_section (symbol->section))
839 native->u.syment.n_scnum = N_UNDEF;
840 native->u.syment.n_value = symbol->value;
842 else if (symbol->flags & BSF_DEBUGGING)
844 /* There isn't much point to writing out a debugging symbol
845 unless we are prepared to convert it into COFF debugging
846 format. So, we just ignore them. We must clobber the symbol
847 name to keep it from being put in the string table. */
853 native->u.syment.n_scnum =
854 symbol->section->output_section->target_index;
855 native->u.syment.n_value = (symbol->value
856 + symbol->section->output_section->vma
857 + symbol->section->output_offset);
859 /* Copy the any flags from the the file header into the symbol.
862 coff_symbol_type *c = coff_symbol_from (abfd, symbol);
863 if (c != (coff_symbol_type *) NULL)
864 native->u.syment.n_flags = bfd_asymbol_bfd (&c->symbol)->flags;
868 native->u.syment.n_type = 0;
869 if (symbol->flags & BSF_LOCAL)
870 native->u.syment.n_sclass = C_STAT;
872 native->u.syment.n_sclass = C_EXT;
873 native->u.syment.n_numaux = 0;
875 return coff_write_symbol (abfd, symbol, native, written, string_size_p,
876 debug_string_section_p, debug_string_size_p);
879 /* Write a native symbol to a COFF file. */
882 coff_write_native_symbol (abfd, symbol, written, string_size_p,
883 debug_string_section_p, debug_string_size_p)
885 coff_symbol_type *symbol;
886 unsigned int *written;
887 bfd_size_type *string_size_p;
888 asection **debug_string_section_p;
889 bfd_size_type *debug_string_size_p;
891 combined_entry_type *native = symbol->native;
892 alent *lineno = symbol->lineno;
894 /* If this symbol has an associated line number, we must store the
895 symbol index in the line number field. We also tag the auxent to
896 point to the right place in the lineno table. */
897 if (lineno && !symbol->done_lineno)
899 unsigned int count = 0;
900 lineno[count].u.offset = *written;
901 if (native->u.syment.n_numaux)
903 union internal_auxent *a = &((native + 1)->u.auxent);
905 a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
906 symbol->symbol.section->output_section->moving_line_filepos;
909 /* Count and relocate all other linenumbers. */
911 while (lineno[count].line_number != 0)
915 I've been told this, but still need proof:
916 > The second bug is also in `bfd/coffcode.h'. This bug
917 > causes the linker to screw up the pc-relocations for
918 > all the line numbers in COFF code. This bug isn't only
919 > specific to A29K implementations, but affects all
920 > systems using COFF format binaries. Note that in COFF
921 > object files, the line number core offsets output by
922 > the assembler are relative to the start of each
923 > procedure, not to the start of the .text section. This
924 > patch relocates the line numbers relative to the
925 > `native->u.syment.n_value' instead of the section
927 > modular!olson@cs.arizona.edu (Jon Olson)
929 lineno[count].u.offset += native->u.syment.n_value;
931 lineno[count].u.offset +=
932 (symbol->symbol.section->output_section->vma
933 + symbol->symbol.section->output_offset);
937 symbol->done_lineno = true;
939 symbol->symbol.section->output_section->moving_line_filepos +=
940 count * bfd_coff_linesz (abfd);
943 return coff_write_symbol (abfd, &(symbol->symbol), native, written,
944 string_size_p, debug_string_section_p,
945 debug_string_size_p);
948 /* Write out the COFF symbols. */
951 coff_write_symbols (abfd)
954 bfd_size_type string_size;
955 asection *debug_string_section;
956 bfd_size_type debug_string_size;
958 unsigned int limit = bfd_get_symcount (abfd);
959 unsigned int written = 0;
963 debug_string_section = NULL;
964 debug_string_size = 0;
966 /* Seek to the right place */
967 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0)
970 /* Output all the symbols we have */
973 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
975 asymbol *symbol = *p;
976 coff_symbol_type *c_symbol = coff_symbol_from (abfd, symbol);
978 if (c_symbol == (coff_symbol_type *) NULL
979 || c_symbol->native == (combined_entry_type *) NULL)
981 if (!coff_write_alien_symbol (abfd, symbol, &written, &string_size,
982 &debug_string_section,
988 if (!coff_write_native_symbol (abfd, c_symbol, &written,
989 &string_size, &debug_string_section,
995 obj_raw_syment_count (abfd) = written;
997 /* Now write out strings */
999 if (string_size != 0)
1001 unsigned int size = string_size + STRING_SIZE_SIZE;
1002 bfd_byte buffer[STRING_SIZE_SIZE];
1004 #if STRING_SIZE_SIZE == 4
1005 bfd_h_put_32 (abfd, size, buffer);
1007 #error Change bfd_h_put_32
1009 if (bfd_write ((PTR) buffer, 1, sizeof (buffer), abfd) != sizeof (buffer))
1011 for (p = abfd->outsymbols, i = 0;
1016 size_t name_length = strlen (q->name);
1017 coff_symbol_type *c_symbol = coff_symbol_from (abfd, q);
1020 /* Figure out whether the symbol name should go in the string
1021 table. Symbol names that are short enough are stored
1022 directly in the syment structure. File names permit a
1023 different, longer, length in the syment structure. On
1024 XCOFF, some symbol names are stored in the .debug section
1025 rather than in the string table. */
1027 if (c_symbol == NULL
1028 || c_symbol->native == NULL)
1030 /* This is not a COFF symbol, so it certainly is not a
1031 file name, nor does it go in the .debug section. */
1034 else if (bfd_coff_symname_in_debug (abfd,
1035 &c_symbol->native->u.syment))
1037 /* This symbol name is in the XCOFF .debug section.
1038 Don't write it into the string table. */
1039 maxlen = name_length;
1041 else if (c_symbol->native->u.syment.n_sclass == C_FILE
1042 && c_symbol->native->u.syment.n_numaux > 0)
1047 if (name_length > maxlen)
1049 if (bfd_write ((PTR) (q->name), 1, name_length + 1, abfd)
1057 /* We would normally not write anything here, but we'll write
1058 out 4 so that any stupid coff reader which tries to read the
1059 string table even when there isn't one won't croak. */
1060 unsigned int size = STRING_SIZE_SIZE;
1061 bfd_byte buffer[STRING_SIZE_SIZE];
1063 #if STRING_SIZE_SIZE == 4
1064 bfd_h_put_32 (abfd, size, buffer);
1066 #error Change bfd_h_put_32
1068 if (bfd_write ((PTR) buffer, 1, STRING_SIZE_SIZE, abfd)
1069 != STRING_SIZE_SIZE)
1073 /* Make sure the .debug section was created to be the correct size.
1074 We should create it ourselves on the fly, but we don't because
1075 BFD won't let us write to any section until we know how large all
1076 the sections are. We could still do it by making another pass
1077 over the symbols. FIXME. */
1078 BFD_ASSERT (debug_string_size == 0
1079 || (debug_string_section != (asection *) NULL
1080 && (BFD_ALIGN (debug_string_size,
1081 1 << debug_string_section->alignment_power)
1082 == bfd_section_size (abfd, debug_string_section))));
1088 coff_write_linenumbers (abfd)
1092 bfd_size_type linesz;
1095 linesz = bfd_coff_linesz (abfd);
1096 buff = bfd_alloc (abfd, linesz);
1099 bfd_set_error (bfd_error_no_memory);
1102 for (s = abfd->sections; s != (asection *) NULL; s = s->next)
1104 if (s->lineno_count)
1106 asymbol **q = abfd->outsymbols;
1107 if (bfd_seek (abfd, s->line_filepos, SEEK_SET) != 0)
1109 /* Find all the linenumbers in this section */
1113 if (p->section->output_section == s)
1116 BFD_SEND (bfd_asymbol_bfd (p), _get_lineno,
1117 (bfd_asymbol_bfd (p), p));
1120 /* Found a linenumber entry, output */
1121 struct internal_lineno out;
1122 memset ((PTR) & out, 0, sizeof (out));
1124 out.l_addr.l_symndx = l->u.offset;
1125 bfd_coff_swap_lineno_out (abfd, &out, buff);
1126 if (bfd_write (buff, 1, linesz, abfd) != linesz)
1129 while (l->line_number)
1131 out.l_lnno = l->line_number;
1132 out.l_addr.l_symndx = l->u.offset;
1133 bfd_coff_swap_lineno_out (abfd, &out, buff);
1134 if (bfd_write (buff, 1, linesz, abfd) != linesz)
1144 bfd_release (abfd, buff);
1150 coff_get_lineno (ignore_abfd, symbol)
1154 return coffsymbol (symbol)->lineno;
1158 coff_section_symbol (abfd, name)
1162 asection *sec = bfd_make_section_old_way (abfd, name);
1164 combined_entry_type *csym;
1167 csym = coff_symbol_from (abfd, sym)->native;
1168 /* Make sure back-end COFF stuff is there. */
1173 coff_symbol_type sym;
1174 /* @@FIXME This shouldn't use a fixed size!! */
1175 combined_entry_type e[10];
1178 f = (struct foo *) bfd_alloc_by_size_t (abfd, sizeof (*f));
1181 bfd_set_error (bfd_error_no_error);
1184 memset ((char *) f, 0, sizeof (*f));
1185 coff_symbol_from (abfd, sym)->native = csym = f->e;
1187 csym[0].u.syment.n_sclass = C_STAT;
1188 csym[0].u.syment.n_numaux = 1;
1189 /* SF_SET_STATICS (sym); @@ ??? */
1190 csym[1].u.auxent.x_scn.x_scnlen = sec->_raw_size;
1191 csym[1].u.auxent.x_scn.x_nreloc = sec->reloc_count;
1192 csym[1].u.auxent.x_scn.x_nlinno = sec->lineno_count;
1194 if (sec->output_section == NULL)
1196 sec->output_section = sec;
1197 sec->output_offset = 0;
1203 /* This function transforms the offsets into the symbol table into
1204 pointers to syments. */
1207 coff_pointerize_aux (abfd, table_base, symbol, indaux, auxent)
1209 combined_entry_type *table_base;
1210 combined_entry_type *symbol;
1211 unsigned int indaux;
1212 combined_entry_type *auxent;
1214 int type = symbol->u.syment.n_type;
1215 int class = symbol->u.syment.n_sclass;
1217 if (coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1219 if ((*coff_backend_info (abfd)->_bfd_coff_pointerize_aux_hook)
1220 (abfd, table_base, symbol, indaux, auxent))
1224 /* Don't bother if this is a file or a section */
1225 if (class == C_STAT && type == T_NULL)
1227 if (class == C_FILE)
1230 /* Otherwise patch up */
1231 #define N_TMASK coff_data (abfd)->local_n_tmask
1232 #define N_BTSHFT coff_data (abfd)->local_n_btshft
1233 if ((ISFCN (type) || ISTAG (class) || class == C_BLOCK)
1234 && auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l > 0)
1236 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p =
1237 table_base + auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
1238 auxent->fix_end = 1;
1240 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1241 generate one, so we must be careful to ignore it. */
1242 if (auxent->u.auxent.x_sym.x_tagndx.l > 0)
1244 auxent->u.auxent.x_sym.x_tagndx.p =
1245 table_base + auxent->u.auxent.x_sym.x_tagndx.l;
1246 auxent->fix_tag = 1;
1250 /* Allocate space for the ".debug" section, and read it.
1251 We did not read the debug section until now, because
1252 we didn't want to go to the trouble until someone needed it. */
1255 build_debug_section (abfd)
1258 char *debug_section;
1261 asection *sect = bfd_get_section_by_name (abfd, ".debug");
1265 bfd_set_error (bfd_error_no_debug_section);
1269 debug_section = (PTR) bfd_alloc (abfd,
1270 bfd_get_section_size_before_reloc (sect));
1271 if (debug_section == NULL)
1273 bfd_set_error (bfd_error_no_memory);
1277 /* Seek to the beginning of the `.debug' section and read it.
1278 Save the current position first; it is needed by our caller.
1279 Then read debug section and reset the file pointer. */
1281 position = bfd_tell (abfd);
1282 if (bfd_seek (abfd, sect->filepos, SEEK_SET) != 0
1283 || (bfd_read (debug_section,
1284 bfd_get_section_size_before_reloc (sect), 1, abfd)
1285 != bfd_get_section_size_before_reloc (sect))
1286 || bfd_seek (abfd, position, SEEK_SET) != 0)
1288 return debug_section;
1292 /* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1293 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1294 be \0-terminated. */
1296 copy_name (abfd, name, maxlen)
1304 for (len = 0; len < maxlen; ++len)
1306 if (name[len] == '\0')
1312 if ((newname = (PTR) bfd_alloc (abfd, len + 1)) == NULL)
1314 bfd_set_error (bfd_error_no_memory);
1317 strncpy (newname, name, len);
1318 newname[len] = '\0';
1322 /* Read in the external symbols. */
1325 _bfd_coff_get_external_symbols (abfd)
1328 bfd_size_type symesz;
1332 if (obj_coff_external_syms (abfd) != NULL)
1335 symesz = bfd_coff_symesz (abfd);
1337 size = obj_raw_syment_count (abfd) * symesz;
1339 syms = malloc (size);
1340 if (syms == NULL && size != 0)
1342 bfd_set_error (bfd_error_no_memory);
1346 if (bfd_seek (abfd, obj_sym_filepos (abfd), SEEK_SET) != 0
1347 || bfd_read (syms, size, 1, abfd) != size)
1354 obj_coff_external_syms (abfd) = syms;
1359 /* Read in the external strings. The strings are not loaded until
1360 they are needed. This is because we have no simple way of
1361 detecting a missing string table in an archive. */
1364 _bfd_coff_read_string_table (abfd)
1367 char extstrsize[STRING_SIZE_SIZE];
1371 if (obj_coff_strings (abfd) != NULL)
1372 return obj_coff_strings (abfd);
1375 (obj_sym_filepos (abfd)
1376 + obj_raw_syment_count (abfd) * bfd_coff_symesz (abfd)),
1380 if (bfd_read (extstrsize, sizeof extstrsize, 1, abfd) != sizeof extstrsize)
1382 if (bfd_get_error () != bfd_error_file_truncated)
1385 /* There is no string table. */
1386 strsize = STRING_SIZE_SIZE;
1390 #if STRING_SIZE_SIZE == 4
1391 strsize = bfd_h_get_32 (abfd, (bfd_byte *) extstrsize);
1393 #error Change bfd_h_get_32
1397 strings = malloc (strsize);
1398 if (strings == NULL)
1400 bfd_set_error (bfd_error_no_memory);
1404 if (bfd_read (strings + STRING_SIZE_SIZE,
1405 strsize - STRING_SIZE_SIZE, 1, abfd)
1406 != strsize - STRING_SIZE_SIZE)
1412 obj_coff_strings (abfd) = strings;
1417 /* Free up the external symbols and strings read from a COFF file. */
1420 _bfd_coff_free_symbols (abfd)
1423 if (obj_coff_external_syms (abfd) != NULL
1424 && ! obj_coff_keep_syms (abfd))
1426 free (obj_coff_external_syms (abfd));
1427 obj_coff_external_syms (abfd) = NULL;
1429 if (obj_coff_strings (abfd) != NULL
1430 && ! obj_coff_keep_strings (abfd))
1432 free (obj_coff_strings (abfd));
1433 obj_coff_strings (abfd) = NULL;
1438 /* Read a symbol table into freshly bfd_allocated memory, swap it, and
1439 knit the symbol names into a normalized form. By normalized here I
1440 mean that all symbols have an n_offset pointer that points to a null-
1441 terminated string. */
1443 combined_entry_type *
1444 coff_get_normalized_symtab (abfd)
1447 combined_entry_type *internal;
1448 combined_entry_type *internal_ptr;
1449 combined_entry_type *symbol_ptr;
1450 combined_entry_type *internal_end;
1451 bfd_size_type symesz;
1454 const char *string_table = NULL;
1455 char *debug_section = NULL;
1458 if (obj_raw_syments (abfd) != NULL)
1459 return obj_raw_syments (abfd);
1461 size = obj_raw_syment_count (abfd) * sizeof (combined_entry_type);
1462 internal = (combined_entry_type *) bfd_alloc (abfd, size);
1463 if (internal == NULL && size != 0)
1465 bfd_set_error (bfd_error_no_memory);
1468 internal_end = internal + obj_raw_syment_count (abfd);
1470 if (! _bfd_coff_get_external_symbols (abfd))
1473 raw_src = (char *) obj_coff_external_syms (abfd);
1475 /* mark the end of the symbols */
1476 symesz = bfd_coff_symesz (abfd);
1477 raw_end = (char *) raw_src + obj_raw_syment_count (abfd) * symesz;
1479 /* FIXME SOMEDAY. A string table size of zero is very weird, but
1480 probably possible. If one shows up, it will probably kill us. */
1482 /* Swap all the raw entries */
1483 for (internal_ptr = internal;
1485 raw_src += symesz, internal_ptr++)
1489 bfd_coff_swap_sym_in (abfd, (PTR) raw_src,
1490 (PTR) & internal_ptr->u.syment);
1491 internal_ptr->fix_value = 0;
1492 internal_ptr->fix_tag = 0;
1493 internal_ptr->fix_end = 0;
1494 internal_ptr->fix_scnlen = 0;
1495 symbol_ptr = internal_ptr;
1498 i < symbol_ptr->u.syment.n_numaux;
1504 internal_ptr->fix_value = 0;
1505 internal_ptr->fix_tag = 0;
1506 internal_ptr->fix_end = 0;
1507 internal_ptr->fix_scnlen = 0;
1508 bfd_coff_swap_aux_in (abfd, (PTR) raw_src,
1509 symbol_ptr->u.syment.n_type,
1510 symbol_ptr->u.syment.n_sclass,
1511 i, symbol_ptr->u.syment.n_numaux,
1512 &(internal_ptr->u.auxent));
1513 coff_pointerize_aux (abfd, internal, symbol_ptr, i,
1518 /* Free the raw symbols, but not the strings (if we have them). */
1519 obj_coff_keep_strings (abfd) = true;
1520 if (! _bfd_coff_free_symbols (abfd))
1523 for (internal_ptr = internal; internal_ptr < internal_end;
1526 if (internal_ptr->u.syment.n_sclass == C_FILE
1527 && internal_ptr->u.syment.n_numaux > 0)
1529 /* make a file symbol point to the name in the auxent, since
1530 the text ".file" is redundant */
1531 if ((internal_ptr + 1)->u.auxent.x_file.x_n.x_zeroes == 0)
1533 /* the filename is a long one, point into the string table */
1534 if (string_table == NULL)
1536 string_table = _bfd_coff_read_string_table (abfd);
1537 if (string_table == NULL)
1541 internal_ptr->u.syment._n._n_n._n_offset =
1544 + (internal_ptr + 1)->u.auxent.x_file.x_n.x_offset));
1548 /* ordinary short filename, put into memory anyway */
1549 internal_ptr->u.syment._n._n_n._n_offset = (long)
1550 copy_name (abfd, (internal_ptr + 1)->u.auxent.x_file.x_fname,
1556 if (internal_ptr->u.syment._n._n_n._n_zeroes != 0)
1558 /* This is a "short" name. Make it long. */
1559 unsigned long i = 0;
1560 char *newstring = NULL;
1562 /* find the length of this string without walking into memory
1564 for (i = 0; i < 8; ++i)
1566 if (internal_ptr->u.syment._n._n_name[i] == '\0')
1569 } /* if end of string */
1570 } /* possible lengths of this string. */
1572 if ((newstring = (PTR) bfd_alloc (abfd, ++i)) == NULL)
1574 bfd_set_error (bfd_error_no_memory);
1577 memset (newstring, 0, i);
1578 strncpy (newstring, internal_ptr->u.syment._n._n_name, i - 1);
1579 internal_ptr->u.syment._n._n_n._n_offset = (long int) newstring;
1580 internal_ptr->u.syment._n._n_n._n_zeroes = 0;
1582 else if (internal_ptr->u.syment._n._n_n._n_offset == 0)
1583 internal_ptr->u.syment._n._n_n._n_offset = (long int) "";
1584 else if (!bfd_coff_symname_in_debug (abfd, &internal_ptr->u.syment))
1586 /* Long name already. Point symbol at the string in the
1588 if (string_table == NULL)
1590 string_table = _bfd_coff_read_string_table (abfd);
1591 if (string_table == NULL)
1594 internal_ptr->u.syment._n._n_n._n_offset =
1597 + internal_ptr->u.syment._n._n_n._n_offset));
1601 /* Long name in debug section. Very similar. */
1602 if (debug_section == NULL)
1603 debug_section = build_debug_section (abfd);
1604 internal_ptr->u.syment._n._n_n._n_offset = (long int)
1605 (debug_section + internal_ptr->u.syment._n._n_n._n_offset);
1608 internal_ptr += internal_ptr->u.syment.n_numaux;
1611 obj_raw_syments (abfd) = internal;
1612 BFD_ASSERT (obj_raw_syment_count (abfd)
1613 == (unsigned int) (internal_ptr - internal));
1616 } /* coff_get_normalized_symtab() */
1619 coff_get_reloc_upper_bound (abfd, asect)
1623 if (bfd_get_format (abfd) != bfd_object)
1625 bfd_set_error (bfd_error_invalid_operation);
1628 return (asect->reloc_count + 1) * sizeof (arelent *);
1632 coff_make_empty_symbol (abfd)
1635 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc (abfd, sizeof (coff_symbol_type));
1638 bfd_set_error (bfd_error_no_memory);
1641 memset (new, 0, sizeof *new);
1642 new->symbol.section = 0;
1644 new->lineno = (alent *) NULL;
1645 new->done_lineno = false;
1646 new->symbol.the_bfd = abfd;
1647 return &new->symbol;
1650 /* Make a debugging symbol. */
1653 coff_bfd_make_debug_symbol (abfd, ptr, sz)
1658 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc (abfd, sizeof (coff_symbol_type));
1661 bfd_set_error (bfd_error_no_memory);
1664 /* @@ This shouldn't be using a constant multiplier. */
1665 new->native = (combined_entry_type *) bfd_zalloc (abfd, sizeof (combined_entry_type) * 10);
1668 bfd_set_error (bfd_error_no_memory);
1671 new->symbol.section = bfd_abs_section_ptr;
1672 new->symbol.flags = BSF_DEBUGGING;
1673 new->lineno = (alent *) NULL;
1674 new->done_lineno = false;
1675 new->symbol.the_bfd = abfd;
1676 return &new->symbol;
1681 coff_get_symbol_info (abfd, symbol, ret)
1686 bfd_symbol_info (symbol, ret);
1689 /* Print out information about COFF symbol. */
1692 coff_print_symbol (abfd, filep, symbol, how)
1696 bfd_print_symbol_type how;
1698 FILE *file = (FILE *) filep;
1702 case bfd_print_symbol_name:
1703 fprintf (file, "%s", symbol->name);
1706 case bfd_print_symbol_more:
1707 fprintf (file, "coff %s %s",
1708 coffsymbol (symbol)->native ? "n" : "g",
1709 coffsymbol (symbol)->lineno ? "l" : " ");
1712 case bfd_print_symbol_all:
1713 if (coffsymbol (symbol)->native)
1717 combined_entry_type *combined = coffsymbol (symbol)->native;
1718 combined_entry_type *root = obj_raw_syments (abfd);
1719 struct lineno_cache_entry *l = coffsymbol (symbol)->lineno;
1721 fprintf (file, "[%3ld]", (long) (combined - root));
1723 if (! combined->fix_value)
1724 val = (unsigned long) combined->u.syment.n_value;
1726 val = ((unsigned long)
1727 ((combined_entry_type *) combined->u.syment.n_value
1731 "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x%08lx %s",
1732 combined->u.syment.n_scnum,
1733 combined->u.syment.n_flags,
1734 combined->u.syment.n_type,
1735 combined->u.syment.n_sclass,
1736 combined->u.syment.n_numaux,
1740 for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
1742 combined_entry_type *auxp = combined + aux + 1;
1746 tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
1748 tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
1750 fprintf (file, "\n");
1752 if (bfd_coff_print_aux (abfd, file, root, combined, auxp, aux))
1755 switch (combined->u.syment.n_sclass)
1758 fprintf (file, "File ");
1762 if (combined->u.syment.n_type == T_NULL)
1763 /* probably a section symbol? */
1765 fprintf (file, "AUX scnlen 0x%lx nreloc %d nlnno %d",
1766 (long) auxp->u.auxent.x_scn.x_scnlen,
1767 auxp->u.auxent.x_scn.x_nreloc,
1768 auxp->u.auxent.x_scn.x_nlinno);
1771 /* else fall through */
1774 fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
1775 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
1776 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
1779 fprintf (file, " endndx %ld",
1781 (auxp->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p
1789 fprintf (file, "\n%s :", l->u.sym->name);
1791 while (l->line_number)
1793 fprintf (file, "\n%4d : 0x%lx",
1796 (l->u.offset + symbol->section->vma)));
1803 bfd_print_symbol_vandf ((PTR) file, symbol);
1804 fprintf (file, " %-5s %s %s %s",
1805 symbol->section->name,
1806 coffsymbol (symbol)->native ? "n" : "g",
1807 coffsymbol (symbol)->lineno ? "l" : " ",
1813 /* Provided a BFD, a section and an offset into the section, calculate
1814 and return the name of the source file and the line nearest to the
1819 coff_find_nearest_line (abfd, section, ignore_symbols, offset, filename_ptr,
1820 functionname_ptr, line_ptr)
1823 asymbol **ignore_symbols;
1825 CONST char **filename_ptr;
1826 CONST char **functionname_ptr;
1827 unsigned int *line_ptr;
1830 unsigned int line_base;
1831 coff_data_type *cof = coff_data (abfd);
1832 /* Run through the raw syments if available */
1833 combined_entry_type *p;
1834 combined_entry_type *pend;
1836 struct coff_section_tdata *sec_data;
1839 *functionname_ptr = 0;
1842 /* Don't try and find line numbers in a non coff file */
1843 if (abfd->xvec->flavour != bfd_target_coff_flavour)
1849 /* Find the first C_FILE symbol. */
1850 p = cof->raw_syments;
1851 pend = p + cof->raw_syment_count;
1854 if (p->u.syment.n_sclass == C_FILE)
1856 p += 1 + p->u.syment.n_numaux;
1863 /* Look through the C_FILE symbols to find the best one. */
1864 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
1865 maxdiff = (bfd_vma) 0 - (bfd_vma) 1;
1868 combined_entry_type *p2;
1870 for (p2 = p + 1 + p->u.syment.n_numaux;
1872 p2 += 1 + p2->u.syment.n_numaux)
1874 if (p2->u.syment.n_scnum > 0
1876 == coff_section_from_bfd_index (abfd,
1877 p2->u.syment.n_scnum)))
1879 if (p2->u.syment.n_sclass == C_FILE)
1887 && offset >= (bfd_vma) p2->u.syment.n_value
1888 && offset - (bfd_vma) p2->u.syment.n_value < maxdiff)
1890 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
1891 maxdiff = offset - p2->u.syment.n_value;
1894 /* Avoid endless loops on erroneous files by ensuring that
1895 we always move forward in the file. */
1896 if (p - cof->raw_syments >= p->u.syment.n_value)
1899 p = cof->raw_syments + p->u.syment.n_value;
1900 if (p > pend || p->u.syment.n_sclass != C_FILE)
1905 /* Now wander though the raw linenumbers of the section */
1906 /* If we have been called on this section before, and the offset we
1907 want is further down then we can prime the lookup loop. */
1908 sec_data = coff_section_data (abfd, section);
1909 if (sec_data != NULL
1911 && offset >= sec_data->offset)
1914 *functionname_ptr = sec_data->function;
1915 line_base = sec_data->line_base;
1923 l = §ion->lineno[i];
1925 for (; i < section->lineno_count; i++)
1927 if (l->line_number == 0)
1929 /* Get the symbol this line number points at */
1930 coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
1931 if (coff->symbol.value > offset)
1933 *functionname_ptr = coff->symbol.name;
1936 combined_entry_type *s = coff->native;
1937 s = s + 1 + s->u.syment.n_numaux;
1939 /* In XCOFF a debugging symbol can follow the function
1941 if (s->u.syment.n_scnum == N_DEBUG)
1942 s = s + 1 + s->u.syment.n_numaux;
1945 S should now point to the .bf of the function
1947 if (s->u.syment.n_numaux)
1950 The linenumber is stored in the auxent
1952 union internal_auxent *a = &((s + 1)->u.auxent);
1953 line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
1954 *line_ptr = line_base;
1960 if (l->u.offset + bfd_get_section_vma (abfd, section) > offset)
1962 *line_ptr = l->line_number + line_base - 1;
1967 /* Cache the results for the next call. */
1968 if (sec_data == NULL)
1970 section->used_by_bfd =
1971 ((PTR) bfd_zalloc (abfd,
1972 sizeof (struct coff_section_tdata)));
1973 sec_data = section->used_by_bfd;
1975 if (sec_data != NULL)
1977 sec_data->offset = offset;
1979 sec_data->function = *functionname_ptr;
1980 sec_data->line_base = line_base;
1987 coff_sizeof_headers (abfd, reloc)
1995 size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
1999 size = bfd_coff_filhsz (abfd);
2002 size += abfd->section_count * bfd_coff_scnhsz (abfd);