1 /* Support for the generic parts of COFF, for BFD.
2 Copyright 1990, 91, 92, 93, 94, 95, 96, 97, 98, 1999, 2000
3 Free Software Foundation, Inc.
4 Written by Cygnus Support.
6 This file is part of BFD, the Binary File Descriptor library.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 /* Most of this hacked by Steve Chamberlain, sac@cygnus.com.
23 Split out of coffcode.h by Ian Taylor, ian@cygnus.com. */
25 /* This file contains COFF code that is not dependent on any
26 particular COFF target. There is only one version of this file in
27 libbfd.a, so no target specific code may be put in here. Or, to
30 ********** DO NOT PUT TARGET SPECIFIC CODE IN THIS FILE **********
32 If you need to add some target specific behaviour, add a new hook
33 function to bfd_coff_backend_data.
35 Some of these functions are also called by the ECOFF routines.
36 Those functions may not use any COFF specific information, such as
42 #include "coff/internal.h"
45 static void coff_fix_symbol_name
46 PARAMS ((bfd
*, asymbol
*, combined_entry_type
*, bfd_size_type
*,
47 asection
**, bfd_size_type
*));
48 static boolean coff_write_symbol
49 PARAMS ((bfd
*, asymbol
*, combined_entry_type
*, unsigned int *,
50 bfd_size_type
*, asection
**, bfd_size_type
*));
51 static boolean coff_write_alien_symbol
52 PARAMS ((bfd
*, asymbol
*, unsigned int *, bfd_size_type
*,
53 asection
**, bfd_size_type
*));
54 static boolean coff_write_native_symbol
55 PARAMS ((bfd
*, coff_symbol_type
*, unsigned int *, bfd_size_type
*,
56 asection
**, bfd_size_type
*));
57 static void coff_pointerize_aux
58 PARAMS ((bfd
*, combined_entry_type
*, combined_entry_type
*,
59 unsigned int, combined_entry_type
*));
60 static boolean make_a_section_from_file
61 PARAMS ((bfd
*, struct internal_scnhdr
*, unsigned int));
62 static const bfd_target
*coff_real_object_p
63 PARAMS ((bfd
*, unsigned, struct internal_filehdr
*,
64 struct internal_aouthdr
*));
65 static void fixup_symbol_value
66 PARAMS ((bfd
*, coff_symbol_type
*, struct internal_syment
*));
67 static char *build_debug_section
69 static char *copy_name
70 PARAMS ((bfd
*, char *, int));
72 #define STRING_SIZE_SIZE (4)
74 /* Take a section header read from a coff file (in HOST byte order),
75 and make a BFD "section" out of it. This is used by ECOFF. */
77 make_a_section_from_file (abfd
, hdr
, target_index
)
79 struct internal_scnhdr
*hdr
;
80 unsigned int target_index
;
82 asection
*return_section
;
87 /* Handle long section names as in PE. */
88 if (bfd_coff_long_section_names (abfd
)
89 && hdr
->s_name
[0] == '/')
96 memcpy (buf
, hdr
->s_name
+ 1, SCNNMLEN
- 1);
97 buf
[SCNNMLEN
- 1] = '\0';
98 strindex
= strtol (buf
, &p
, 10);
99 if (*p
== '\0' && strindex
>= 0)
101 strings
= _bfd_coff_read_string_table (abfd
);
104 /* FIXME: For extra safety, we should make sure that
105 strindex does not run us past the end, but right now we
106 don't know the length of the string table. */
108 name
= bfd_alloc (abfd
, strlen (strings
) + 1);
111 strcpy (name
, strings
);
117 /* Assorted wastage to null-terminate the name, thanks AT&T! */
118 name
= bfd_alloc (abfd
, sizeof (hdr
->s_name
) + 1);
121 strncpy (name
, (char *) &hdr
->s_name
[0], sizeof (hdr
->s_name
));
122 name
[sizeof (hdr
->s_name
)] = 0;
125 return_section
= bfd_make_section_anyway (abfd
, name
);
126 if (return_section
== NULL
)
129 return_section
->vma
= hdr
->s_vaddr
;
130 return_section
->lma
= hdr
->s_paddr
;
131 return_section
->_raw_size
= hdr
->s_size
;
132 return_section
->filepos
= hdr
->s_scnptr
;
133 return_section
->rel_filepos
= hdr
->s_relptr
;
134 return_section
->reloc_count
= hdr
->s_nreloc
;
136 bfd_coff_set_alignment_hook (abfd
, return_section
, hdr
);
138 return_section
->line_filepos
= hdr
->s_lnnoptr
;
140 return_section
->lineno_count
= hdr
->s_nlnno
;
141 return_section
->userdata
= NULL
;
142 return_section
->next
= (asection
*) NULL
;
143 return_section
->target_index
= target_index
;
144 return_section
->flags
= bfd_coff_styp_to_sec_flags_hook (abfd
, hdr
, name
,
147 /* At least on i386-coff, the line number count for a shared library
148 section must be ignored. */
149 if ((return_section
->flags
& SEC_COFF_SHARED_LIBRARY
) != 0)
150 return_section
->lineno_count
= 0;
152 if (hdr
->s_nreloc
!= 0)
153 return_section
->flags
|= SEC_RELOC
;
154 /* FIXME: should this check 'hdr->s_size > 0' */
155 if (hdr
->s_scnptr
!= 0)
156 return_section
->flags
|= SEC_HAS_CONTENTS
;
160 /* Read in a COFF object and make it into a BFD. This is used by
163 static const bfd_target
*
164 coff_real_object_p (abfd
, nscns
, internal_f
, internal_a
)
167 struct internal_filehdr
*internal_f
;
168 struct internal_aouthdr
*internal_a
;
170 flagword oflags
= abfd
->flags
;
171 bfd_vma ostart
= bfd_get_start_address (abfd
);
173 size_t readsize
; /* length of file_info */
175 char *external_sections
;
177 if (!(internal_f
->f_flags
& F_RELFLG
))
178 abfd
->flags
|= HAS_RELOC
;
179 if ((internal_f
->f_flags
& F_EXEC
))
180 abfd
->flags
|= EXEC_P
;
181 if (!(internal_f
->f_flags
& F_LNNO
))
182 abfd
->flags
|= HAS_LINENO
;
183 if (!(internal_f
->f_flags
& F_LSYMS
))
184 abfd
->flags
|= HAS_LOCALS
;
186 /* FIXME: How can we set D_PAGED correctly? */
187 if ((internal_f
->f_flags
& F_EXEC
) != 0)
188 abfd
->flags
|= D_PAGED
;
190 bfd_get_symcount (abfd
) = internal_f
->f_nsyms
;
191 if (internal_f
->f_nsyms
)
192 abfd
->flags
|= HAS_SYMS
;
194 if (internal_a
!= (struct internal_aouthdr
*) NULL
)
195 bfd_get_start_address (abfd
) = internal_a
->entry
;
197 bfd_get_start_address (abfd
) = 0;
199 /* Set up the tdata area. ECOFF uses its own routine, and overrides
201 tdata
= bfd_coff_mkobject_hook (abfd
, (PTR
) internal_f
, (PTR
) internal_a
);
205 scnhsz
= bfd_coff_scnhsz (abfd
);
206 readsize
= nscns
* scnhsz
;
207 external_sections
= (char *) bfd_alloc (abfd
, readsize
);
208 if (!external_sections
)
211 if (bfd_read ((PTR
) external_sections
, 1, readsize
, abfd
) != readsize
)
214 /* Set the arch/mach *before* swapping in sections; section header swapping
215 may depend on arch/mach info. */
216 if (bfd_coff_set_arch_mach_hook (abfd
, (PTR
) internal_f
) == false)
219 /* Now copy data as required; construct all asections etc */
223 for (i
= 0; i
< nscns
; i
++)
225 struct internal_scnhdr tmp
;
226 bfd_coff_swap_scnhdr_in (abfd
,
227 (PTR
) (external_sections
+ i
* scnhsz
),
229 if (! make_a_section_from_file (abfd
, &tmp
, i
+ 1))
234 /* make_abs_section (abfd); */
239 bfd_release (abfd
, tdata
);
240 abfd
->flags
= oflags
;
241 bfd_get_start_address (abfd
) = ostart
;
242 return (const bfd_target
*) NULL
;
245 /* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
246 not a COFF file. This is also used by ECOFF. */
256 struct internal_filehdr internal_f
;
257 struct internal_aouthdr internal_a
;
259 /* figure out how much to read */
260 filhsz
= bfd_coff_filhsz (abfd
);
261 aoutsz
= bfd_coff_aoutsz (abfd
);
263 filehdr
= bfd_alloc (abfd
, filhsz
);
266 if (bfd_read (filehdr
, 1, filhsz
, abfd
) != filhsz
)
268 if (bfd_get_error () != bfd_error_system_call
)
269 bfd_set_error (bfd_error_wrong_format
);
272 bfd_coff_swap_filehdr_in (abfd
, filehdr
, &internal_f
);
273 bfd_release (abfd
, filehdr
);
275 if (bfd_coff_bad_format_hook (abfd
, &internal_f
) == false)
277 bfd_set_error (bfd_error_wrong_format
);
280 nscns
= internal_f
.f_nscns
;
282 if (internal_f
.f_opthdr
)
286 opthdr
= bfd_alloc (abfd
, aoutsz
);
289 if (bfd_read (opthdr
, 1, internal_f
.f_opthdr
, abfd
)
290 != internal_f
.f_opthdr
)
294 bfd_coff_swap_aouthdr_in (abfd
, opthdr
, (PTR
) &internal_a
);
297 return coff_real_object_p (abfd
, nscns
, &internal_f
,
298 (internal_f
.f_opthdr
!= 0
300 : (struct internal_aouthdr
*) NULL
));
303 /* Get the BFD section from a COFF symbol section number. */
306 coff_section_from_bfd_index (abfd
, index
)
310 struct sec
*answer
= abfd
->sections
;
313 return bfd_abs_section_ptr
;
314 if (index
== N_UNDEF
)
315 return bfd_und_section_ptr
;
316 if (index
== N_DEBUG
)
317 return bfd_abs_section_ptr
;
321 if (answer
->target_index
== index
)
323 answer
= answer
->next
;
326 /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
327 has a bad symbol table in biglitpow.o. */
328 return bfd_und_section_ptr
;
331 /* Get the upper bound of a COFF symbol table. */
334 coff_get_symtab_upper_bound (abfd
)
337 if (!bfd_coff_slurp_symbol_table (abfd
))
340 return (bfd_get_symcount (abfd
) + 1) * (sizeof (coff_symbol_type
*));
343 /* Canonicalize a COFF symbol table. */
346 coff_get_symtab (abfd
, alocation
)
350 unsigned int counter
;
351 coff_symbol_type
*symbase
;
352 coff_symbol_type
**location
= (coff_symbol_type
**) alocation
;
354 if (!bfd_coff_slurp_symbol_table (abfd
))
357 symbase
= obj_symbols (abfd
);
358 counter
= bfd_get_symcount (abfd
);
359 while (counter
-- > 0)
360 *location
++ = symbase
++;
364 return bfd_get_symcount (abfd
);
367 /* Get the name of a symbol. The caller must pass in a buffer of size
371 _bfd_coff_internal_syment_name (abfd
, sym
, buf
)
373 const struct internal_syment
*sym
;
376 /* FIXME: It's not clear this will work correctly if sizeof
378 if (sym
->_n
._n_n
._n_zeroes
!= 0
379 || sym
->_n
._n_n
._n_offset
== 0)
381 memcpy (buf
, sym
->_n
._n_name
, SYMNMLEN
);
382 buf
[SYMNMLEN
] = '\0';
389 BFD_ASSERT (sym
->_n
._n_n
._n_offset
>= STRING_SIZE_SIZE
);
390 strings
= obj_coff_strings (abfd
);
393 strings
= _bfd_coff_read_string_table (abfd
);
397 return strings
+ sym
->_n
._n_n
._n_offset
;
401 /* Read in and swap the relocs. This returns a buffer holding the
402 relocs for section SEC in file ABFD. If CACHE is true and
403 INTERNAL_RELOCS is NULL, the relocs read in will be saved in case
404 the function is called again. If EXTERNAL_RELOCS is not NULL, it
405 is a buffer large enough to hold the unswapped relocs. If
406 INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold
407 the swapped relocs. If REQUIRE_INTERNAL is true, then the return
408 value must be INTERNAL_RELOCS. The function returns NULL on error. */
410 struct internal_reloc
*
411 _bfd_coff_read_internal_relocs (abfd
, sec
, cache
, external_relocs
,
412 require_internal
, internal_relocs
)
416 bfd_byte
*external_relocs
;
417 boolean require_internal
;
418 struct internal_reloc
*internal_relocs
;
421 bfd_byte
*free_external
= NULL
;
422 struct internal_reloc
*free_internal
= NULL
;
425 struct internal_reloc
*irel
;
427 if (coff_section_data (abfd
, sec
) != NULL
428 && coff_section_data (abfd
, sec
)->relocs
!= NULL
)
430 if (! require_internal
)
431 return coff_section_data (abfd
, sec
)->relocs
;
432 memcpy (internal_relocs
, coff_section_data (abfd
, sec
)->relocs
,
433 sec
->reloc_count
* sizeof (struct internal_reloc
));
434 return internal_relocs
;
437 relsz
= bfd_coff_relsz (abfd
);
439 if (external_relocs
== NULL
)
441 free_external
= (bfd_byte
*) bfd_malloc (sec
->reloc_count
* relsz
);
442 if (free_external
== NULL
&& sec
->reloc_count
> 0)
444 external_relocs
= free_external
;
447 if (bfd_seek (abfd
, sec
->rel_filepos
, SEEK_SET
) != 0
448 || (bfd_read (external_relocs
, relsz
, sec
->reloc_count
, abfd
)
449 != relsz
* sec
->reloc_count
))
452 if (internal_relocs
== NULL
)
454 free_internal
= ((struct internal_reloc
*)
455 bfd_malloc (sec
->reloc_count
456 * sizeof (struct internal_reloc
)));
457 if (free_internal
== NULL
&& sec
->reloc_count
> 0)
459 internal_relocs
= free_internal
;
462 /* Swap in the relocs. */
463 erel
= external_relocs
;
464 erel_end
= erel
+ relsz
* sec
->reloc_count
;
465 irel
= internal_relocs
;
466 for (; erel
< erel_end
; erel
+= relsz
, irel
++)
467 bfd_coff_swap_reloc_in (abfd
, (PTR
) erel
, (PTR
) irel
);
469 if (free_external
!= NULL
)
471 free (free_external
);
472 free_external
= NULL
;
475 if (cache
&& free_internal
!= NULL
)
477 if (coff_section_data (abfd
, sec
) == NULL
)
480 (PTR
) bfd_zalloc (abfd
,
481 sizeof (struct coff_section_tdata
));
482 if (sec
->used_by_bfd
== NULL
)
484 coff_section_data (abfd
, sec
)->contents
= NULL
;
486 coff_section_data (abfd
, sec
)->relocs
= free_internal
;
489 return internal_relocs
;
492 if (free_external
!= NULL
)
493 free (free_external
);
494 if (free_internal
!= NULL
)
495 free (free_internal
);
499 /* Set lineno_count for the output sections of a COFF file. */
502 coff_count_linenumbers (abfd
)
505 unsigned int limit
= bfd_get_symcount (abfd
);
513 /* This may be from the backend linker, in which case the
514 lineno_count in the sections is correct. */
515 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
516 total
+= s
->lineno_count
;
520 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
521 BFD_ASSERT (s
->lineno_count
== 0);
523 for (p
= abfd
->outsymbols
, i
= 0; i
< limit
; i
++, p
++)
525 asymbol
*q_maybe
= *p
;
527 if (bfd_family_coff (bfd_asymbol_bfd (q_maybe
)))
529 coff_symbol_type
*q
= coffsymbol (q_maybe
);
531 /* The AIX 4.1 compiler can sometimes generate line numbers
532 attached to debugging symbols. We try to simply ignore
534 if (q
->lineno
!= NULL
535 && q
->symbol
.section
->owner
!= NULL
)
537 /* This symbol has line numbers. Increment the owning
538 section's linenumber count. */
539 alent
*l
= q
->lineno
;
541 ++q
->symbol
.section
->output_section
->lineno_count
;
544 while (l
->line_number
!= 0)
547 ++q
->symbol
.section
->output_section
->lineno_count
;
557 /* Takes a bfd and a symbol, returns a pointer to the coff specific
558 area of the symbol if there is one. */
561 coff_symbol_from (ignore_abfd
, symbol
)
562 bfd
*ignore_abfd ATTRIBUTE_UNUSED
;
565 if (!bfd_family_coff (bfd_asymbol_bfd (symbol
)))
566 return (coff_symbol_type
*) NULL
;
568 if (bfd_asymbol_bfd (symbol
)->tdata
.coff_obj_data
== (coff_data_type
*) NULL
)
569 return (coff_symbol_type
*) NULL
;
571 return (coff_symbol_type
*) symbol
;
575 fixup_symbol_value (abfd
, coff_symbol_ptr
, syment
)
577 coff_symbol_type
*coff_symbol_ptr
;
578 struct internal_syment
*syment
;
581 /* Normalize the symbol flags */
582 if (bfd_is_com_section (coff_symbol_ptr
->symbol
.section
))
584 /* a common symbol is undefined with a value */
585 syment
->n_scnum
= N_UNDEF
;
586 syment
->n_value
= coff_symbol_ptr
->symbol
.value
;
588 else if ((coff_symbol_ptr
->symbol
.flags
& BSF_DEBUGGING
) != 0
589 && (coff_symbol_ptr
->symbol
.flags
& BSF_DEBUGGING_RELOC
) == 0)
591 syment
->n_value
= coff_symbol_ptr
->symbol
.value
;
593 else if (bfd_is_und_section (coff_symbol_ptr
->symbol
.section
))
595 syment
->n_scnum
= N_UNDEF
;
598 /* FIXME: Do we need to handle the absolute section here? */
601 if (coff_symbol_ptr
->symbol
.section
)
604 coff_symbol_ptr
->symbol
.section
->output_section
->target_index
;
606 syment
->n_value
= (coff_symbol_ptr
->symbol
.value
607 + coff_symbol_ptr
->symbol
.section
->output_offset
);
610 syment
->n_value
+= (syment
->n_sclass
== C_STATLAB
)
611 ? coff_symbol_ptr
->symbol
.section
->output_section
->lma
612 : coff_symbol_ptr
->symbol
.section
->output_section
->vma
;
618 /* This can happen, but I don't know why yet (steve@cygnus.com) */
619 syment
->n_scnum
= N_ABS
;
620 syment
->n_value
= coff_symbol_ptr
->symbol
.value
;
625 /* Run through all the symbols in the symbol table and work out what
626 their indexes into the symbol table will be when output.
628 Coff requires that each C_FILE symbol points to the next one in the
629 chain, and that the last one points to the first external symbol. We
633 coff_renumber_symbols (bfd_ptr
, first_undef
)
637 unsigned int symbol_count
= bfd_get_symcount (bfd_ptr
);
638 asymbol
**symbol_ptr_ptr
= bfd_ptr
->outsymbols
;
639 unsigned int native_index
= 0;
640 struct internal_syment
*last_file
= (struct internal_syment
*) NULL
;
641 unsigned int symbol_index
;
643 /* COFF demands that undefined symbols come after all other symbols.
644 Since we don't need to impose this extra knowledge on all our
645 client programs, deal with that here. Sort the symbol table;
646 just move the undefined symbols to the end, leaving the rest
647 alone. The O'Reilly book says that defined global symbols come
648 at the end before the undefined symbols, so we do that here as
650 /* @@ Do we have some condition we could test for, so we don't always
651 have to do this? I don't think relocatability is quite right, but
652 I'm not certain. [raeburn:19920508.1711EST] */
657 newsyms
= (asymbol
**) bfd_alloc (bfd_ptr
,
658 sizeof (asymbol
*) * (symbol_count
+ 1));
661 bfd_ptr
->outsymbols
= newsyms
;
662 for (i
= 0; i
< symbol_count
; i
++)
663 if ((symbol_ptr_ptr
[i
]->flags
& BSF_NOT_AT_END
) != 0
664 || (!bfd_is_und_section (symbol_ptr_ptr
[i
]->section
)
665 && !bfd_is_com_section (symbol_ptr_ptr
[i
]->section
)
666 && ((symbol_ptr_ptr
[i
]->flags
& BSF_FUNCTION
) != 0
667 || ((symbol_ptr_ptr
[i
]->flags
& (BSF_GLOBAL
| BSF_WEAK
))
669 *newsyms
++ = symbol_ptr_ptr
[i
];
671 for (i
= 0; i
< symbol_count
; i
++)
672 if ((symbol_ptr_ptr
[i
]->flags
& BSF_NOT_AT_END
) == 0
673 && !bfd_is_und_section (symbol_ptr_ptr
[i
]->section
)
674 && (bfd_is_com_section (symbol_ptr_ptr
[i
]->section
)
675 || ((symbol_ptr_ptr
[i
]->flags
& BSF_FUNCTION
) == 0
676 && ((symbol_ptr_ptr
[i
]->flags
& (BSF_GLOBAL
| BSF_WEAK
))
678 *newsyms
++ = symbol_ptr_ptr
[i
];
680 *first_undef
= newsyms
- bfd_ptr
->outsymbols
;
682 for (i
= 0; i
< symbol_count
; i
++)
683 if ((symbol_ptr_ptr
[i
]->flags
& BSF_NOT_AT_END
) == 0
684 && bfd_is_und_section (symbol_ptr_ptr
[i
]->section
))
685 *newsyms
++ = symbol_ptr_ptr
[i
];
686 *newsyms
= (asymbol
*) NULL
;
687 symbol_ptr_ptr
= bfd_ptr
->outsymbols
;
690 for (symbol_index
= 0; symbol_index
< symbol_count
; symbol_index
++)
692 coff_symbol_type
*coff_symbol_ptr
= coff_symbol_from (bfd_ptr
, symbol_ptr_ptr
[symbol_index
]);
693 symbol_ptr_ptr
[symbol_index
]->udata
.i
= symbol_index
;
694 if (coff_symbol_ptr
&& coff_symbol_ptr
->native
)
696 combined_entry_type
*s
= coff_symbol_ptr
->native
;
699 if (s
->u
.syment
.n_sclass
== C_FILE
)
701 if (last_file
!= (struct internal_syment
*) NULL
)
702 last_file
->n_value
= native_index
;
703 last_file
= &(s
->u
.syment
);
708 /* Modify the symbol values according to their section and
711 fixup_symbol_value (bfd_ptr
, coff_symbol_ptr
, &(s
->u
.syment
));
713 for (i
= 0; i
< s
->u
.syment
.n_numaux
+ 1; i
++)
714 s
[i
].offset
= native_index
++;
721 obj_conv_table_size (bfd_ptr
) = native_index
;
726 /* Run thorough the symbol table again, and fix it so that all
727 pointers to entries are changed to the entries' index in the output
731 coff_mangle_symbols (bfd_ptr
)
734 unsigned int symbol_count
= bfd_get_symcount (bfd_ptr
);
735 asymbol
**symbol_ptr_ptr
= bfd_ptr
->outsymbols
;
736 unsigned int symbol_index
;
738 for (symbol_index
= 0; symbol_index
< symbol_count
; symbol_index
++)
740 coff_symbol_type
*coff_symbol_ptr
=
741 coff_symbol_from (bfd_ptr
, symbol_ptr_ptr
[symbol_index
]);
743 if (coff_symbol_ptr
&& coff_symbol_ptr
->native
)
746 combined_entry_type
*s
= coff_symbol_ptr
->native
;
750 /* FIXME: We should use a union here. */
751 s
->u
.syment
.n_value
=
752 ((combined_entry_type
*) s
->u
.syment
.n_value
)->offset
;
757 /* The value is the offset into the line number entries
758 for the symbol's section. On output, the symbol's
759 section should be N_DEBUG. */
760 s
->u
.syment
.n_value
=
761 (coff_symbol_ptr
->symbol
.section
->output_section
->line_filepos
762 + s
->u
.syment
.n_value
* bfd_coff_linesz (bfd_ptr
));
763 coff_symbol_ptr
->symbol
.section
=
764 coff_section_from_bfd_index (bfd_ptr
, N_DEBUG
);
765 BFD_ASSERT (coff_symbol_ptr
->symbol
.flags
& BSF_DEBUGGING
);
767 for (i
= 0; i
< s
->u
.syment
.n_numaux
; i
++)
769 combined_entry_type
*a
= s
+ i
+ 1;
772 a
->u
.auxent
.x_sym
.x_tagndx
.l
=
773 a
->u
.auxent
.x_sym
.x_tagndx
.p
->offset
;
778 a
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
=
779 a
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
->offset
;
784 a
->u
.auxent
.x_csect
.x_scnlen
.l
=
785 a
->u
.auxent
.x_csect
.x_scnlen
.p
->offset
;
794 coff_fix_symbol_name (abfd
, symbol
, native
, string_size_p
,
795 debug_string_section_p
, debug_string_size_p
)
798 combined_entry_type
*native
;
799 bfd_size_type
*string_size_p
;
800 asection
**debug_string_section_p
;
801 bfd_size_type
*debug_string_size_p
;
803 unsigned int name_length
;
804 union internal_auxent
*auxent
;
805 char *name
= (char *) (symbol
->name
);
807 if (name
== (char *) NULL
)
809 /* coff symbols always have names, so we'll make one up */
810 symbol
->name
= "strange";
811 name
= (char *) symbol
->name
;
813 name_length
= strlen (name
);
815 if (native
->u
.syment
.n_sclass
== C_FILE
816 && native
->u
.syment
.n_numaux
> 0)
818 unsigned int filnmlen
;
820 if (bfd_coff_force_symnames_in_strings (abfd
))
822 native
->u
.syment
._n
._n_n
._n_offset
=
823 (*string_size_p
+ STRING_SIZE_SIZE
);
824 native
->u
.syment
._n
._n_n
._n_zeroes
= 0;
825 *string_size_p
+= 6; /* strlen(".file") + 1 */
828 strncpy (native
->u
.syment
._n
._n_name
, ".file", SYMNMLEN
);
830 auxent
= &(native
+ 1)->u
.auxent
;
832 filnmlen
= bfd_coff_filnmlen (abfd
);
834 if (bfd_coff_long_filenames (abfd
))
836 if (name_length
<= filnmlen
)
838 strncpy (auxent
->x_file
.x_fname
, name
, filnmlen
);
842 auxent
->x_file
.x_n
.x_offset
= *string_size_p
+ STRING_SIZE_SIZE
;
843 auxent
->x_file
.x_n
.x_zeroes
= 0;
844 *string_size_p
+= name_length
+ 1;
849 strncpy (auxent
->x_file
.x_fname
, name
, filnmlen
);
850 if (name_length
> filnmlen
)
851 name
[filnmlen
] = '\0';
856 if (name_length
<= SYMNMLEN
&& !bfd_coff_force_symnames_in_strings (abfd
))
858 /* This name will fit into the symbol neatly */
859 strncpy (native
->u
.syment
._n
._n_name
, symbol
->name
, SYMNMLEN
);
861 else if (!bfd_coff_symname_in_debug (abfd
, &native
->u
.syment
))
863 native
->u
.syment
._n
._n_n
._n_offset
= (*string_size_p
865 native
->u
.syment
._n
._n_n
._n_zeroes
= 0;
866 *string_size_p
+= name_length
+ 1;
872 int prefix_len
= bfd_coff_debug_string_prefix_length (abfd
);
874 /* This name should be written into the .debug section. For
875 some reason each name is preceded by a two byte length
876 and also followed by a null byte. FIXME: We assume that
877 the .debug section has already been created, and that it
879 if (*debug_string_section_p
== (asection
*) NULL
)
880 *debug_string_section_p
= bfd_get_section_by_name (abfd
, ".debug");
881 filepos
= bfd_tell (abfd
);
883 bfd_put_32 (abfd
, name_length
+ 1, buf
);
885 bfd_put_16 (abfd
, name_length
+ 1, buf
);
887 if (!bfd_set_section_contents (abfd
,
888 *debug_string_section_p
,
890 (file_ptr
) *debug_string_size_p
,
891 (bfd_size_type
) prefix_len
)
892 || !bfd_set_section_contents (abfd
,
893 *debug_string_section_p
,
895 ((file_ptr
) *debug_string_size_p
897 (bfd_size_type
) name_length
+ 1))
899 if (bfd_seek (abfd
, filepos
, SEEK_SET
) != 0)
901 native
->u
.syment
._n
._n_n
._n_offset
=
902 *debug_string_size_p
+ prefix_len
;
903 native
->u
.syment
._n
._n_n
._n_zeroes
= 0;
904 *debug_string_size_p
+= name_length
+ 1 + prefix_len
;
909 /* We need to keep track of the symbol index so that when we write out
910 the relocs we can get the index for a symbol. This method is a
913 #define set_index(symbol, idx) ((symbol)->udata.i = (idx))
915 /* Write a symbol out to a COFF file. */
918 coff_write_symbol (abfd
, symbol
, native
, written
, string_size_p
,
919 debug_string_section_p
, debug_string_size_p
)
922 combined_entry_type
*native
;
923 unsigned int *written
;
924 bfd_size_type
*string_size_p
;
925 asection
**debug_string_section_p
;
926 bfd_size_type
*debug_string_size_p
;
928 unsigned int numaux
= native
->u
.syment
.n_numaux
;
929 int type
= native
->u
.syment
.n_type
;
930 int class = native
->u
.syment
.n_sclass
;
932 bfd_size_type symesz
;
934 if (native
->u
.syment
.n_sclass
== C_FILE
)
935 symbol
->flags
|= BSF_DEBUGGING
;
937 if (symbol
->flags
& BSF_DEBUGGING
938 && bfd_is_abs_section (symbol
->section
))
940 native
->u
.syment
.n_scnum
= N_DEBUG
;
942 else if (bfd_is_abs_section (symbol
->section
))
944 native
->u
.syment
.n_scnum
= N_ABS
;
946 else if (bfd_is_und_section (symbol
->section
))
948 native
->u
.syment
.n_scnum
= N_UNDEF
;
952 native
->u
.syment
.n_scnum
=
953 symbol
->section
->output_section
->target_index
;
956 coff_fix_symbol_name (abfd
, symbol
, native
, string_size_p
,
957 debug_string_section_p
, debug_string_size_p
);
959 symesz
= bfd_coff_symesz (abfd
);
960 buf
= bfd_alloc (abfd
, symesz
);
963 bfd_coff_swap_sym_out (abfd
, &native
->u
.syment
, buf
);
964 if (bfd_write (buf
, 1, symesz
, abfd
) != symesz
)
966 bfd_release (abfd
, buf
);
968 if (native
->u
.syment
.n_numaux
> 0)
970 bfd_size_type auxesz
;
973 auxesz
= bfd_coff_auxesz (abfd
);
974 buf
= bfd_alloc (abfd
, auxesz
);
977 for (j
= 0; j
< native
->u
.syment
.n_numaux
; j
++)
979 bfd_coff_swap_aux_out (abfd
,
980 &((native
+ j
+ 1)->u
.auxent
),
984 native
->u
.syment
.n_numaux
,
986 if (bfd_write (buf
, 1, auxesz
, abfd
) != auxesz
)
989 bfd_release (abfd
, buf
);
992 /* Store the index for use when we write out the relocs. */
993 set_index (symbol
, *written
);
995 *written
+= numaux
+ 1;
999 /* Write out a symbol to a COFF file that does not come from a COFF
1000 file originally. This symbol may have been created by the linker,
1001 or we may be linking a non COFF file to a COFF file. */
1004 coff_write_alien_symbol (abfd
, symbol
, written
, string_size_p
,
1005 debug_string_section_p
, debug_string_size_p
)
1008 unsigned int *written
;
1009 bfd_size_type
*string_size_p
;
1010 asection
**debug_string_section_p
;
1011 bfd_size_type
*debug_string_size_p
;
1013 combined_entry_type
*native
;
1014 combined_entry_type dummy
;
1017 native
->u
.syment
.n_type
= T_NULL
;
1018 native
->u
.syment
.n_flags
= 0;
1019 if (bfd_is_und_section (symbol
->section
))
1021 native
->u
.syment
.n_scnum
= N_UNDEF
;
1022 native
->u
.syment
.n_value
= symbol
->value
;
1024 else if (bfd_is_com_section (symbol
->section
))
1026 native
->u
.syment
.n_scnum
= N_UNDEF
;
1027 native
->u
.syment
.n_value
= symbol
->value
;
1029 else if (symbol
->flags
& BSF_DEBUGGING
)
1031 /* There isn't much point to writing out a debugging symbol
1032 unless we are prepared to convert it into COFF debugging
1033 format. So, we just ignore them. We must clobber the symbol
1034 name to keep it from being put in the string table. */
1040 native
->u
.syment
.n_scnum
=
1041 symbol
->section
->output_section
->target_index
;
1042 native
->u
.syment
.n_value
= (symbol
->value
1043 + symbol
->section
->output_offset
);
1044 if (! obj_pe (abfd
))
1045 native
->u
.syment
.n_value
+= symbol
->section
->output_section
->vma
;
1047 /* Copy the any flags from the the file header into the symbol.
1050 coff_symbol_type
*c
= coff_symbol_from (abfd
, symbol
);
1051 if (c
!= (coff_symbol_type
*) NULL
)
1052 native
->u
.syment
.n_flags
= bfd_asymbol_bfd (&c
->symbol
)->flags
;
1056 native
->u
.syment
.n_type
= 0;
1057 if (symbol
->flags
& BSF_LOCAL
)
1058 native
->u
.syment
.n_sclass
= C_STAT
;
1059 else if (symbol
->flags
& BSF_WEAK
)
1060 native
->u
.syment
.n_sclass
= obj_pe (abfd
) ? C_NT_WEAK
: C_WEAKEXT
;
1062 native
->u
.syment
.n_sclass
= C_EXT
;
1063 native
->u
.syment
.n_numaux
= 0;
1065 return coff_write_symbol (abfd
, symbol
, native
, written
, string_size_p
,
1066 debug_string_section_p
, debug_string_size_p
);
1069 /* Write a native symbol to a COFF file. */
1072 coff_write_native_symbol (abfd
, symbol
, written
, string_size_p
,
1073 debug_string_section_p
, debug_string_size_p
)
1075 coff_symbol_type
*symbol
;
1076 unsigned int *written
;
1077 bfd_size_type
*string_size_p
;
1078 asection
**debug_string_section_p
;
1079 bfd_size_type
*debug_string_size_p
;
1081 combined_entry_type
*native
= symbol
->native
;
1082 alent
*lineno
= symbol
->lineno
;
1084 /* If this symbol has an associated line number, we must store the
1085 symbol index in the line number field. We also tag the auxent to
1086 point to the right place in the lineno table. */
1087 if (lineno
&& !symbol
->done_lineno
&& symbol
->symbol
.section
->owner
!= NULL
)
1089 unsigned int count
= 0;
1090 lineno
[count
].u
.offset
= *written
;
1091 if (native
->u
.syment
.n_numaux
)
1093 union internal_auxent
*a
= &((native
+ 1)->u
.auxent
);
1095 a
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
=
1096 symbol
->symbol
.section
->output_section
->moving_line_filepos
;
1099 /* Count and relocate all other linenumbers. */
1101 while (lineno
[count
].line_number
!= 0)
1105 I've been told this, but still need proof:
1106 > The second bug is also in `bfd/coffcode.h'. This bug
1107 > causes the linker to screw up the pc-relocations for
1108 > all the line numbers in COFF code. This bug isn't only
1109 > specific to A29K implementations, but affects all
1110 > systems using COFF format binaries. Note that in COFF
1111 > object files, the line number core offsets output by
1112 > the assembler are relative to the start of each
1113 > procedure, not to the start of the .text section. This
1114 > patch relocates the line numbers relative to the
1115 > `native->u.syment.n_value' instead of the section
1117 > modular!olson@cs.arizona.edu (Jon Olson)
1119 lineno
[count
].u
.offset
+= native
->u
.syment
.n_value
;
1121 lineno
[count
].u
.offset
+=
1122 (symbol
->symbol
.section
->output_section
->vma
1123 + symbol
->symbol
.section
->output_offset
);
1127 symbol
->done_lineno
= true;
1129 symbol
->symbol
.section
->output_section
->moving_line_filepos
+=
1130 count
* bfd_coff_linesz (abfd
);
1133 return coff_write_symbol (abfd
, &(symbol
->symbol
), native
, written
,
1134 string_size_p
, debug_string_section_p
,
1135 debug_string_size_p
);
1138 /* Write out the COFF symbols. */
1141 coff_write_symbols (abfd
)
1144 bfd_size_type string_size
;
1145 asection
*debug_string_section
;
1146 bfd_size_type debug_string_size
;
1148 unsigned int limit
= bfd_get_symcount (abfd
);
1149 unsigned int written
= 0;
1153 debug_string_section
= NULL
;
1154 debug_string_size
= 0;
1156 /* If this target supports long section names, they must be put into
1157 the string table. This is supported by PE. This code must
1158 handle section names just as they are handled in
1159 coff_write_object_contents. */
1160 if (bfd_coff_long_section_names (abfd
))
1164 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
1168 len
= strlen (o
->name
);
1170 string_size
+= len
+ 1;
1174 /* Seek to the right place */
1175 if (bfd_seek (abfd
, obj_sym_filepos (abfd
), SEEK_SET
) != 0)
1178 /* Output all the symbols we have */
1181 for (p
= abfd
->outsymbols
, i
= 0; i
< limit
; i
++, p
++)
1183 asymbol
*symbol
= *p
;
1184 coff_symbol_type
*c_symbol
= coff_symbol_from (abfd
, symbol
);
1186 if (c_symbol
== (coff_symbol_type
*) NULL
1187 || c_symbol
->native
== (combined_entry_type
*) NULL
)
1189 if (!coff_write_alien_symbol (abfd
, symbol
, &written
, &string_size
,
1190 &debug_string_section
,
1191 &debug_string_size
))
1196 if (!coff_write_native_symbol (abfd
, c_symbol
, &written
,
1197 &string_size
, &debug_string_section
,
1198 &debug_string_size
))
1203 obj_raw_syment_count (abfd
) = written
;
1205 /* Now write out strings */
1207 if (string_size
!= 0)
1209 unsigned int size
= string_size
+ STRING_SIZE_SIZE
;
1210 bfd_byte buffer
[STRING_SIZE_SIZE
];
1212 #if STRING_SIZE_SIZE == 4
1213 bfd_h_put_32 (abfd
, size
, buffer
);
1215 #error Change bfd_h_put_32
1217 if (bfd_write ((PTR
) buffer
, 1, sizeof (buffer
), abfd
) != sizeof (buffer
))
1220 /* Handle long section names. This code must handle section
1221 names just as they are handled in coff_write_object_contents. */
1222 if (bfd_coff_long_section_names (abfd
))
1226 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
1230 len
= strlen (o
->name
);
1233 if (bfd_write (o
->name
, 1, len
+ 1, abfd
) != len
+ 1)
1239 for (p
= abfd
->outsymbols
, i
= 0;
1244 size_t name_length
= strlen (q
->name
);
1245 coff_symbol_type
*c_symbol
= coff_symbol_from (abfd
, q
);
1248 /* Figure out whether the symbol name should go in the string
1249 table. Symbol names that are short enough are stored
1250 directly in the syment structure. File names permit a
1251 different, longer, length in the syment structure. On
1252 XCOFF, some symbol names are stored in the .debug section
1253 rather than in the string table. */
1255 if (c_symbol
== NULL
1256 || c_symbol
->native
== NULL
)
1258 /* This is not a COFF symbol, so it certainly is not a
1259 file name, nor does it go in the .debug section. */
1260 maxlen
= bfd_coff_force_symnames_in_strings (abfd
) ? 0 : SYMNMLEN
;
1262 else if (bfd_coff_symname_in_debug (abfd
,
1263 &c_symbol
->native
->u
.syment
))
1265 /* This symbol name is in the XCOFF .debug section.
1266 Don't write it into the string table. */
1267 maxlen
= name_length
;
1269 else if (c_symbol
->native
->u
.syment
.n_sclass
== C_FILE
1270 && c_symbol
->native
->u
.syment
.n_numaux
> 0)
1272 if (bfd_coff_force_symnames_in_strings (abfd
))
1273 bfd_write (".file", 1, 6, abfd
);
1274 maxlen
= bfd_coff_filnmlen (abfd
);
1277 maxlen
= bfd_coff_force_symnames_in_strings (abfd
) ? 0 : SYMNMLEN
;
1279 if (name_length
> maxlen
)
1281 if (bfd_write ((PTR
) (q
->name
), 1, name_length
+ 1, abfd
)
1289 /* We would normally not write anything here, but we'll write
1290 out 4 so that any stupid coff reader which tries to read the
1291 string table even when there isn't one won't croak. */
1292 unsigned int size
= STRING_SIZE_SIZE
;
1293 bfd_byte buffer
[STRING_SIZE_SIZE
];
1295 #if STRING_SIZE_SIZE == 4
1296 bfd_h_put_32 (abfd
, size
, buffer
);
1298 #error Change bfd_h_put_32
1300 if (bfd_write ((PTR
) buffer
, 1, STRING_SIZE_SIZE
, abfd
)
1301 != STRING_SIZE_SIZE
)
1305 /* Make sure the .debug section was created to be the correct size.
1306 We should create it ourselves on the fly, but we don't because
1307 BFD won't let us write to any section until we know how large all
1308 the sections are. We could still do it by making another pass
1309 over the symbols. FIXME. */
1310 BFD_ASSERT (debug_string_size
== 0
1311 || (debug_string_section
!= (asection
*) NULL
1312 && (BFD_ALIGN (debug_string_size
,
1313 1 << debug_string_section
->alignment_power
)
1314 == bfd_section_size (abfd
, debug_string_section
))));
1320 coff_write_linenumbers (abfd
)
1324 bfd_size_type linesz
;
1327 linesz
= bfd_coff_linesz (abfd
);
1328 buff
= bfd_alloc (abfd
, linesz
);
1331 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
1333 if (s
->lineno_count
)
1335 asymbol
**q
= abfd
->outsymbols
;
1336 if (bfd_seek (abfd
, s
->line_filepos
, SEEK_SET
) != 0)
1338 /* Find all the linenumbers in this section */
1342 if (p
->section
->output_section
== s
)
1345 BFD_SEND (bfd_asymbol_bfd (p
), _get_lineno
,
1346 (bfd_asymbol_bfd (p
), p
));
1349 /* Found a linenumber entry, output */
1350 struct internal_lineno out
;
1351 memset ((PTR
) & out
, 0, sizeof (out
));
1353 out
.l_addr
.l_symndx
= l
->u
.offset
;
1354 bfd_coff_swap_lineno_out (abfd
, &out
, buff
);
1355 if (bfd_write (buff
, 1, linesz
, abfd
) != linesz
)
1358 while (l
->line_number
)
1360 out
.l_lnno
= l
->line_number
;
1361 out
.l_addr
.l_symndx
= l
->u
.offset
;
1362 bfd_coff_swap_lineno_out (abfd
, &out
, buff
);
1363 if (bfd_write (buff
, 1, linesz
, abfd
) != linesz
)
1373 bfd_release (abfd
, buff
);
1378 coff_get_lineno (ignore_abfd
, symbol
)
1379 bfd
*ignore_abfd ATTRIBUTE_UNUSED
;
1382 return coffsymbol (symbol
)->lineno
;
1387 /* This is only called from coff_add_missing_symbols, which has been
1391 coff_section_symbol (abfd
, name
)
1395 asection
*sec
= bfd_make_section_old_way (abfd
, name
);
1397 combined_entry_type
*csym
;
1400 csym
= coff_symbol_from (abfd
, sym
)->native
;
1401 /* Make sure back-end COFF stuff is there. */
1406 coff_symbol_type sym
;
1407 /* @@FIXME This shouldn't use a fixed size!! */
1408 combined_entry_type e
[10];
1411 f
= (struct foo
*) bfd_alloc (abfd
, sizeof (*f
));
1414 bfd_set_error (bfd_error_no_error
);
1417 memset ((char *) f
, 0, sizeof (*f
));
1418 coff_symbol_from (abfd
, sym
)->native
= csym
= f
->e
;
1420 csym
[0].u
.syment
.n_sclass
= C_STAT
;
1421 csym
[0].u
.syment
.n_numaux
= 1;
1422 /* SF_SET_STATICS (sym); @@ ??? */
1423 csym
[1].u
.auxent
.x_scn
.x_scnlen
= sec
->_raw_size
;
1424 csym
[1].u
.auxent
.x_scn
.x_nreloc
= sec
->reloc_count
;
1425 csym
[1].u
.auxent
.x_scn
.x_nlinno
= sec
->lineno_count
;
1427 if (sec
->output_section
== NULL
)
1429 sec
->output_section
= sec
;
1430 sec
->output_offset
= 0;
1438 /* This function transforms the offsets into the symbol table into
1439 pointers to syments. */
1442 coff_pointerize_aux (abfd
, table_base
, symbol
, indaux
, auxent
)
1444 combined_entry_type
*table_base
;
1445 combined_entry_type
*symbol
;
1446 unsigned int indaux
;
1447 combined_entry_type
*auxent
;
1449 unsigned int type
= symbol
->u
.syment
.n_type
;
1450 unsigned int class = symbol
->u
.syment
.n_sclass
;
1452 if (coff_backend_info (abfd
)->_bfd_coff_pointerize_aux_hook
)
1454 if ((*coff_backend_info (abfd
)->_bfd_coff_pointerize_aux_hook
)
1455 (abfd
, table_base
, symbol
, indaux
, auxent
))
1459 /* Don't bother if this is a file or a section */
1460 if (class == C_STAT
&& type
== T_NULL
)
1462 if (class == C_FILE
)
1465 /* Otherwise patch up */
1466 #define N_TMASK coff_data (abfd)->local_n_tmask
1467 #define N_BTSHFT coff_data (abfd)->local_n_btshft
1468 if ((ISFCN (type
) || ISTAG (class) || class == C_BLOCK
|| class == C_FCN
)
1469 && auxent
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
> 0)
1471 auxent
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
=
1472 table_base
+ auxent
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
;
1473 auxent
->fix_end
= 1;
1475 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1476 generate one, so we must be careful to ignore it. */
1477 if (auxent
->u
.auxent
.x_sym
.x_tagndx
.l
> 0)
1479 auxent
->u
.auxent
.x_sym
.x_tagndx
.p
=
1480 table_base
+ auxent
->u
.auxent
.x_sym
.x_tagndx
.l
;
1481 auxent
->fix_tag
= 1;
1485 /* Allocate space for the ".debug" section, and read it.
1486 We did not read the debug section until now, because
1487 we didn't want to go to the trouble until someone needed it. */
1490 build_debug_section (abfd
)
1493 char *debug_section
;
1496 asection
*sect
= bfd_get_section_by_name (abfd
, ".debug");
1500 bfd_set_error (bfd_error_no_debug_section
);
1504 debug_section
= (PTR
) bfd_alloc (abfd
,
1505 bfd_get_section_size_before_reloc (sect
));
1506 if (debug_section
== NULL
)
1509 /* Seek to the beginning of the `.debug' section and read it.
1510 Save the current position first; it is needed by our caller.
1511 Then read debug section and reset the file pointer. */
1513 position
= bfd_tell (abfd
);
1514 if (bfd_seek (abfd
, sect
->filepos
, SEEK_SET
) != 0
1515 || (bfd_read (debug_section
,
1516 bfd_get_section_size_before_reloc (sect
), 1, abfd
)
1517 != bfd_get_section_size_before_reloc (sect
))
1518 || bfd_seek (abfd
, position
, SEEK_SET
) != 0)
1520 return debug_section
;
1523 /* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1524 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1525 be \0-terminated. */
1527 copy_name (abfd
, name
, maxlen
)
1535 for (len
= 0; len
< maxlen
; ++len
)
1537 if (name
[len
] == '\0')
1543 if ((newname
= (PTR
) bfd_alloc (abfd
, len
+ 1)) == NULL
)
1545 strncpy (newname
, name
, len
);
1546 newname
[len
] = '\0';
1550 /* Read in the external symbols. */
1553 _bfd_coff_get_external_symbols (abfd
)
1556 bfd_size_type symesz
;
1560 if (obj_coff_external_syms (abfd
) != NULL
)
1563 symesz
= bfd_coff_symesz (abfd
);
1565 size
= obj_raw_syment_count (abfd
) * symesz
;
1567 syms
= (PTR
) bfd_malloc (size
);
1568 if (syms
== NULL
&& size
!= 0)
1571 if (bfd_seek (abfd
, obj_sym_filepos (abfd
), SEEK_SET
) != 0
1572 || bfd_read (syms
, size
, 1, abfd
) != size
)
1579 obj_coff_external_syms (abfd
) = syms
;
1584 /* Read in the external strings. The strings are not loaded until
1585 they are needed. This is because we have no simple way of
1586 detecting a missing string table in an archive. */
1589 _bfd_coff_read_string_table (abfd
)
1592 char extstrsize
[STRING_SIZE_SIZE
];
1596 if (obj_coff_strings (abfd
) != NULL
)
1597 return obj_coff_strings (abfd
);
1599 if (obj_sym_filepos (abfd
) == 0)
1601 bfd_set_error (bfd_error_no_symbols
);
1606 (obj_sym_filepos (abfd
)
1607 + obj_raw_syment_count (abfd
) * bfd_coff_symesz (abfd
)),
1611 if (bfd_read (extstrsize
, sizeof extstrsize
, 1, abfd
) != sizeof extstrsize
)
1613 if (bfd_get_error () != bfd_error_file_truncated
)
1616 /* There is no string table. */
1617 strsize
= STRING_SIZE_SIZE
;
1621 #if STRING_SIZE_SIZE == 4
1622 strsize
= bfd_h_get_32 (abfd
, (bfd_byte
*) extstrsize
);
1624 #error Change bfd_h_get_32
1628 if (strsize
< STRING_SIZE_SIZE
)
1630 (*_bfd_error_handler
)
1631 (_("%s: bad string table size %lu"), bfd_get_filename (abfd
),
1632 (unsigned long) strsize
);
1633 bfd_set_error (bfd_error_bad_value
);
1637 strings
= (char *) bfd_malloc (strsize
);
1638 if (strings
== NULL
)
1641 if (bfd_read (strings
+ STRING_SIZE_SIZE
,
1642 strsize
- STRING_SIZE_SIZE
, 1, abfd
)
1643 != strsize
- STRING_SIZE_SIZE
)
1649 obj_coff_strings (abfd
) = strings
;
1654 /* Free up the external symbols and strings read from a COFF file. */
1657 _bfd_coff_free_symbols (abfd
)
1660 if (obj_coff_external_syms (abfd
) != NULL
1661 && ! obj_coff_keep_syms (abfd
))
1663 free (obj_coff_external_syms (abfd
));
1664 obj_coff_external_syms (abfd
) = NULL
;
1666 if (obj_coff_strings (abfd
) != NULL
1667 && ! obj_coff_keep_strings (abfd
))
1669 free (obj_coff_strings (abfd
));
1670 obj_coff_strings (abfd
) = NULL
;
1675 /* Read a symbol table into freshly bfd_allocated memory, swap it, and
1676 knit the symbol names into a normalized form. By normalized here I
1677 mean that all symbols have an n_offset pointer that points to a null-
1678 terminated string. */
1680 combined_entry_type
*
1681 coff_get_normalized_symtab (abfd
)
1684 combined_entry_type
*internal
;
1685 combined_entry_type
*internal_ptr
;
1686 combined_entry_type
*symbol_ptr
;
1687 combined_entry_type
*internal_end
;
1688 bfd_size_type symesz
;
1691 const char *string_table
= NULL
;
1692 char *debug_section
= NULL
;
1695 if (obj_raw_syments (abfd
) != NULL
)
1696 return obj_raw_syments (abfd
);
1698 size
= obj_raw_syment_count (abfd
) * sizeof (combined_entry_type
);
1699 internal
= (combined_entry_type
*) bfd_zalloc (abfd
, size
);
1700 if (internal
== NULL
&& size
!= 0)
1702 internal_end
= internal
+ obj_raw_syment_count (abfd
);
1704 if (! _bfd_coff_get_external_symbols (abfd
))
1707 raw_src
= (char *) obj_coff_external_syms (abfd
);
1709 /* mark the end of the symbols */
1710 symesz
= bfd_coff_symesz (abfd
);
1711 raw_end
= (char *) raw_src
+ obj_raw_syment_count (abfd
) * symesz
;
1713 /* FIXME SOMEDAY. A string table size of zero is very weird, but
1714 probably possible. If one shows up, it will probably kill us. */
1716 /* Swap all the raw entries */
1717 for (internal_ptr
= internal
;
1719 raw_src
+= symesz
, internal_ptr
++)
1723 bfd_coff_swap_sym_in (abfd
, (PTR
) raw_src
,
1724 (PTR
) & internal_ptr
->u
.syment
);
1725 symbol_ptr
= internal_ptr
;
1728 i
< symbol_ptr
->u
.syment
.n_numaux
;
1733 bfd_coff_swap_aux_in (abfd
, (PTR
) raw_src
,
1734 symbol_ptr
->u
.syment
.n_type
,
1735 symbol_ptr
->u
.syment
.n_sclass
,
1736 i
, symbol_ptr
->u
.syment
.n_numaux
,
1737 &(internal_ptr
->u
.auxent
));
1738 coff_pointerize_aux (abfd
, internal
, symbol_ptr
, i
,
1743 /* Free the raw symbols, but not the strings (if we have them). */
1744 obj_coff_keep_strings (abfd
) = true;
1745 if (! _bfd_coff_free_symbols (abfd
))
1748 for (internal_ptr
= internal
; internal_ptr
< internal_end
;
1751 if (internal_ptr
->u
.syment
.n_sclass
== C_FILE
1752 && internal_ptr
->u
.syment
.n_numaux
> 0)
1754 /* make a file symbol point to the name in the auxent, since
1755 the text ".file" is redundant */
1756 if ((internal_ptr
+ 1)->u
.auxent
.x_file
.x_n
.x_zeroes
== 0)
1758 /* the filename is a long one, point into the string table */
1759 if (string_table
== NULL
)
1761 string_table
= _bfd_coff_read_string_table (abfd
);
1762 if (string_table
== NULL
)
1766 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1769 + (internal_ptr
+ 1)->u
.auxent
.x_file
.x_n
.x_offset
));
1773 /* Ordinary short filename, put into memory anyway. The
1774 Microsoft PE tools sometimes store a filename in
1775 multiple AUX entries. */
1776 if (internal_ptr
->u
.syment
.n_numaux
> 1
1777 && coff_data (abfd
)->pe
)
1779 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1782 (internal_ptr
+ 1)->u
.auxent
.x_file
.x_fname
,
1783 internal_ptr
->u
.syment
.n_numaux
* symesz
));
1787 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1790 (internal_ptr
+ 1)->u
.auxent
.x_file
.x_fname
,
1791 bfd_coff_filnmlen (abfd
)));
1797 if (internal_ptr
->u
.syment
._n
._n_n
._n_zeroes
!= 0)
1799 /* This is a "short" name. Make it long. */
1800 unsigned long i
= 0;
1801 char *newstring
= NULL
;
1803 /* find the length of this string without walking into memory
1805 for (i
= 0; i
< 8; ++i
)
1807 if (internal_ptr
->u
.syment
._n
._n_name
[i
] == '\0')
1810 } /* if end of string */
1811 } /* possible lengths of this string. */
1813 if ((newstring
= (PTR
) bfd_alloc (abfd
, ++i
)) == NULL
)
1815 memset (newstring
, 0, i
);
1816 strncpy (newstring
, internal_ptr
->u
.syment
._n
._n_name
, i
- 1);
1817 internal_ptr
->u
.syment
._n
._n_n
._n_offset
= (long int) newstring
;
1818 internal_ptr
->u
.syment
._n
._n_n
._n_zeroes
= 0;
1820 else if (internal_ptr
->u
.syment
._n
._n_n
._n_offset
== 0)
1821 internal_ptr
->u
.syment
._n
._n_n
._n_offset
= (long int) "";
1822 else if (!bfd_coff_symname_in_debug (abfd
, &internal_ptr
->u
.syment
))
1824 /* Long name already. Point symbol at the string in the
1826 if (string_table
== NULL
)
1828 string_table
= _bfd_coff_read_string_table (abfd
);
1829 if (string_table
== NULL
)
1832 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1835 + internal_ptr
->u
.syment
._n
._n_n
._n_offset
));
1839 /* Long name in debug section. Very similar. */
1840 if (debug_section
== NULL
)
1841 debug_section
= build_debug_section (abfd
);
1842 internal_ptr
->u
.syment
._n
._n_n
._n_offset
= (long int)
1843 (debug_section
+ internal_ptr
->u
.syment
._n
._n_n
._n_offset
);
1846 internal_ptr
+= internal_ptr
->u
.syment
.n_numaux
;
1849 obj_raw_syments (abfd
) = internal
;
1850 BFD_ASSERT (obj_raw_syment_count (abfd
)
1851 == (unsigned int) (internal_ptr
- internal
));
1854 } /* coff_get_normalized_symtab() */
1857 coff_get_reloc_upper_bound (abfd
, asect
)
1861 if (bfd_get_format (abfd
) != bfd_object
)
1863 bfd_set_error (bfd_error_invalid_operation
);
1866 return (asect
->reloc_count
+ 1) * sizeof (arelent
*);
1870 coff_make_empty_symbol (abfd
)
1873 coff_symbol_type
*new = (coff_symbol_type
*) bfd_alloc (abfd
, sizeof (coff_symbol_type
));
1876 memset (new, 0, sizeof *new);
1877 new->symbol
.section
= 0;
1879 new->lineno
= (alent
*) NULL
;
1880 new->done_lineno
= false;
1881 new->symbol
.the_bfd
= abfd
;
1882 return &new->symbol
;
1885 /* Make a debugging symbol. */
1888 coff_bfd_make_debug_symbol (abfd
, ptr
, sz
)
1890 PTR ptr ATTRIBUTE_UNUSED
;
1891 unsigned long sz ATTRIBUTE_UNUSED
;
1893 coff_symbol_type
*new = (coff_symbol_type
*) bfd_alloc (abfd
, sizeof (coff_symbol_type
));
1896 /* @@ The 10 is a guess at a plausible maximum number of aux entries
1897 (but shouldn't be a constant). */
1898 new->native
= (combined_entry_type
*) bfd_zalloc (abfd
, sizeof (combined_entry_type
) * 10);
1901 new->symbol
.section
= bfd_abs_section_ptr
;
1902 new->symbol
.flags
= BSF_DEBUGGING
;
1903 new->lineno
= (alent
*) NULL
;
1904 new->done_lineno
= false;
1905 new->symbol
.the_bfd
= abfd
;
1906 return &new->symbol
;
1910 coff_get_symbol_info (abfd
, symbol
, ret
)
1915 bfd_symbol_info (symbol
, ret
);
1916 if (coffsymbol (symbol
)->native
!= NULL
1917 && coffsymbol (symbol
)->native
->fix_value
)
1919 combined_entry_type
*psym
;
1921 psym
= ((combined_entry_type
*)
1922 coffsymbol (symbol
)->native
->u
.syment
.n_value
);
1923 ret
->value
= (bfd_vma
) (psym
- obj_raw_syments (abfd
));
1927 /* Return the COFF syment for a symbol. */
1930 bfd_coff_get_syment (abfd
, symbol
, psyment
)
1933 struct internal_syment
*psyment
;
1935 coff_symbol_type
*csym
;
1937 csym
= coff_symbol_from (abfd
, symbol
);
1938 if (csym
== NULL
|| csym
->native
== NULL
)
1940 bfd_set_error (bfd_error_invalid_operation
);
1944 *psyment
= csym
->native
->u
.syment
;
1946 if (csym
->native
->fix_value
)
1947 psyment
->n_value
= ((combined_entry_type
*) psyment
->n_value
1948 - obj_raw_syments (abfd
));
1950 /* FIXME: We should handle fix_line here. */
1955 /* Return the COFF auxent for a symbol. */
1958 bfd_coff_get_auxent (abfd
, symbol
, indx
, pauxent
)
1962 union internal_auxent
*pauxent
;
1964 coff_symbol_type
*csym
;
1965 combined_entry_type
*ent
;
1967 csym
= coff_symbol_from (abfd
, symbol
);
1970 || csym
->native
== NULL
1971 || indx
>= csym
->native
->u
.syment
.n_numaux
)
1973 bfd_set_error (bfd_error_invalid_operation
);
1977 ent
= csym
->native
+ indx
+ 1;
1979 *pauxent
= ent
->u
.auxent
;
1982 pauxent
->x_sym
.x_tagndx
.l
=
1983 ((combined_entry_type
*) pauxent
->x_sym
.x_tagndx
.p
1984 - obj_raw_syments (abfd
));
1987 pauxent
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
=
1988 ((combined_entry_type
*) pauxent
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
1989 - obj_raw_syments (abfd
));
1991 if (ent
->fix_scnlen
)
1992 pauxent
->x_csect
.x_scnlen
.l
=
1993 ((combined_entry_type
*) pauxent
->x_csect
.x_scnlen
.p
1994 - obj_raw_syments (abfd
));
1999 /* Print out information about COFF symbol. */
2002 coff_print_symbol (abfd
, filep
, symbol
, how
)
2006 bfd_print_symbol_type how
;
2008 FILE *file
= (FILE *) filep
;
2012 case bfd_print_symbol_name
:
2013 fprintf (file
, "%s", symbol
->name
);
2016 case bfd_print_symbol_more
:
2017 fprintf (file
, "coff %s %s",
2018 coffsymbol (symbol
)->native
? "n" : "g",
2019 coffsymbol (symbol
)->lineno
? "l" : " ");
2022 case bfd_print_symbol_all
:
2023 if (coffsymbol (symbol
)->native
)
2027 combined_entry_type
*combined
= coffsymbol (symbol
)->native
;
2028 combined_entry_type
*root
= obj_raw_syments (abfd
);
2029 struct lineno_cache_entry
*l
= coffsymbol (symbol
)->lineno
;
2031 fprintf (file
, "[%3ld]", (long) (combined
- root
));
2033 if (! combined
->fix_value
)
2034 val
= (unsigned long) combined
->u
.syment
.n_value
;
2036 val
= ((unsigned long)
2037 ((combined_entry_type
*) combined
->u
.syment
.n_value
2041 "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x%08lx %s",
2042 combined
->u
.syment
.n_scnum
,
2043 combined
->u
.syment
.n_flags
,
2044 combined
->u
.syment
.n_type
,
2045 combined
->u
.syment
.n_sclass
,
2046 combined
->u
.syment
.n_numaux
,
2050 for (aux
= 0; aux
< combined
->u
.syment
.n_numaux
; aux
++)
2052 combined_entry_type
*auxp
= combined
+ aux
+ 1;
2056 tagndx
= auxp
->u
.auxent
.x_sym
.x_tagndx
.p
- root
;
2058 tagndx
= auxp
->u
.auxent
.x_sym
.x_tagndx
.l
;
2060 fprintf (file
, "\n");
2062 if (bfd_coff_print_aux (abfd
, file
, root
, combined
, auxp
, aux
))
2065 switch (combined
->u
.syment
.n_sclass
)
2068 fprintf (file
, "File ");
2072 if (combined
->u
.syment
.n_type
== T_NULL
)
2073 /* probably a section symbol? */
2075 fprintf (file
, "AUX scnlen 0x%lx nreloc %d nlnno %d",
2076 (long) auxp
->u
.auxent
.x_scn
.x_scnlen
,
2077 auxp
->u
.auxent
.x_scn
.x_nreloc
,
2078 auxp
->u
.auxent
.x_scn
.x_nlinno
);
2079 if (auxp
->u
.auxent
.x_scn
.x_checksum
!= 0
2080 || auxp
->u
.auxent
.x_scn
.x_associated
!= 0
2081 || auxp
->u
.auxent
.x_scn
.x_comdat
!= 0)
2082 fprintf (file
, " checksum 0x%lx assoc %d comdat %d",
2083 auxp
->u
.auxent
.x_scn
.x_checksum
,
2084 auxp
->u
.auxent
.x_scn
.x_associated
,
2085 auxp
->u
.auxent
.x_scn
.x_comdat
);
2088 /* else fall through */
2090 if (ISFCN (combined
->u
.syment
.n_type
))
2093 _("AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld"),
2095 auxp
->u
.auxent
.x_sym
.x_misc
.x_fsize
,
2096 auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
,
2099 (auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
2101 : auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
));
2104 /* else fall through */
2106 fprintf (file
, "AUX lnno %d size 0x%x tagndx %ld",
2107 auxp
->u
.auxent
.x_sym
.x_misc
.x_lnsz
.x_lnno
,
2108 auxp
->u
.auxent
.x_sym
.x_misc
.x_lnsz
.x_size
,
2111 fprintf (file
, " endndx %ld",
2113 (auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
2121 fprintf (file
, "\n%s :", l
->u
.sym
->name
);
2123 while (l
->line_number
)
2125 fprintf (file
, "\n%4d : 0x%lx",
2128 (l
->u
.offset
+ symbol
->section
->vma
)));
2135 bfd_print_symbol_vandf ((PTR
) file
, symbol
);
2136 fprintf (file
, " %-5s %s %s %s",
2137 symbol
->section
->name
,
2138 coffsymbol (symbol
)->native
? "n" : "g",
2139 coffsymbol (symbol
)->lineno
? "l" : " ",
2145 /* Return whether a symbol name implies a local symbol. In COFF,
2146 local symbols generally start with ``.L''. Most targets use this
2147 function for the is_local_label_name entry point, but some may
2151 _bfd_coff_is_local_label_name (abfd
, name
)
2152 bfd
*abfd ATTRIBUTE_UNUSED
;
2155 return name
[0] == '.' && name
[1] == 'L';
2158 /* Provided a BFD, a section and an offset (in bytes, not octets) into the
2159 section, calculate and return the name of the source file and the line
2160 nearest to the wanted location. */
2163 coff_find_nearest_line (abfd
, section
, symbols
, offset
, filename_ptr
,
2164 functionname_ptr
, line_ptr
)
2169 CONST
char **filename_ptr
;
2170 CONST
char **functionname_ptr
;
2171 unsigned int *line_ptr
;
2175 unsigned int line_base
;
2176 coff_data_type
*cof
= coff_data (abfd
);
2177 /* Run through the raw syments if available */
2178 combined_entry_type
*p
;
2179 combined_entry_type
*pend
;
2181 struct coff_section_tdata
*sec_data
;
2183 /* Before looking through the symbol table, try to use a .stab
2184 section to find the information. */
2185 if (! _bfd_stab_section_find_nearest_line (abfd
, symbols
, section
, offset
,
2186 &found
, filename_ptr
,
2187 functionname_ptr
, line_ptr
,
2188 &coff_data(abfd
)->line_info
))
2191 /* Also try examining DWARF2 debugging information. */
2192 if (_bfd_dwarf2_find_nearest_line (abfd
, section
, symbols
, offset
,
2193 filename_ptr
, functionname_ptr
,
2195 &coff_data(abfd
)->dwarf2_find_line_info
))
2202 *functionname_ptr
= 0;
2205 /* Don't try and find line numbers in a non coff file */
2206 if (!bfd_family_coff (abfd
))
2212 /* Find the first C_FILE symbol. */
2213 p
= cof
->raw_syments
;
2217 pend
= p
+ cof
->raw_syment_count
;
2220 if (p
->u
.syment
.n_sclass
== C_FILE
)
2222 p
+= 1 + p
->u
.syment
.n_numaux
;
2230 /* Look through the C_FILE symbols to find the best one. */
2231 sec_vma
= bfd_get_section_vma (abfd
, section
);
2232 *filename_ptr
= (char *) p
->u
.syment
._n
._n_n
._n_offset
;
2233 maxdiff
= (bfd_vma
) 0 - (bfd_vma
) 1;
2236 combined_entry_type
*p2
;
2238 for (p2
= p
+ 1 + p
->u
.syment
.n_numaux
;
2240 p2
+= 1 + p2
->u
.syment
.n_numaux
)
2242 if (p2
->u
.syment
.n_scnum
> 0
2244 == coff_section_from_bfd_index (abfd
,
2245 p2
->u
.syment
.n_scnum
)))
2247 if (p2
->u
.syment
.n_sclass
== C_FILE
)
2254 /* We use <= MAXDIFF here so that if we get a zero length
2255 file, we actually use the next file entry. */
2257 && offset
+ sec_vma
>= (bfd_vma
) p2
->u
.syment
.n_value
2258 && offset
+ sec_vma
- (bfd_vma
) p2
->u
.syment
.n_value
<= maxdiff
)
2260 *filename_ptr
= (char *) p
->u
.syment
._n
._n_n
._n_offset
;
2261 maxdiff
= offset
+ sec_vma
- p2
->u
.syment
.n_value
;
2264 /* Avoid endless loops on erroneous files by ensuring that
2265 we always move forward in the file. */
2266 if (p
- cof
->raw_syments
>= p
->u
.syment
.n_value
)
2269 p
= cof
->raw_syments
+ p
->u
.syment
.n_value
;
2270 if (p
> pend
|| p
->u
.syment
.n_sclass
!= C_FILE
)
2275 /* Now wander though the raw linenumbers of the section */
2276 /* If we have been called on this section before, and the offset we
2277 want is further down then we can prime the lookup loop. */
2278 sec_data
= coff_section_data (abfd
, section
);
2279 if (sec_data
!= NULL
2281 && offset
>= sec_data
->offset
)
2284 *functionname_ptr
= sec_data
->function
;
2285 line_base
= sec_data
->line_base
;
2293 if (section
->lineno
!= NULL
)
2295 bfd_vma last_value
= 0;
2297 l
= §ion
->lineno
[i
];
2299 for (; i
< section
->lineno_count
; i
++)
2301 if (l
->line_number
== 0)
2303 /* Get the symbol this line number points at */
2304 coff_symbol_type
*coff
= (coff_symbol_type
*) (l
->u
.sym
);
2305 if (coff
->symbol
.value
> offset
)
2307 *functionname_ptr
= coff
->symbol
.name
;
2308 last_value
= coff
->symbol
.value
;
2311 combined_entry_type
*s
= coff
->native
;
2312 s
= s
+ 1 + s
->u
.syment
.n_numaux
;
2314 /* In XCOFF a debugging symbol can follow the
2316 if (s
->u
.syment
.n_scnum
== N_DEBUG
)
2317 s
= s
+ 1 + s
->u
.syment
.n_numaux
;
2319 /* S should now point to the .bf of the function. */
2320 if (s
->u
.syment
.n_numaux
)
2322 /* The linenumber is stored in the auxent. */
2323 union internal_auxent
*a
= &((s
+ 1)->u
.auxent
);
2324 line_base
= a
->x_sym
.x_misc
.x_lnsz
.x_lnno
;
2325 *line_ptr
= line_base
;
2331 if (l
->u
.offset
> offset
)
2333 *line_ptr
= l
->line_number
+ line_base
- 1;
2338 /* If we fell off the end of the loop, then assume that this
2339 symbol has no line number info. Otherwise, symbols with no
2340 line number info get reported with the line number of the
2341 last line of the last symbol which does have line number
2342 info. We use 0x100 as a slop to account for cases where the
2343 last line has executable code. */
2344 if (i
>= section
->lineno_count
2346 && offset
- last_value
> 0x100)
2348 *functionname_ptr
= NULL
;
2353 /* Cache the results for the next call. */
2354 if (sec_data
== NULL
&& section
->owner
== abfd
)
2356 section
->used_by_bfd
=
2357 ((PTR
) bfd_zalloc (abfd
,
2358 sizeof (struct coff_section_tdata
)));
2359 sec_data
= (struct coff_section_tdata
*) section
->used_by_bfd
;
2361 if (sec_data
!= NULL
)
2363 sec_data
->offset
= offset
;
2365 sec_data
->function
= *functionname_ptr
;
2366 sec_data
->line_base
= line_base
;
2373 coff_sizeof_headers (abfd
, reloc
)
2381 size
= bfd_coff_filhsz (abfd
) + bfd_coff_aoutsz (abfd
);
2385 size
= bfd_coff_filhsz (abfd
);
2388 size
+= abfd
->section_count
* bfd_coff_scnhsz (abfd
);
2392 /* Change the class of a coff symbol held by BFD. */
2394 bfd_coff_set_symbol_class (abfd
, symbol
, class)
2399 coff_symbol_type
* csym
;
2401 csym
= coff_symbol_from (abfd
, symbol
);
2404 bfd_set_error (bfd_error_invalid_operation
);
2407 else if (csym
->native
== NULL
)
2409 /* This is an alien symbol which no native coff backend data.
2410 We cheat here by creating a fake native entry for it and
2411 then filling in the class. This code is based on that in
2412 coff_write_alien_symbol(). */
2414 combined_entry_type
* native
;
2416 native
= (combined_entry_type
*) bfd_alloc (abfd
, sizeof (* native
));
2420 memset (native
, 0, sizeof (* native
));
2422 native
->u
.syment
.n_type
= T_NULL
;
2423 native
->u
.syment
.n_sclass
= class;
2425 if (bfd_is_und_section (symbol
->section
))
2427 native
->u
.syment
.n_scnum
= N_UNDEF
;
2428 native
->u
.syment
.n_value
= symbol
->value
;
2430 else if (bfd_is_com_section (symbol
->section
))
2432 native
->u
.syment
.n_scnum
= N_UNDEF
;
2433 native
->u
.syment
.n_value
= symbol
->value
;
2437 native
->u
.syment
.n_scnum
=
2438 symbol
->section
->output_section
->target_index
;
2439 native
->u
.syment
.n_value
= (symbol
->value
2440 + symbol
->section
->output_offset
);
2441 if (! obj_pe (abfd
))
2442 native
->u
.syment
.n_value
+= symbol
->section
->output_section
->vma
;
2444 /* Copy the any flags from the the file header into the symbol.
2446 native
->u
.syment
.n_flags
= bfd_asymbol_bfd (& csym
->symbol
)->flags
;
2449 csym
->native
= native
;
2453 csym
->native
->u
.syment
.n_sclass
= class;