1 /* Support for the generic parts of COFF, for BFD.
2 Copyright 1990, 1991, 1992, 1993 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 asection bfd_debug_section = { "*DEBUG*" };
46 /* Take a section header read from a coff file (in HOST byte order),
47 and make a BFD "section" out of it. This is used by ECOFF. */
49 DEFUN(make_a_section_from_file,(abfd, hdr, target_index),
51 struct internal_scnhdr *hdr AND
52 unsigned int target_index)
54 asection *return_section;
57 /* Assorted wastage to null-terminate the name, thanks AT&T! */
58 name = bfd_alloc(abfd, sizeof (hdr->s_name)+1);
60 bfd_error = no_memory;
63 strncpy(name, (char *) &hdr->s_name[0], sizeof (hdr->s_name));
64 name[sizeof (hdr->s_name)] = 0;
66 return_section = bfd_make_section(abfd, name);
67 if (return_section == NULL)
68 return_section = bfd_coff_make_section_hook (abfd, name);
70 /* Handle several sections of the same name. For example, if an executable
71 has two .bss sections, GDB better be able to find both of them
73 if (return_section == NULL)
74 return_section = bfd_make_section_anyway (abfd, name);
76 if (return_section == NULL)
79 /* s_paddr is presumed to be = to s_vaddr */
81 return_section->vma = hdr->s_vaddr;
82 return_section->_raw_size = hdr->s_size;
83 return_section->filepos = hdr->s_scnptr;
84 return_section->rel_filepos = hdr->s_relptr;
85 return_section->reloc_count = hdr->s_nreloc;
87 bfd_coff_set_alignment_hook (abfd, return_section, hdr);
89 return_section->line_filepos = hdr->s_lnnoptr;
91 return_section->lineno_count = hdr->s_nlnno;
92 return_section->userdata = NULL;
93 return_section->next = (asection *) NULL;
94 return_section->flags = bfd_coff_styp_to_sec_flags_hook (abfd, hdr);
96 return_section->target_index = target_index;
98 /* At least on i386-coff, the line number count for a shared library
99 section must be ignored. */
100 if ((return_section->flags & SEC_SHARED_LIBRARY) != 0)
101 return_section->lineno_count = 0;
103 if (hdr->s_nreloc != 0)
104 return_section->flags |= SEC_RELOC;
105 /* FIXME: should this check 'hdr->s_size > 0' */
106 if (hdr->s_scnptr != 0)
107 return_section->flags |= SEC_HAS_CONTENTS;
111 /* Read in a COFF object and make it into a BFD. This is used by
116 DEFUN(coff_real_object_p,(abfd, nscns, internal_f, internal_a),
119 struct internal_filehdr *internal_f AND
120 struct internal_aouthdr *internal_a)
123 size_t readsize; /* length of file_info */
125 char *external_sections;
127 /* Build a play area */
128 tdata = bfd_coff_mkobject_hook (abfd, (PTR) internal_f, (PTR) internal_a);
132 scnhsz = bfd_coff_scnhsz (abfd);
133 readsize = nscns * scnhsz;
134 external_sections = (char *)bfd_alloc(abfd, readsize);
136 if (bfd_read((PTR)external_sections, 1, readsize, abfd) != readsize) {
140 /* Now copy data as required; construct all asections etc */
143 for (i = 0; i < nscns; i++) {
144 struct internal_scnhdr tmp;
145 bfd_coff_swap_scnhdr_in(abfd, (PTR) (external_sections + i * scnhsz),
147 make_a_section_from_file(abfd,&tmp, i+1);
151 /* make_abs_section(abfd);*/
153 if (bfd_coff_set_arch_mach_hook (abfd, (PTR) internal_f) == false)
156 if (!(internal_f->f_flags & F_RELFLG))
157 abfd->flags |= HAS_RELOC;
158 if ((internal_f->f_flags & F_EXEC))
159 abfd->flags |= EXEC_P;
160 if (!(internal_f->f_flags & F_LNNO))
161 abfd->flags |= HAS_LINENO;
162 if (!(internal_f->f_flags & F_LSYMS))
163 abfd->flags |= HAS_LOCALS;
166 bfd_get_symcount(abfd) = internal_f->f_nsyms;
167 if (internal_f->f_nsyms)
168 abfd->flags |= HAS_SYMS;
170 if (internal_a != (struct internal_aouthdr *) NULL)
171 bfd_get_start_address (abfd) = internal_a->entry;
173 bfd_get_start_address (abfd) = 0;
177 bfd_release(abfd, tdata);
178 return (bfd_target *)NULL;
181 /* Turn a COFF file into a BFD, but fail with wrong_format if it is
182 not a COFF file. This is also used by ECOFF. */
185 DEFUN(coff_object_p,(abfd),
192 struct internal_filehdr internal_f;
193 struct internal_aouthdr internal_a;
195 bfd_error = system_call_error;
197 /* figure out how much to read */
198 filhsz = bfd_coff_filhsz (abfd);
199 aoutsz = bfd_coff_aoutsz (abfd);
201 filehdr = bfd_alloc (abfd, filhsz);
204 if (bfd_read(filehdr, 1, filhsz, abfd) != filhsz)
206 bfd_coff_swap_filehdr_in(abfd, filehdr, &internal_f);
207 bfd_release (abfd, filehdr);
209 if (bfd_coff_bad_format_hook (abfd, &internal_f) == false) {
210 bfd_error = wrong_format;
213 nscns =internal_f.f_nscns;
215 if (internal_f.f_opthdr) {
218 opthdr = bfd_alloc (abfd, aoutsz);
221 if (bfd_read(opthdr, 1,aoutsz, abfd) != aoutsz) {
224 bfd_coff_swap_aouthdr_in(abfd, opthdr, (PTR)&internal_a);
227 /* Seek past the opt hdr stuff */
228 bfd_seek(abfd, (file_ptr) (internal_f.f_opthdr + filhsz), SEEK_SET);
230 return coff_real_object_p(abfd, nscns, &internal_f,
231 (internal_f.f_opthdr != 0
233 : (struct internal_aouthdr *) NULL));
236 /* Get the BFD section from a COFF symbol section number. */
239 DEFUN(coff_section_from_bfd_index,(abfd, index),
243 struct sec *answer = abfd->sections;
247 return &bfd_abs_section;
249 if (index == N_UNDEF)
251 return &bfd_und_section;
255 return &bfd_debug_section;
260 if (answer->target_index == index)
262 answer = answer->next;
265 return &bfd_und_section; /* For gcc -W and lint. Never executed. */
268 /* Get the upper bound of a COFF symbol table. */
271 coff_get_symtab_upper_bound(abfd)
274 if (!bfd_coff_slurp_symbol_table(abfd))
277 return (bfd_get_symcount(abfd) + 1) * (sizeof(coff_symbol_type *));
281 /* Canonicalize a COFF symbol table. */
284 DEFUN(coff_get_symtab, (abfd, alocation),
288 unsigned int counter = 0;
289 coff_symbol_type *symbase;
290 coff_symbol_type **location = (coff_symbol_type **) (alocation);
291 if (!bfd_coff_slurp_symbol_table(abfd))
294 symbase = obj_symbols(abfd);
295 while (counter < bfd_get_symcount(abfd))
297 /* This nasty code looks at the symbol to decide whether or
298 not it is descibes a constructor/destructor entry point. It
299 is structured this way to (hopefully) speed non matches */
301 if (0 && symbase->symbol.name[9] == '$')
303 bfd_constructor_entry(abfd,
304 (asymbol **)location,
305 symbase->symbol.name[10] == 'I' ?
309 *(location++) = symbase++;
313 return bfd_get_symcount(abfd);
316 /* Set lineno_count for the output sections of a COFF file. */
319 DEFUN(coff_count_linenumbers,(abfd),
322 unsigned int limit = bfd_get_symcount(abfd);
327 asection *s = abfd->sections->output_section;
329 BFD_ASSERT(s->lineno_count == 0);
335 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++) {
336 asymbol *q_maybe = *p;
337 if (bfd_asymbol_flavour(q_maybe) == bfd_target_coff_flavour) {
338 coff_symbol_type *q = coffsymbol(q_maybe);
341 This symbol has a linenumber, increment the owning
342 section's linenumber count
344 alent *l = q->lineno;
345 q->symbol.section->output_section->lineno_count++;
348 while (l->line_number) {
350 q->symbol.section->output_section->lineno_count++;
359 /* Takes a bfd and a symbol, returns a pointer to the coff specific
360 area of the symbol if there is one. */
364 DEFUN(coff_symbol_from,(ignore_abfd, symbol),
368 if (bfd_asymbol_flavour(symbol) != bfd_target_coff_flavour)
369 return (coff_symbol_type *)NULL;
371 if (bfd_asymbol_bfd(symbol)->tdata.coff_obj_data == (coff_data_type*)NULL)
372 return (coff_symbol_type *)NULL;
374 return (coff_symbol_type *) symbol;
378 DEFUN(fixup_symbol_value,(coff_symbol_ptr, syment),
379 coff_symbol_type *coff_symbol_ptr AND
380 struct internal_syment *syment)
383 /* Normalize the symbol flags */
384 if (bfd_is_com_section (coff_symbol_ptr->symbol.section)) {
385 /* a common symbol is undefined with a value */
386 syment->n_scnum = N_UNDEF;
387 syment->n_value = coff_symbol_ptr->symbol.value;
389 else if (coff_symbol_ptr->symbol.flags & BSF_DEBUGGING) {
390 syment->n_value = coff_symbol_ptr->symbol.value;
392 else if (coff_symbol_ptr->symbol.section == & bfd_und_section) {
393 syment->n_scnum = N_UNDEF;
397 if (coff_symbol_ptr->symbol.section) {
399 coff_symbol_ptr->symbol.section->output_section->target_index;
402 coff_symbol_ptr->symbol.value +
403 coff_symbol_ptr->symbol.section->output_offset +
404 coff_symbol_ptr->symbol.section->output_section->vma;
409 syment->n_scnum = N_ABS;
410 syment->n_value = coff_symbol_ptr->symbol.value;
415 /* run through all the symbols in the symbol table and work out what
416 their indexes into the symbol table will be when output
418 Coff requires that each C_FILE symbol points to the next one in the
419 chain, and that the last one points to the first external symbol. We
424 DEFUN(coff_renumber_symbols,(bfd_ptr),
427 unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
428 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
429 unsigned int native_index = 0;
430 struct internal_syment *last_file = (struct internal_syment *)NULL;
431 unsigned int symbol_index;
433 /* COFF demands that undefined symbols come after all other symbols.
434 Since we don't need to impose this extra knowledge on all our client
435 programs, deal with that here. Sort the symbol table; just move the
436 undefined symbols to the end, leaving the rest alone. */
437 /* @@ Do we have some condition we could test for, so we don't always
438 have to do this? I don't think relocatability is quite right, but
439 I'm not certain. [raeburn:19920508.1711EST] */
444 newsyms = (asymbol **) bfd_alloc_by_size_t (bfd_ptr,
446 * (symbol_count + 1));
447 bfd_ptr->outsymbols = newsyms;
448 for (i = 0; i < symbol_count; i++)
449 if (symbol_ptr_ptr[i]->section != &bfd_und_section)
450 *newsyms++ = symbol_ptr_ptr[i];
451 for (i = 0; i < symbol_count; i++)
452 if (symbol_ptr_ptr[i]->section == &bfd_und_section)
453 *newsyms++ = symbol_ptr_ptr[i];
454 *newsyms = (asymbol *) NULL;
455 symbol_ptr_ptr = bfd_ptr->outsymbols;
458 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
460 coff_symbol_type *coff_symbol_ptr = coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
461 if (coff_symbol_ptr && coff_symbol_ptr->native) {
462 combined_entry_type *s = coff_symbol_ptr->native;
465 if (s->u.syment.n_sclass == C_FILE)
467 if (last_file != (struct internal_syment *)NULL) {
468 last_file->n_value = native_index;
470 last_file = &(s->u.syment);
474 /* Modify the symbol values according to their section and
477 fixup_symbol_value(coff_symbol_ptr, &(s->u.syment));
479 for (i = 0; i < s->u.syment.n_numaux + 1; i++) {
480 s[i].offset = native_index ++;
487 obj_conv_table_size (bfd_ptr) = native_index;
491 Run thorough the symbol table again, and fix it so that all pointers to
492 entries are changed to the entries' index in the output symbol table.
496 DEFUN(coff_mangle_symbols,(bfd_ptr),
499 unsigned int symbol_count = bfd_get_symcount(bfd_ptr);
500 asymbol **symbol_ptr_ptr = bfd_ptr->outsymbols;
501 unsigned int symbol_index;
503 for (symbol_index = 0; symbol_index < symbol_count; symbol_index++)
505 coff_symbol_type *coff_symbol_ptr =
506 coff_symbol_from(bfd_ptr, symbol_ptr_ptr[symbol_index]);
508 if (coff_symbol_ptr && coff_symbol_ptr->native) {
510 combined_entry_type *s = coff_symbol_ptr->native;
512 for (i = 0; i < s->u.syment.n_numaux ; i++) {
513 combined_entry_type *a = s + i + 1;
515 a->u.auxent.x_sym.x_tagndx.l =
516 a->u.auxent.x_sym.x_tagndx.p->offset;
520 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l =
521 a->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p->offset;
531 static int string_size;
534 DEFUN(coff_fix_symbol_name,(abfd, symbol, native),
537 combined_entry_type *native)
539 unsigned int name_length;
540 union internal_auxent *auxent;
541 char * name = ( char *)(symbol->name);
543 if (name == (char *) NULL) {
544 /* coff symbols always have names, so we'll make one up */
545 symbol->name = "strange";
546 name = (char *)symbol->name;
548 name_length = strlen(name);
550 if (native->u.syment.n_sclass == C_FILE) {
551 strncpy(native->u.syment._n._n_name, ".file", SYMNMLEN);
552 auxent = &(native+1)->u.auxent;
554 if (bfd_coff_long_filenames (abfd)) {
555 if (name_length <= FILNMLEN) {
556 strncpy(auxent->x_file.x_fname, name, FILNMLEN);
559 auxent->x_file.x_n.x_offset = string_size + 4;
560 auxent->x_file.x_n.x_zeroes = 0;
561 string_size += name_length + 1;
565 strncpy(auxent->x_file.x_fname, name, FILNMLEN);
566 if (name_length > FILNMLEN) {
567 name[FILNMLEN] = '\0';
572 { /* NOT A C_FILE SYMBOL */
573 if (name_length <= SYMNMLEN) {
574 /* This name will fit into the symbol neatly */
575 strncpy(native->u.syment._n._n_name, symbol->name, SYMNMLEN);
578 native->u.syment._n._n_n._n_offset = string_size + 4;
579 native->u.syment._n._n_n._n_zeroes = 0;
580 string_size += name_length + 1;
585 #define set_index(symbol, idx) ((symbol)->udata =(PTR) (idx))
588 DEFUN(coff_write_symbol,(abfd, symbol, native, written),
591 combined_entry_type *native AND
592 unsigned int written)
594 unsigned int numaux = native->u.syment.n_numaux;
595 int type = native->u.syment.n_type;
596 int class = native->u.syment.n_sclass;
598 bfd_size_type symesz;
600 /* @@ bfd_debug_section isn't accessible outside this file, but we know
601 that C_FILE symbols belong there. So move them. */
602 if (native->u.syment.n_sclass == C_FILE)
603 symbol->section = &bfd_debug_section;
605 if (symbol->section == &bfd_abs_section)
607 native->u.syment.n_scnum = N_ABS;
609 else if (symbol->section == &bfd_debug_section)
611 native->u.syment.n_scnum = N_DEBUG;
613 else if (symbol->section == &bfd_und_section)
615 native->u.syment.n_scnum = N_UNDEF;
619 native->u.syment.n_scnum =
620 symbol->section->output_section->target_index;
624 coff_fix_symbol_name(abfd, symbol, native);
626 symesz = bfd_coff_symesz (abfd);
627 buf = bfd_alloc (abfd, symesz);
628 bfd_coff_swap_sym_out(abfd, &native->u.syment, buf);
629 bfd_write(buf, 1, symesz, abfd);
630 bfd_release (abfd, buf);
632 if (native->u.syment.n_numaux > 0)
634 bfd_size_type auxesz;
637 auxesz = bfd_coff_auxesz (abfd);
638 buf = bfd_alloc (abfd, auxesz);
639 for (j = 0; j < native->u.syment.n_numaux; j++)
641 bfd_coff_swap_aux_out(abfd,
642 &((native + j + 1)->u.auxent),
646 native->u.syment.n_numaux,
648 bfd_write(buf, 1, auxesz, abfd);
650 bfd_release (abfd, buf);
653 Reuse somewhere in the symbol to keep the index
655 set_index(symbol, written);
656 return written + 1 + numaux;
661 DEFUN(coff_write_alien_symbol,(abfd, symbol, written),
664 unsigned int written)
667 This symbol has been created by the loader, or come from a non
668 coff format. It has no native element to inherit, make our
671 combined_entry_type *native;
672 combined_entry_type dummy;
674 native->u.syment.n_type = T_NULL;
675 native->u.syment.n_flags = 0;
676 if (symbol->section == &bfd_und_section)
678 native->u.syment.n_scnum = N_UNDEF;
679 native->u.syment.n_value = symbol->value;
681 else if (bfd_is_com_section (symbol->section))
683 native->u.syment.n_scnum = N_UNDEF;
684 native->u.syment.n_value = symbol->value;
688 else if (symbol->flags & BSF_DEBUGGING) {
690 remove name so it doesn't take up any space
695 native->u.syment.n_scnum = symbol->section->output_section->target_index;
696 native->u.syment.n_value = symbol->value +
697 symbol->section->output_section->vma +
698 symbol->section->output_offset;
699 /* Copy the any flags from the the file hdr into the symbol */
701 coff_symbol_type *c = coff_symbol_from(abfd, symbol);
702 if (c != (coff_symbol_type *)NULL) {
703 native->u.syment.n_flags = bfd_asymbol_bfd(&c->symbol)->flags;
708 native->u.syment.n_type = 0;
709 if (symbol->flags & BSF_LOCAL)
710 native->u.syment.n_sclass = C_STAT;
712 native->u.syment.n_sclass = C_EXT;
713 native->u.syment.n_numaux = 0;
715 return coff_write_symbol(abfd, symbol, native, written);
719 DEFUN(coff_write_native_symbol,(abfd, symbol, written),
721 coff_symbol_type *symbol AND
722 unsigned int written)
725 Does this symbol have an ascociated line number - if so then
726 make it remember this symbol index. Also tag the auxent of
727 this symbol to point to the right place in the lineno table
729 combined_entry_type *native = symbol->native;
731 alent *lineno = symbol->lineno;
733 if (lineno && !symbol->done_lineno) {
734 unsigned int count = 0;
735 lineno[count].u.offset = written;
736 if (native->u.syment.n_numaux) {
737 union internal_auxent *a = &((native+1)->u.auxent);
739 a->x_sym.x_fcnary.x_fcn.x_lnnoptr =
740 symbol->symbol.section->output_section->moving_line_filepos;
743 And count and relocate all other linenumbers
747 while (lineno[count].line_number) {
750 I've been told this, but still need proof:
751 > The second bug is also in `bfd/coffcode.h'. This bug causes the linker to screw
752 > up the pc-relocations for all the line numbers in COFF code. This bug isn't
753 > only specific to A29K implementations, but affects all systems using COFF
754 > format binaries. Note that in COFF object files, the line number core offsets
755 > output by the assembler are relative to the start of each procedure, not
756 > to the start of the .text section. This patch relocates the line numbers
757 > relative to the `native->u.syment.n_value' instead of the section virtual
760 lineno[count].u.offset += native->u.syment.n_value;
763 lineno[count].u.offset +=
764 symbol->symbol.section->output_section->vma +
765 symbol->symbol.section->output_offset;
769 symbol->done_lineno = true;
771 symbol->symbol.section->output_section->moving_line_filepos +=
772 count * bfd_coff_linesz (abfd);
774 return coff_write_symbol(abfd, &( symbol->symbol), native,written);
778 DEFUN(coff_write_symbols,(abfd),
782 unsigned int limit = bfd_get_symcount(abfd);
783 unsigned int written = 0;
790 /* Seek to the right place */
791 bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET);
793 /* Output all the symbols we have */
796 for (p = abfd->outsymbols, i = 0; i < limit; i++, p++)
798 asymbol *symbol = *p;
799 coff_symbol_type *c_symbol = coff_symbol_from(abfd, symbol);
801 if (c_symbol == (coff_symbol_type *) NULL ||
802 c_symbol->native == (combined_entry_type *)NULL)
804 written = coff_write_alien_symbol(abfd, symbol, written);
808 written = coff_write_native_symbol(abfd, c_symbol, written);
813 bfd_get_symcount(abfd) = written;
815 /* Now write out strings */
817 if (string_size != 0)
819 unsigned int size = string_size + 4;
822 bfd_h_put_32(abfd, size, buffer);
823 bfd_write((PTR) buffer, 1, sizeof(buffer), abfd);
824 for (p = abfd->outsymbols, i = 0;
829 size_t name_length = strlen(q->name);
831 coff_symbol_type* c_symbol = coff_symbol_from(abfd, q);
832 maxlen = ((c_symbol != NULL && c_symbol->native != NULL) &&
833 (c_symbol->native->u.syment.n_sclass == C_FILE)) ?
836 if (name_length > maxlen) {
837 bfd_write((PTR) (q->name), 1, name_length + 1, abfd);
842 /* We would normally not write anything here, but we'll write
843 out 4 so that any stupid coff reader which tries to read
844 the string table even when there isn't one won't croak. */
845 unsigned int size = 4;
848 bfd_h_put_32 (abfd, size, buffer);
849 bfd_write((PTR) buffer, 1, sizeof (buffer), abfd);
854 DEFUN(coff_write_linenumbers,(abfd),
858 bfd_size_type linesz;
861 linesz = bfd_coff_linesz (abfd);
862 buff = bfd_alloc (abfd, linesz);
863 for (s = abfd->sections; s != (asection *) NULL; s = s->next) {
864 if (s->lineno_count) {
865 asymbol **q = abfd->outsymbols;
866 bfd_seek(abfd, s->line_filepos, SEEK_SET);
867 /* Find all the linenumbers in this section */
870 if (p->section->output_section == s) {
872 BFD_SEND(bfd_asymbol_bfd(p), _get_lineno, (bfd_asymbol_bfd(p), p));
874 /* Found a linenumber entry, output */
875 struct internal_lineno out;
876 memset( (PTR)&out, 0, sizeof(out));
878 out.l_addr.l_symndx = l->u.offset;
879 bfd_coff_swap_lineno_out(abfd, &out, buff);
880 bfd_write(buff, 1, linesz, abfd);
882 while (l->line_number) {
883 out.l_lnno = l->line_number;
884 out.l_addr.l_symndx = l->u.offset;
885 bfd_coff_swap_lineno_out(abfd, &out, buff);
886 bfd_write(buff, 1, linesz, abfd);
895 bfd_release (abfd, buff);
900 DEFUN(coff_get_lineno,(ignore_abfd, symbol),
904 return coffsymbol(symbol)->lineno;
908 coff_section_symbol (abfd, name)
912 asection *sec = bfd_make_section_old_way (abfd, name);
914 combined_entry_type *csym;
917 csym = coff_symbol_from (abfd, sym)->native;
918 /* Make sure back-end COFF stuff is there. */
922 coff_symbol_type sym;
923 /* @@FIXME This shouldn't use a fixed size!! */
924 combined_entry_type e[10];
927 f = (struct foo *) bfd_alloc_by_size_t (abfd, sizeof (*f));
928 memset ((char *) f, 0, sizeof (*f));
929 coff_symbol_from (abfd, sym)->native = csym = f->e;
931 csym[0].u.syment.n_sclass = C_STAT;
932 csym[0].u.syment.n_numaux = 1;
933 /* SF_SET_STATICS (sym); @@ ??? */
934 csym[1].u.auxent.x_scn.x_scnlen = sec->_raw_size;
935 csym[1].u.auxent.x_scn.x_nreloc = sec->reloc_count;
936 csym[1].u.auxent.x_scn.x_nlinno = sec->lineno_count;
938 if (sec->output_section == NULL)
940 sec->output_section = sec;
941 sec->output_offset = 0;
947 /* This function transforms the offsets into the symbol table into
948 pointers to syments. */
951 DEFUN(coff_pointerize_aux,(abfd, table_base, type, class, auxent),
953 combined_entry_type *table_base AND
956 combined_entry_type *auxent)
958 /* Don't bother if this is a file or a section */
959 if (class == C_STAT && type == T_NULL) return;
960 if (class == C_FILE) return;
962 /* Otherwise patch up */
963 #define N_TMASK coff_data (abfd)->local_n_tmask
964 #define N_BTSHFT coff_data (abfd)->local_n_btshft
965 if (ISFCN(type) || ISTAG(class) || class == C_BLOCK) {
966 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.p = table_base +
967 auxent->u.auxent.x_sym.x_fcnary.x_fcn.x_endndx.l;
970 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
971 generate one, so we must be careful to ignore it. */
972 if (auxent->u.auxent.x_sym.x_tagndx.l > 0) {
973 auxent->u.auxent.x_sym.x_tagndx.p =
974 table_base + auxent->u.auxent.x_sym.x_tagndx.l;
980 DEFUN(build_string_table,(abfd),
983 char string_table_size_buffer[4];
984 unsigned int string_table_size;
987 /* At this point we should be "seek"'d to the end of the
988 symbols === the symbol table size. */
989 if (bfd_read((char *) string_table_size_buffer,
990 sizeof(string_table_size_buffer),
991 1, abfd) != sizeof(string_table_size)) {
992 bfd_error = system_call_error;
996 string_table_size = bfd_h_get_32(abfd, (bfd_byte *) string_table_size_buffer);
998 if ((string_table = (PTR) bfd_alloc(abfd, string_table_size -= 4)) == NULL) {
999 bfd_error = no_memory;
1001 } /* on mallocation error */
1002 if (bfd_read(string_table, string_table_size, 1, abfd) != string_table_size) {
1003 bfd_error = system_call_error;
1006 return string_table;
1009 /* Allocate space for the ".debug" section, and read it.
1010 We did not read the debug section until now, because
1011 we didn't want to go to the trouble until someone needed it. */
1014 DEFUN(build_debug_section,(abfd),
1017 char *debug_section;
1020 asection *sect = bfd_get_section_by_name (abfd, ".debug");
1023 bfd_error = no_debug_section;
1027 debug_section = (PTR) bfd_alloc (abfd,
1028 bfd_get_section_size_before_reloc (sect));
1029 if (debug_section == NULL) {
1030 bfd_error = no_memory;
1034 /* Seek to the beginning of the `.debug' section and read it.
1035 Save the current position first; it is needed by our caller.
1036 Then read debug section and reset the file pointer. */
1038 position = bfd_tell (abfd);
1039 bfd_seek (abfd, sect->filepos, SEEK_SET);
1040 if (bfd_read (debug_section,
1041 bfd_get_section_size_before_reloc (sect), 1, abfd)
1042 != bfd_get_section_size_before_reloc(sect)) {
1043 bfd_error = system_call_error;
1046 bfd_seek (abfd, position, SEEK_SET);
1047 return debug_section;
1051 /* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1052 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1053 be \0-terminated. */
1055 DEFUN(copy_name,(abfd, name, maxlen),
1063 for (len = 0; len < maxlen; ++len) {
1064 if (name[len] == '\0') {
1069 if ((newname = (PTR) bfd_alloc(abfd, len+1)) == NULL) {
1070 bfd_error = no_memory;
1073 strncpy(newname, name, len);
1074 newname[len] = '\0';
1078 /* Read a symbol table into freshly bfd_allocated memory, swap it, and
1079 knit the symbol names into a normalized form. By normalized here I
1080 mean that all symbols have an n_offset pointer that points to a null-
1081 terminated string. */
1083 combined_entry_type *
1084 DEFUN(coff_get_normalized_symtab,(abfd),
1087 combined_entry_type *internal;
1088 combined_entry_type *internal_ptr;
1089 combined_entry_type *symbol_ptr;
1090 combined_entry_type *internal_end;
1091 bfd_size_type symesz;
1095 char *string_table = NULL;
1096 char *debug_section = NULL;
1099 unsigned int raw_size;
1100 if (obj_raw_syments(abfd) != (combined_entry_type *)NULL) {
1101 return obj_raw_syments(abfd);
1103 if ((size = bfd_get_symcount(abfd) * sizeof(combined_entry_type)) == 0) {
1104 bfd_error = no_symbols;
1108 internal = (combined_entry_type *)bfd_alloc(abfd, size);
1109 internal_end = internal + bfd_get_symcount(abfd);
1111 symesz = bfd_coff_symesz (abfd);
1112 raw_size = bfd_get_symcount(abfd) * symesz;
1113 raw = bfd_alloc(abfd,raw_size);
1115 if (bfd_seek(abfd, obj_sym_filepos(abfd), SEEK_SET) == -1
1116 || bfd_read(raw, raw_size, 1, abfd) != raw_size) {
1117 bfd_error = system_call_error;
1120 /* mark the end of the symbols */
1121 raw_end = (char *) raw + bfd_get_symcount(abfd) * symesz;
1123 FIXME SOMEDAY. A string table size of zero is very weird, but
1124 probably possible. If one shows up, it will probably kill us.
1127 /* Swap all the raw entries */
1128 for (raw_src = (char *) raw, internal_ptr = internal;
1130 raw_src += symesz, internal_ptr++) {
1133 bfd_coff_swap_sym_in(abfd, (PTR)raw_src, (PTR)&internal_ptr->u.syment);
1134 internal_ptr->fix_tag = 0;
1135 internal_ptr->fix_end = 0;
1136 symbol_ptr = internal_ptr;
1139 i < symbol_ptr->u.syment.n_numaux;
1145 internal_ptr->fix_tag = 0;
1146 internal_ptr->fix_end = 0;
1147 bfd_coff_swap_aux_in(abfd, (PTR) raw_src,
1148 symbol_ptr->u.syment.n_type,
1149 symbol_ptr->u.syment.n_sclass,
1150 i, symbol_ptr->u.syment.n_numaux,
1151 &(internal_ptr->u.auxent));
1152 /* Remember that bal entries arn't pointerized */
1153 if (i != 1 || symbol_ptr->u.syment.n_sclass != C_LEAFPROC)
1156 coff_pointerize_aux(abfd,
1158 symbol_ptr->u.syment.n_type,
1159 symbol_ptr->u.syment.n_sclass,
1166 /* Free all the raw stuff */
1167 bfd_release(abfd, raw);
1169 for (internal_ptr = internal; internal_ptr < internal_end;
1172 if (internal_ptr->u.syment.n_sclass == C_FILE) {
1173 /* make a file symbol point to the name in the auxent, since
1174 the text ".file" is redundant */
1175 if ((internal_ptr+1)->u.auxent.x_file.x_n.x_zeroes == 0) {
1176 /* the filename is a long one, point into the string table */
1177 if (string_table == NULL) {
1178 string_table = build_string_table(abfd);
1181 internal_ptr->u.syment._n._n_n._n_offset =
1182 (long) (string_table - 4 +
1183 (internal_ptr+1)->u.auxent.x_file.x_n.x_offset);
1186 /* ordinary short filename, put into memory anyway */
1187 internal_ptr->u.syment._n._n_n._n_offset = (long)
1188 copy_name(abfd, (internal_ptr+1)->u.auxent.x_file.x_fname,
1193 if (internal_ptr->u.syment._n._n_n._n_zeroes != 0) {
1194 /* This is a "short" name. Make it long. */
1195 unsigned long i = 0;
1196 char *newstring = NULL;
1198 /* find the length of this string without walking into memory
1200 for (i = 0; i < 8; ++i) {
1201 if (internal_ptr->u.syment._n._n_name[i] == '\0') {
1203 } /* if end of string */
1204 } /* possible lengths of this string. */
1206 if ((newstring = (PTR) bfd_alloc(abfd, ++i)) == NULL) {
1207 bfd_error = no_memory;
1210 memset(newstring, 0, i);
1211 strncpy(newstring, internal_ptr->u.syment._n._n_name, i-1);
1212 internal_ptr->u.syment._n._n_n._n_offset = (long int) newstring;
1213 internal_ptr->u.syment._n._n_n._n_zeroes = 0;
1215 else if (!bfd_coff_symname_in_debug(abfd, &internal_ptr->u.syment)) {
1216 /* Long name already. Point symbol at the string in the table. */
1217 if (string_table == NULL) {
1218 string_table = build_string_table(abfd);
1220 internal_ptr->u.syment._n._n_n._n_offset = (long int)
1221 (string_table - 4 + internal_ptr->u.syment._n._n_n._n_offset);
1224 /* Long name in debug section. Very similar. */
1225 if (debug_section == NULL) {
1226 debug_section = build_debug_section(abfd);
1228 internal_ptr->u.syment._n._n_n._n_offset = (long int)
1229 (debug_section + internal_ptr->u.syment._n._n_n._n_offset);
1232 internal_ptr += internal_ptr->u.syment.n_numaux;
1235 obj_raw_syments(abfd) = internal;
1236 obj_raw_syment_count(abfd) = internal_ptr - internal;
1239 } /* coff_get_normalized_symtab() */
1242 DEFUN (coff_get_reloc_upper_bound, (abfd, asect),
1246 if (bfd_get_format(abfd) != bfd_object) {
1247 bfd_error = invalid_operation;
1250 return (asect->reloc_count + 1) * sizeof(arelent *);
1254 DEFUN (coff_make_empty_symbol, (abfd),
1257 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type));
1259 bfd_error = no_memory;
1262 new->symbol.section = 0;
1264 new->lineno = (alent *) NULL;
1265 new->done_lineno = false;
1266 new->symbol.the_bfd = abfd;
1267 return &new->symbol;
1270 /* Make a debugging symbol. */
1273 coff_bfd_make_debug_symbol (abfd, ptr, sz)
1278 coff_symbol_type *new = (coff_symbol_type *) bfd_alloc(abfd, sizeof(coff_symbol_type));
1280 bfd_error = no_memory;
1283 /* @@ This shouldn't be using a constant multiplier. */
1284 new->native = (combined_entry_type *) bfd_zalloc (abfd, sizeof (combined_entry_type) * 10);
1285 new->symbol.section = &bfd_debug_section;
1286 new->lineno = (alent *) NULL;
1287 new->done_lineno = false;
1288 new->symbol.the_bfd = abfd;
1289 return &new->symbol;
1294 coff_get_symbol_info (abfd, symbol, ret)
1299 bfd_symbol_info (symbol, ret);
1302 /* Print out information about COFF symbol. */
1305 coff_print_symbol (abfd, filep, symbol, how)
1309 bfd_print_symbol_type how;
1311 FILE *file = (FILE *) filep;
1315 case bfd_print_symbol_name:
1316 fprintf (file, "%s", symbol->name);
1319 case bfd_print_symbol_more:
1320 fprintf (file, "coff %s %s",
1321 coffsymbol(symbol)->native ? "n" : "g",
1322 coffsymbol(symbol)->lineno ? "l" : " ");
1325 case bfd_print_symbol_all:
1326 if (coffsymbol(symbol)->native)
1329 combined_entry_type *combined = coffsymbol (symbol)->native;
1330 combined_entry_type *root = obj_raw_syments (abfd);
1331 struct lineno_cache_entry *l = coffsymbol(symbol)->lineno;
1333 fprintf (file,"[%3d]", combined - root);
1336 "(sc %2d)(fl 0x%02x)(ty %3x)(sc %3d) (nx %d) 0x%08lx %s",
1337 combined->u.syment.n_scnum,
1338 combined->u.syment.n_flags,
1339 combined->u.syment.n_type,
1340 combined->u.syment.n_sclass,
1341 combined->u.syment.n_numaux,
1342 (unsigned long) combined->u.syment.n_value,
1345 for (aux = 0; aux < combined->u.syment.n_numaux; aux++)
1347 combined_entry_type *auxp = combined + aux + 1;
1351 tagndx = auxp->u.auxent.x_sym.x_tagndx.p - root;
1353 tagndx = auxp->u.auxent.x_sym.x_tagndx.l;
1355 fprintf (file, "\n");
1356 switch (combined->u.syment.n_sclass)
1359 fprintf (file, "File ");
1363 fprintf (file, "AUX lnno %d size 0x%x tagndx %ld",
1364 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_lnno,
1365 auxp->u.auxent.x_sym.x_misc.x_lnsz.x_size,
1373 fprintf (file, "\n%s :", l->u.sym->name);
1375 while (l->line_number)
1377 fprintf (file, "\n%4d : 0x%lx",
1380 (l->u.offset + symbol->section->vma)));
1387 bfd_print_symbol_vandf ((PTR) file, symbol);
1388 fprintf (file, " %-5s %s %s %s",
1389 symbol->section->name,
1390 coffsymbol(symbol)->native ? "n" : "g",
1391 coffsymbol(symbol)->lineno ? "l" : " ",
1397 /* Provided a BFD, a section and an offset into the section, calculate
1398 and return the name of the source file and the line nearest to the
1403 DEFUN(coff_find_nearest_line,(abfd,
1411 asection *section AND
1412 asymbol **ignore_symbols AND
1414 CONST char **filename_ptr AND
1415 CONST char **functionname_ptr AND
1416 unsigned int *line_ptr)
1418 static bfd *cache_abfd;
1419 static asection *cache_section;
1420 static bfd_vma cache_offset;
1421 static unsigned int cache_i;
1422 static CONST char *cache_function;
1423 static unsigned int line_base = 0;
1426 coff_data_type *cof = coff_data(abfd);
1427 /* Run through the raw syments if available */
1428 combined_entry_type *p;
1433 *functionname_ptr = 0;
1436 /* Don't try and find line numbers in a non coff file */
1437 if (abfd->xvec->flavour != bfd_target_coff_flavour)
1443 p = cof->raw_syments;
1445 for (i = 0; i < cof->raw_syment_count; i++) {
1446 if (p->u.syment.n_sclass == C_FILE) {
1447 /* File name has been moved into symbol */
1448 *filename_ptr = (char *) p->u.syment._n._n_n._n_offset;
1451 p += 1 + p->u.syment.n_numaux;
1453 /* Now wander though the raw linenumbers of the section */
1455 If this is the same BFD as we were previously called with and this is
1456 the same section, and the offset we want is further down then we can
1457 prime the lookup loop
1459 if (abfd == cache_abfd &&
1460 section == cache_section &&
1461 offset >= cache_offset) {
1463 *functionname_ptr = cache_function;
1468 l = §ion->lineno[i];
1470 for (; i < section->lineno_count; i++) {
1471 if (l->line_number == 0) {
1472 /* Get the symbol this line number points at */
1473 coff_symbol_type *coff = (coff_symbol_type *) (l->u.sym);
1474 if (coff->symbol.value > offset)
1476 *functionname_ptr = coff->symbol.name;
1478 combined_entry_type *s = coff->native;
1479 s = s + 1 + s->u.syment.n_numaux;
1481 S should now point to the .bf of the function
1483 if (s->u.syment.n_numaux) {
1485 The linenumber is stored in the auxent
1487 union internal_auxent *a = &((s + 1)->u.auxent);
1488 line_base = a->x_sym.x_misc.x_lnsz.x_lnno;
1489 *line_ptr = line_base;
1494 if (l->u.offset > offset)
1496 *line_ptr = l->line_number + line_base - 1;
1502 cache_section = section;
1503 cache_offset = offset;
1505 cache_function = *functionname_ptr;
1511 DEFUN(coff_sizeof_headers,(abfd, reloc),
1517 if (reloc == false) {
1518 size = bfd_coff_filhsz (abfd) + bfd_coff_aoutsz (abfd);
1521 size = bfd_coff_filhsz (abfd);
1524 size += abfd->section_count * bfd_coff_scnhsz (abfd);