1 /* Support for the generic parts of COFF, for BFD.
2 Copyright 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
3 2000, 2001, 2002, 2003, 2004, 2005, 2007, 2008, 2009
4 Free Software Foundation, Inc.
5 Written by Cygnus Support.
7 This file is part of BFD, the Binary File Descriptor library.
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation; either version 3 of the License, or
12 (at your option) any later version.
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
19 You should have received a copy of the GNU General Public License
20 along with this program; if not, write to the Free Software
21 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
22 MA 02110-1301, USA. */
24 /* Most of this hacked by Steve Chamberlain, sac@cygnus.com.
25 Split out of coffcode.h by Ian Taylor, ian@cygnus.com. */
27 /* This file contains COFF code that is not dependent on any
28 particular COFF target. There is only one version of this file in
29 libbfd.a, so no target specific code may be put in here. Or, to
32 ********** DO NOT PUT TARGET SPECIFIC CODE IN THIS FILE **********
34 If you need to add some target specific behaviour, add a new hook
35 function to bfd_coff_backend_data.
37 Some of these functions are also called by the ECOFF routines.
38 Those functions may not use any COFF specific information, such as
44 #include "coff/internal.h"
47 /* Take a section header read from a coff file (in HOST byte order),
48 and make a BFD "section" out of it. This is used by ECOFF. */
51 make_a_section_from_file (bfd
*abfd
,
52 struct internal_scnhdr
*hdr
,
53 unsigned int target_index
)
55 asection
*return_section
;
57 bfd_boolean result
= TRUE
;
62 /* Handle long section names as in PE. On reading, we want to
63 accept long names if the format permits them at all, regardless
64 of the current state of the flag that dictates if we would generate
65 them in outputs; this construct checks if that is the case by
66 attempting to set the flag, without changing its state; the call
67 will fail for formats that do not support long names at all. */
68 if (bfd_coff_set_long_section_names (abfd
, bfd_coff_long_section_names (abfd
))
69 && hdr
->s_name
[0] == '/')
76 memcpy (buf
, hdr
->s_name
+ 1, SCNNMLEN
- 1);
77 buf
[SCNNMLEN
- 1] = '\0';
78 strindex
= strtol (buf
, &p
, 10);
79 if (*p
== '\0' && strindex
>= 0)
81 strings
= _bfd_coff_read_string_table (abfd
);
84 /* FIXME: For extra safety, we should make sure that
85 strindex does not run us past the end, but right now we
86 don't know the length of the string table. */
88 name
= bfd_alloc (abfd
, (bfd_size_type
) strlen (strings
) + 1);
91 strcpy (name
, strings
);
97 /* Assorted wastage to null-terminate the name, thanks AT&T! */
98 name
= bfd_alloc (abfd
, (bfd_size_type
) sizeof (hdr
->s_name
) + 1);
101 strncpy (name
, (char *) &hdr
->s_name
[0], sizeof (hdr
->s_name
));
102 name
[sizeof (hdr
->s_name
)] = 0;
105 return_section
= bfd_make_section_anyway (abfd
, name
);
106 if (return_section
== NULL
)
109 return_section
->vma
= hdr
->s_vaddr
;
110 return_section
->lma
= hdr
->s_paddr
;
111 return_section
->size
= hdr
->s_size
;
112 return_section
->filepos
= hdr
->s_scnptr
;
113 return_section
->rel_filepos
= hdr
->s_relptr
;
114 return_section
->reloc_count
= hdr
->s_nreloc
;
116 bfd_coff_set_alignment_hook (abfd
, return_section
, hdr
);
118 return_section
->line_filepos
= hdr
->s_lnnoptr
;
120 return_section
->lineno_count
= hdr
->s_nlnno
;
121 return_section
->userdata
= NULL
;
122 return_section
->next
= NULL
;
123 return_section
->target_index
= target_index
;
125 if (! bfd_coff_styp_to_sec_flags_hook (abfd
, hdr
, name
, return_section
,
129 return_section
->flags
= flags
;
131 /* At least on i386-coff, the line number count for a shared library
132 section must be ignored. */
133 if ((return_section
->flags
& SEC_COFF_SHARED_LIBRARY
) != 0)
134 return_section
->lineno_count
= 0;
136 if (hdr
->s_nreloc
!= 0)
137 return_section
->flags
|= SEC_RELOC
;
138 /* FIXME: should this check 'hdr->s_size > 0'. */
139 if (hdr
->s_scnptr
!= 0)
140 return_section
->flags
|= SEC_HAS_CONTENTS
;
145 /* Read in a COFF object and make it into a BFD. This is used by
148 static const bfd_target
*
149 coff_real_object_p (bfd
*abfd
,
151 struct internal_filehdr
*internal_f
,
152 struct internal_aouthdr
*internal_a
)
154 flagword oflags
= abfd
->flags
;
155 bfd_vma ostart
= bfd_get_start_address (abfd
);
158 bfd_size_type readsize
; /* Length of file_info. */
160 char *external_sections
;
162 if (!(internal_f
->f_flags
& F_RELFLG
))
163 abfd
->flags
|= HAS_RELOC
;
164 if ((internal_f
->f_flags
& F_EXEC
))
165 abfd
->flags
|= EXEC_P
;
166 if (!(internal_f
->f_flags
& F_LNNO
))
167 abfd
->flags
|= HAS_LINENO
;
168 if (!(internal_f
->f_flags
& F_LSYMS
))
169 abfd
->flags
|= HAS_LOCALS
;
171 /* FIXME: How can we set D_PAGED correctly? */
172 if ((internal_f
->f_flags
& F_EXEC
) != 0)
173 abfd
->flags
|= D_PAGED
;
175 bfd_get_symcount (abfd
) = internal_f
->f_nsyms
;
176 if (internal_f
->f_nsyms
)
177 abfd
->flags
|= HAS_SYMS
;
179 if (internal_a
!= (struct internal_aouthdr
*) NULL
)
180 bfd_get_start_address (abfd
) = internal_a
->entry
;
182 bfd_get_start_address (abfd
) = 0;
184 /* Set up the tdata area. ECOFF uses its own routine, and overrides
186 tdata_save
= abfd
->tdata
.any
;
187 tdata
= bfd_coff_mkobject_hook (abfd
, (void *) internal_f
, (void *) internal_a
);
191 scnhsz
= bfd_coff_scnhsz (abfd
);
192 readsize
= (bfd_size_type
) nscns
* scnhsz
;
193 external_sections
= bfd_alloc (abfd
, readsize
);
194 if (!external_sections
)
197 if (bfd_bread ((void *) external_sections
, readsize
, abfd
) != readsize
)
200 /* Set the arch/mach *before* swapping in sections; section header swapping
201 may depend on arch/mach info. */
202 if (! bfd_coff_set_arch_mach_hook (abfd
, (void *) internal_f
))
205 /* Now copy data as required; construct all asections etc. */
209 for (i
= 0; i
< nscns
; i
++)
211 struct internal_scnhdr tmp
;
212 bfd_coff_swap_scnhdr_in (abfd
,
213 (void *) (external_sections
+ i
* scnhsz
),
215 if (! make_a_section_from_file (abfd
, &tmp
, i
+ 1))
223 bfd_release (abfd
, tdata
);
225 abfd
->tdata
.any
= tdata_save
;
226 abfd
->flags
= oflags
;
227 bfd_get_start_address (abfd
) = ostart
;
228 return (const bfd_target
*) NULL
;
231 /* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
232 not a COFF file. This is also used by ECOFF. */
235 coff_object_p (bfd
*abfd
)
237 bfd_size_type filhsz
;
238 bfd_size_type aoutsz
;
241 struct internal_filehdr internal_f
;
242 struct internal_aouthdr internal_a
;
244 /* Figure out how much to read. */
245 filhsz
= bfd_coff_filhsz (abfd
);
246 aoutsz
= bfd_coff_aoutsz (abfd
);
248 filehdr
= bfd_alloc (abfd
, filhsz
);
251 if (bfd_bread (filehdr
, filhsz
, abfd
) != filhsz
)
253 if (bfd_get_error () != bfd_error_system_call
)
254 bfd_set_error (bfd_error_wrong_format
);
255 bfd_release (abfd
, filehdr
);
258 bfd_coff_swap_filehdr_in (abfd
, filehdr
, &internal_f
);
259 bfd_release (abfd
, filehdr
);
261 /* The XCOFF format has two sizes for the f_opthdr. SMALL_AOUTSZ
262 (less than aoutsz) used in object files and AOUTSZ (equal to
263 aoutsz) in executables. The bfd_coff_swap_aouthdr_in function
264 expects this header to be aoutsz bytes in length, so we use that
265 value in the call to bfd_alloc below. But we must be careful to
266 only read in f_opthdr bytes in the call to bfd_bread. We should
267 also attempt to catch corrupt or non-COFF binaries with a strange
268 value for f_opthdr. */
269 if (! bfd_coff_bad_format_hook (abfd
, &internal_f
)
270 || internal_f
.f_opthdr
> aoutsz
)
272 bfd_set_error (bfd_error_wrong_format
);
275 nscns
= internal_f
.f_nscns
;
277 if (internal_f
.f_opthdr
)
281 opthdr
= bfd_alloc (abfd
, aoutsz
);
284 if (bfd_bread (opthdr
, (bfd_size_type
) internal_f
.f_opthdr
, abfd
)
285 != internal_f
.f_opthdr
)
287 bfd_release (abfd
, opthdr
);
290 bfd_coff_swap_aouthdr_in (abfd
, opthdr
, (void *) &internal_a
);
291 bfd_release (abfd
, opthdr
);
294 return coff_real_object_p (abfd
, nscns
, &internal_f
,
295 (internal_f
.f_opthdr
!= 0
297 : (struct internal_aouthdr
*) NULL
));
300 /* Get the BFD section from a COFF symbol section number. */
303 coff_section_from_bfd_index (bfd
*abfd
, int index
)
305 struct bfd_section
*answer
= abfd
->sections
;
308 return bfd_abs_section_ptr
;
309 if (index
== N_UNDEF
)
310 return bfd_und_section_ptr
;
311 if (index
== N_DEBUG
)
312 return bfd_abs_section_ptr
;
316 if (answer
->target_index
== index
)
318 answer
= answer
->next
;
321 /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
322 has a bad symbol table in biglitpow.o. */
323 return bfd_und_section_ptr
;
326 /* Get the upper bound of a COFF symbol table. */
329 coff_get_symtab_upper_bound (bfd
*abfd
)
331 if (!bfd_coff_slurp_symbol_table (abfd
))
334 return (bfd_get_symcount (abfd
) + 1) * (sizeof (coff_symbol_type
*));
337 /* Canonicalize a COFF symbol table. */
340 coff_canonicalize_symtab (bfd
*abfd
, asymbol
**alocation
)
342 unsigned int counter
;
343 coff_symbol_type
*symbase
;
344 coff_symbol_type
**location
= (coff_symbol_type
**) alocation
;
346 if (!bfd_coff_slurp_symbol_table (abfd
))
349 symbase
= obj_symbols (abfd
);
350 counter
= bfd_get_symcount (abfd
);
351 while (counter
-- > 0)
352 *location
++ = symbase
++;
356 return bfd_get_symcount (abfd
);
359 /* Get the name of a symbol. The caller must pass in a buffer of size
363 _bfd_coff_internal_syment_name (bfd
*abfd
,
364 const struct internal_syment
*sym
,
367 /* FIXME: It's not clear this will work correctly if sizeof
369 if (sym
->_n
._n_n
._n_zeroes
!= 0
370 || sym
->_n
._n_n
._n_offset
== 0)
372 memcpy (buf
, sym
->_n
._n_name
, SYMNMLEN
);
373 buf
[SYMNMLEN
] = '\0';
380 BFD_ASSERT (sym
->_n
._n_n
._n_offset
>= STRING_SIZE_SIZE
);
381 strings
= obj_coff_strings (abfd
);
384 strings
= _bfd_coff_read_string_table (abfd
);
388 return strings
+ sym
->_n
._n_n
._n_offset
;
392 /* Read in and swap the relocs. This returns a buffer holding the
393 relocs for section SEC in file ABFD. If CACHE is TRUE and
394 INTERNAL_RELOCS is NULL, the relocs read in will be saved in case
395 the function is called again. If EXTERNAL_RELOCS is not NULL, it
396 is a buffer large enough to hold the unswapped relocs. If
397 INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold
398 the swapped relocs. If REQUIRE_INTERNAL is TRUE, then the return
399 value must be INTERNAL_RELOCS. The function returns NULL on error. */
401 struct internal_reloc
*
402 _bfd_coff_read_internal_relocs (bfd
*abfd
,
405 bfd_byte
*external_relocs
,
406 bfd_boolean require_internal
,
407 struct internal_reloc
*internal_relocs
)
410 bfd_byte
*free_external
= NULL
;
411 struct internal_reloc
*free_internal
= NULL
;
414 struct internal_reloc
*irel
;
417 if (sec
->reloc_count
== 0)
418 return internal_relocs
; /* Nothing to do. */
420 if (coff_section_data (abfd
, sec
) != NULL
421 && coff_section_data (abfd
, sec
)->relocs
!= NULL
)
423 if (! require_internal
)
424 return coff_section_data (abfd
, sec
)->relocs
;
425 memcpy (internal_relocs
, coff_section_data (abfd
, sec
)->relocs
,
426 sec
->reloc_count
* sizeof (struct internal_reloc
));
427 return internal_relocs
;
430 relsz
= bfd_coff_relsz (abfd
);
432 amt
= sec
->reloc_count
* relsz
;
433 if (external_relocs
== NULL
)
435 free_external
= bfd_malloc (amt
);
436 if (free_external
== NULL
)
438 external_relocs
= free_external
;
441 if (bfd_seek (abfd
, sec
->rel_filepos
, SEEK_SET
) != 0
442 || bfd_bread (external_relocs
, amt
, abfd
) != amt
)
445 if (internal_relocs
== NULL
)
447 amt
= sec
->reloc_count
;
448 amt
*= sizeof (struct internal_reloc
);
449 free_internal
= bfd_malloc (amt
);
450 if (free_internal
== NULL
)
452 internal_relocs
= free_internal
;
455 /* Swap in the relocs. */
456 erel
= external_relocs
;
457 erel_end
= erel
+ relsz
* sec
->reloc_count
;
458 irel
= internal_relocs
;
459 for (; erel
< erel_end
; erel
+= relsz
, irel
++)
460 bfd_coff_swap_reloc_in (abfd
, (void *) erel
, (void *) irel
);
462 if (free_external
!= NULL
)
464 free (free_external
);
465 free_external
= NULL
;
468 if (cache
&& free_internal
!= NULL
)
470 if (coff_section_data (abfd
, sec
) == NULL
)
472 amt
= sizeof (struct coff_section_tdata
);
473 sec
->used_by_bfd
= bfd_zalloc (abfd
, amt
);
474 if (sec
->used_by_bfd
== NULL
)
476 coff_section_data (abfd
, sec
)->contents
= NULL
;
478 coff_section_data (abfd
, sec
)->relocs
= free_internal
;
481 return internal_relocs
;
484 if (free_external
!= NULL
)
485 free (free_external
);
486 if (free_internal
!= NULL
)
487 free (free_internal
);
491 /* Set lineno_count for the output sections of a COFF file. */
494 coff_count_linenumbers (bfd
*abfd
)
496 unsigned int limit
= bfd_get_symcount (abfd
);
504 /* This may be from the backend linker, in which case the
505 lineno_count in the sections is correct. */
506 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
507 total
+= s
->lineno_count
;
511 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
512 BFD_ASSERT (s
->lineno_count
== 0);
514 for (p
= abfd
->outsymbols
, i
= 0; i
< limit
; i
++, p
++)
516 asymbol
*q_maybe
= *p
;
518 if (bfd_family_coff (bfd_asymbol_bfd (q_maybe
)))
520 coff_symbol_type
*q
= coffsymbol (q_maybe
);
522 /* The AIX 4.1 compiler can sometimes generate line numbers
523 attached to debugging symbols. We try to simply ignore
525 if (q
->lineno
!= NULL
526 && q
->symbol
.section
->owner
!= NULL
)
528 /* This symbol has line numbers. Increment the owning
529 section's linenumber count. */
530 alent
*l
= q
->lineno
;
534 asection
* sec
= q
->symbol
.section
->output_section
;
536 /* Do not try to update fields in read-only sections. */
537 if (! bfd_is_const_section (sec
))
538 sec
->lineno_count
++;
543 while (l
->line_number
!= 0);
551 /* Takes a bfd and a symbol, returns a pointer to the coff specific
552 area of the symbol if there is one. */
555 coff_symbol_from (bfd
*ignore_abfd ATTRIBUTE_UNUSED
,
558 if (!bfd_family_coff (bfd_asymbol_bfd (symbol
)))
559 return (coff_symbol_type
*) NULL
;
561 if (bfd_asymbol_bfd (symbol
)->tdata
.coff_obj_data
== (coff_data_type
*) NULL
)
562 return (coff_symbol_type
*) NULL
;
564 return (coff_symbol_type
*) symbol
;
568 fixup_symbol_value (bfd
*abfd
,
569 coff_symbol_type
*coff_symbol_ptr
,
570 struct internal_syment
*syment
)
572 /* Normalize the symbol flags. */
573 if (coff_symbol_ptr
->symbol
.section
574 && bfd_is_com_section (coff_symbol_ptr
->symbol
.section
))
576 /* A common symbol is undefined with a value. */
577 syment
->n_scnum
= N_UNDEF
;
578 syment
->n_value
= coff_symbol_ptr
->symbol
.value
;
580 else if ((coff_symbol_ptr
->symbol
.flags
& BSF_DEBUGGING
) != 0
581 && (coff_symbol_ptr
->symbol
.flags
& BSF_DEBUGGING_RELOC
) == 0)
583 syment
->n_value
= coff_symbol_ptr
->symbol
.value
;
585 else if (bfd_is_und_section (coff_symbol_ptr
->symbol
.section
))
587 syment
->n_scnum
= N_UNDEF
;
590 /* FIXME: Do we need to handle the absolute section here? */
593 if (coff_symbol_ptr
->symbol
.section
)
596 coff_symbol_ptr
->symbol
.section
->output_section
->target_index
;
598 syment
->n_value
= (coff_symbol_ptr
->symbol
.value
599 + coff_symbol_ptr
->symbol
.section
->output_offset
);
602 syment
->n_value
+= (syment
->n_sclass
== C_STATLAB
)
603 ? coff_symbol_ptr
->symbol
.section
->output_section
->lma
604 : coff_symbol_ptr
->symbol
.section
->output_section
->vma
;
610 /* This can happen, but I don't know why yet (steve@cygnus.com) */
611 syment
->n_scnum
= N_ABS
;
612 syment
->n_value
= coff_symbol_ptr
->symbol
.value
;
617 /* Run through all the symbols in the symbol table and work out what
618 their indexes into the symbol table will be when output.
620 Coff requires that each C_FILE symbol points to the next one in the
621 chain, and that the last one points to the first external symbol. We
625 coff_renumber_symbols (bfd
*bfd_ptr
, int *first_undef
)
627 unsigned int symbol_count
= bfd_get_symcount (bfd_ptr
);
628 asymbol
**symbol_ptr_ptr
= bfd_ptr
->outsymbols
;
629 unsigned int native_index
= 0;
630 struct internal_syment
*last_file
= NULL
;
631 unsigned int symbol_index
;
633 /* COFF demands that undefined symbols come after all other symbols.
634 Since we don't need to impose this extra knowledge on all our
635 client programs, deal with that here. Sort the symbol table;
636 just move the undefined symbols to the end, leaving the rest
637 alone. The O'Reilly book says that defined global symbols come
638 at the end before the undefined symbols, so we do that here as
640 /* @@ Do we have some condition we could test for, so we don't always
641 have to do this? I don't think relocatability is quite right, but
642 I'm not certain. [raeburn:19920508.1711EST] */
648 amt
= sizeof (asymbol
*) * ((bfd_size_type
) symbol_count
+ 1);
649 newsyms
= bfd_alloc (bfd_ptr
, amt
);
652 bfd_ptr
->outsymbols
= newsyms
;
653 for (i
= 0; i
< symbol_count
; i
++)
654 if ((symbol_ptr_ptr
[i
]->flags
& BSF_NOT_AT_END
) != 0
655 || (!bfd_is_und_section (symbol_ptr_ptr
[i
]->section
)
656 && !bfd_is_com_section (symbol_ptr_ptr
[i
]->section
)
657 && ((symbol_ptr_ptr
[i
]->flags
& BSF_FUNCTION
) != 0
658 || ((symbol_ptr_ptr
[i
]->flags
& (BSF_GLOBAL
| BSF_WEAK
))
660 *newsyms
++ = symbol_ptr_ptr
[i
];
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 *first_undef
= newsyms
- bfd_ptr
->outsymbols
;
673 for (i
= 0; i
< symbol_count
; i
++)
674 if ((symbol_ptr_ptr
[i
]->flags
& BSF_NOT_AT_END
) == 0
675 && bfd_is_und_section (symbol_ptr_ptr
[i
]->section
))
676 *newsyms
++ = symbol_ptr_ptr
[i
];
677 *newsyms
= (asymbol
*) NULL
;
678 symbol_ptr_ptr
= bfd_ptr
->outsymbols
;
681 for (symbol_index
= 0; symbol_index
< symbol_count
; symbol_index
++)
683 coff_symbol_type
*coff_symbol_ptr
= coff_symbol_from (bfd_ptr
, symbol_ptr_ptr
[symbol_index
]);
684 symbol_ptr_ptr
[symbol_index
]->udata
.i
= symbol_index
;
685 if (coff_symbol_ptr
&& coff_symbol_ptr
->native
)
687 combined_entry_type
*s
= coff_symbol_ptr
->native
;
690 if (s
->u
.syment
.n_sclass
== C_FILE
)
692 if (last_file
!= NULL
)
693 last_file
->n_value
= native_index
;
694 last_file
= &(s
->u
.syment
);
697 /* Modify the symbol values according to their section and
699 fixup_symbol_value (bfd_ptr
, coff_symbol_ptr
, &(s
->u
.syment
));
701 for (i
= 0; i
< s
->u
.syment
.n_numaux
+ 1; i
++)
702 s
[i
].offset
= native_index
++;
708 obj_conv_table_size (bfd_ptr
) = native_index
;
713 /* Run thorough the symbol table again, and fix it so that all
714 pointers to entries are changed to the entries' index in the output
718 coff_mangle_symbols (bfd
*bfd_ptr
)
720 unsigned int symbol_count
= bfd_get_symcount (bfd_ptr
);
721 asymbol
**symbol_ptr_ptr
= bfd_ptr
->outsymbols
;
722 unsigned int symbol_index
;
724 for (symbol_index
= 0; symbol_index
< symbol_count
; symbol_index
++)
726 coff_symbol_type
*coff_symbol_ptr
=
727 coff_symbol_from (bfd_ptr
, symbol_ptr_ptr
[symbol_index
]);
729 if (coff_symbol_ptr
&& coff_symbol_ptr
->native
)
732 combined_entry_type
*s
= coff_symbol_ptr
->native
;
736 /* FIXME: We should use a union here. */
737 s
->u
.syment
.n_value
=
738 (bfd_hostptr_t
) ((combined_entry_type
*)
739 ((bfd_hostptr_t
) s
->u
.syment
.n_value
))->offset
;
744 /* The value is the offset into the line number entries
745 for the symbol's section. On output, the symbol's
746 section should be N_DEBUG. */
747 s
->u
.syment
.n_value
=
748 (coff_symbol_ptr
->symbol
.section
->output_section
->line_filepos
749 + s
->u
.syment
.n_value
* bfd_coff_linesz (bfd_ptr
));
750 coff_symbol_ptr
->symbol
.section
=
751 coff_section_from_bfd_index (bfd_ptr
, N_DEBUG
);
752 BFD_ASSERT (coff_symbol_ptr
->symbol
.flags
& BSF_DEBUGGING
);
754 for (i
= 0; i
< s
->u
.syment
.n_numaux
; i
++)
756 combined_entry_type
*a
= s
+ i
+ 1;
759 a
->u
.auxent
.x_sym
.x_tagndx
.l
=
760 a
->u
.auxent
.x_sym
.x_tagndx
.p
->offset
;
765 a
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
=
766 a
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
->offset
;
771 a
->u
.auxent
.x_csect
.x_scnlen
.l
=
772 a
->u
.auxent
.x_csect
.x_scnlen
.p
->offset
;
781 coff_fix_symbol_name (bfd
*abfd
,
783 combined_entry_type
*native
,
784 bfd_size_type
*string_size_p
,
785 asection
**debug_string_section_p
,
786 bfd_size_type
*debug_string_size_p
)
788 unsigned int name_length
;
789 union internal_auxent
*auxent
;
790 char *name
= (char *) (symbol
->name
);
794 /* COFF symbols always have names, so we'll make one up. */
795 symbol
->name
= "strange";
796 name
= (char *) symbol
->name
;
798 name_length
= strlen (name
);
800 if (native
->u
.syment
.n_sclass
== C_FILE
801 && native
->u
.syment
.n_numaux
> 0)
803 unsigned int filnmlen
;
805 if (bfd_coff_force_symnames_in_strings (abfd
))
807 native
->u
.syment
._n
._n_n
._n_offset
=
808 (*string_size_p
+ STRING_SIZE_SIZE
);
809 native
->u
.syment
._n
._n_n
._n_zeroes
= 0;
810 *string_size_p
+= 6; /* strlen(".file") + 1 */
813 strncpy (native
->u
.syment
._n
._n_name
, ".file", SYMNMLEN
);
815 auxent
= &(native
+ 1)->u
.auxent
;
817 filnmlen
= bfd_coff_filnmlen (abfd
);
819 if (bfd_coff_long_filenames (abfd
))
821 if (name_length
<= filnmlen
)
822 strncpy (auxent
->x_file
.x_fname
, name
, filnmlen
);
825 auxent
->x_file
.x_n
.x_offset
= *string_size_p
+ STRING_SIZE_SIZE
;
826 auxent
->x_file
.x_n
.x_zeroes
= 0;
827 *string_size_p
+= name_length
+ 1;
832 strncpy (auxent
->x_file
.x_fname
, name
, filnmlen
);
833 if (name_length
> filnmlen
)
834 name
[filnmlen
] = '\0';
839 if (name_length
<= SYMNMLEN
&& !bfd_coff_force_symnames_in_strings (abfd
))
840 /* This name will fit into the symbol neatly. */
841 strncpy (native
->u
.syment
._n
._n_name
, symbol
->name
, SYMNMLEN
);
843 else if (!bfd_coff_symname_in_debug (abfd
, &native
->u
.syment
))
845 native
->u
.syment
._n
._n_n
._n_offset
= (*string_size_p
847 native
->u
.syment
._n
._n_n
._n_zeroes
= 0;
848 *string_size_p
+= name_length
+ 1;
854 int prefix_len
= bfd_coff_debug_string_prefix_length (abfd
);
856 /* This name should be written into the .debug section. For
857 some reason each name is preceded by a two byte length
858 and also followed by a null byte. FIXME: We assume that
859 the .debug section has already been created, and that it
861 if (*debug_string_section_p
== (asection
*) NULL
)
862 *debug_string_section_p
= bfd_get_section_by_name (abfd
, ".debug");
863 filepos
= bfd_tell (abfd
);
865 bfd_put_32 (abfd
, (bfd_vma
) (name_length
+ 1), buf
);
867 bfd_put_16 (abfd
, (bfd_vma
) (name_length
+ 1), buf
);
869 if (!bfd_set_section_contents (abfd
,
870 *debug_string_section_p
,
872 (file_ptr
) *debug_string_size_p
,
873 (bfd_size_type
) prefix_len
)
874 || !bfd_set_section_contents (abfd
,
875 *debug_string_section_p
,
876 (void *) symbol
->name
,
877 (file_ptr
) (*debug_string_size_p
879 (bfd_size_type
) name_length
+ 1))
881 if (bfd_seek (abfd
, filepos
, SEEK_SET
) != 0)
883 native
->u
.syment
._n
._n_n
._n_offset
=
884 *debug_string_size_p
+ prefix_len
;
885 native
->u
.syment
._n
._n_n
._n_zeroes
= 0;
886 *debug_string_size_p
+= name_length
+ 1 + prefix_len
;
891 /* We need to keep track of the symbol index so that when we write out
892 the relocs we can get the index for a symbol. This method is a
895 #define set_index(symbol, idx) ((symbol)->udata.i = (idx))
897 /* Write a symbol out to a COFF file. */
900 coff_write_symbol (bfd
*abfd
,
902 combined_entry_type
*native
,
904 bfd_size_type
*string_size_p
,
905 asection
**debug_string_section_p
,
906 bfd_size_type
*debug_string_size_p
)
908 unsigned int numaux
= native
->u
.syment
.n_numaux
;
909 int type
= native
->u
.syment
.n_type
;
910 int class = native
->u
.syment
.n_sclass
;
912 bfd_size_type symesz
;
914 if (native
->u
.syment
.n_sclass
== C_FILE
)
915 symbol
->flags
|= BSF_DEBUGGING
;
917 if (symbol
->flags
& BSF_DEBUGGING
918 && bfd_is_abs_section (symbol
->section
))
919 native
->u
.syment
.n_scnum
= N_DEBUG
;
921 else if (bfd_is_abs_section (symbol
->section
))
922 native
->u
.syment
.n_scnum
= N_ABS
;
924 else if (bfd_is_und_section (symbol
->section
))
925 native
->u
.syment
.n_scnum
= N_UNDEF
;
928 native
->u
.syment
.n_scnum
=
929 symbol
->section
->output_section
->target_index
;
931 coff_fix_symbol_name (abfd
, symbol
, native
, string_size_p
,
932 debug_string_section_p
, debug_string_size_p
);
934 symesz
= bfd_coff_symesz (abfd
);
935 buf
= bfd_alloc (abfd
, symesz
);
938 bfd_coff_swap_sym_out (abfd
, &native
->u
.syment
, buf
);
939 if (bfd_bwrite (buf
, symesz
, abfd
) != symesz
)
941 bfd_release (abfd
, buf
);
943 if (native
->u
.syment
.n_numaux
> 0)
945 bfd_size_type auxesz
;
948 auxesz
= bfd_coff_auxesz (abfd
);
949 buf
= bfd_alloc (abfd
, auxesz
);
952 for (j
= 0; j
< native
->u
.syment
.n_numaux
; j
++)
954 bfd_coff_swap_aux_out (abfd
,
955 &((native
+ j
+ 1)->u
.auxent
),
956 type
, class, (int) j
,
957 native
->u
.syment
.n_numaux
,
959 if (bfd_bwrite (buf
, auxesz
, abfd
) != auxesz
)
962 bfd_release (abfd
, buf
);
965 /* Store the index for use when we write out the relocs. */
966 set_index (symbol
, *written
);
968 *written
+= numaux
+ 1;
972 /* Write out a symbol to a COFF file that does not come from a COFF
973 file originally. This symbol may have been created by the linker,
974 or we may be linking a non COFF file to a COFF file. */
977 coff_write_alien_symbol (bfd
*abfd
,
980 bfd_size_type
*string_size_p
,
981 asection
**debug_string_section_p
,
982 bfd_size_type
*debug_string_size_p
)
984 combined_entry_type
*native
;
985 combined_entry_type dummy
;
988 native
->u
.syment
.n_type
= T_NULL
;
989 native
->u
.syment
.n_flags
= 0;
990 if (bfd_is_und_section (symbol
->section
))
992 native
->u
.syment
.n_scnum
= N_UNDEF
;
993 native
->u
.syment
.n_value
= symbol
->value
;
995 else if (bfd_is_com_section (symbol
->section
))
997 native
->u
.syment
.n_scnum
= N_UNDEF
;
998 native
->u
.syment
.n_value
= symbol
->value
;
1000 else if (symbol
->flags
& BSF_DEBUGGING
)
1002 /* There isn't much point to writing out a debugging symbol
1003 unless we are prepared to convert it into COFF debugging
1004 format. So, we just ignore them. We must clobber the symbol
1005 name to keep it from being put in the string table. */
1011 native
->u
.syment
.n_scnum
=
1012 symbol
->section
->output_section
->target_index
;
1013 native
->u
.syment
.n_value
= (symbol
->value
1014 + symbol
->section
->output_offset
);
1015 if (! obj_pe (abfd
))
1016 native
->u
.syment
.n_value
+= symbol
->section
->output_section
->vma
;
1018 /* Copy the any flags from the file header into the symbol.
1021 coff_symbol_type
*c
= coff_symbol_from (abfd
, symbol
);
1022 if (c
!= (coff_symbol_type
*) NULL
)
1023 native
->u
.syment
.n_flags
= bfd_asymbol_bfd (&c
->symbol
)->flags
;
1027 native
->u
.syment
.n_type
= 0;
1028 if (symbol
->flags
& BSF_LOCAL
)
1029 native
->u
.syment
.n_sclass
= C_STAT
;
1030 else if (symbol
->flags
& BSF_WEAK
)
1031 native
->u
.syment
.n_sclass
= obj_pe (abfd
) ? C_NT_WEAK
: C_WEAKEXT
;
1033 native
->u
.syment
.n_sclass
= C_EXT
;
1034 native
->u
.syment
.n_numaux
= 0;
1036 return coff_write_symbol (abfd
, symbol
, native
, written
, string_size_p
,
1037 debug_string_section_p
, debug_string_size_p
);
1040 /* Write a native symbol to a COFF file. */
1043 coff_write_native_symbol (bfd
*abfd
,
1044 coff_symbol_type
*symbol
,
1046 bfd_size_type
*string_size_p
,
1047 asection
**debug_string_section_p
,
1048 bfd_size_type
*debug_string_size_p
)
1050 combined_entry_type
*native
= symbol
->native
;
1051 alent
*lineno
= symbol
->lineno
;
1053 /* If this symbol has an associated line number, we must store the
1054 symbol index in the line number field. We also tag the auxent to
1055 point to the right place in the lineno table. */
1056 if (lineno
&& !symbol
->done_lineno
&& symbol
->symbol
.section
->owner
!= NULL
)
1058 unsigned int count
= 0;
1060 lineno
[count
].u
.offset
= *written
;
1061 if (native
->u
.syment
.n_numaux
)
1063 union internal_auxent
*a
= &((native
+ 1)->u
.auxent
);
1065 a
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
=
1066 symbol
->symbol
.section
->output_section
->moving_line_filepos
;
1069 /* Count and relocate all other linenumbers. */
1071 while (lineno
[count
].line_number
!= 0)
1073 lineno
[count
].u
.offset
+=
1074 (symbol
->symbol
.section
->output_section
->vma
1075 + symbol
->symbol
.section
->output_offset
);
1078 symbol
->done_lineno
= TRUE
;
1080 if (! bfd_is_const_section (symbol
->symbol
.section
->output_section
))
1081 symbol
->symbol
.section
->output_section
->moving_line_filepos
+=
1082 count
* bfd_coff_linesz (abfd
);
1085 return coff_write_symbol (abfd
, &(symbol
->symbol
), native
, written
,
1086 string_size_p
, debug_string_section_p
,
1087 debug_string_size_p
);
1091 null_error_handler (const char * fmt ATTRIBUTE_UNUSED
, ...)
1095 /* Write out the COFF symbols. */
1098 coff_write_symbols (bfd
*abfd
)
1100 bfd_size_type string_size
;
1101 asection
*debug_string_section
;
1102 bfd_size_type debug_string_size
;
1104 unsigned int limit
= bfd_get_symcount (abfd
);
1105 bfd_vma written
= 0;
1109 debug_string_section
= NULL
;
1110 debug_string_size
= 0;
1112 /* If this target supports long section names, they must be put into
1113 the string table. This is supported by PE. This code must
1114 handle section names just as they are handled in
1115 coff_write_object_contents. */
1116 if (bfd_coff_long_section_names (abfd
))
1120 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
1124 len
= strlen (o
->name
);
1126 string_size
+= len
+ 1;
1130 /* Seek to the right place. */
1131 if (bfd_seek (abfd
, obj_sym_filepos (abfd
), SEEK_SET
) != 0)
1134 /* Output all the symbols we have. */
1136 for (p
= abfd
->outsymbols
, i
= 0; i
< limit
; i
++, p
++)
1138 asymbol
*symbol
= *p
;
1139 coff_symbol_type
*c_symbol
= coff_symbol_from (abfd
, symbol
);
1141 if (c_symbol
== (coff_symbol_type
*) NULL
1142 || c_symbol
->native
== (combined_entry_type
*) NULL
)
1144 if (!coff_write_alien_symbol (abfd
, symbol
, &written
, &string_size
,
1145 &debug_string_section
,
1146 &debug_string_size
))
1151 if (coff_backend_info (abfd
)->_bfd_coff_classify_symbol
!= NULL
)
1153 bfd_error_handler_type current_error_handler
;
1154 enum coff_symbol_classification
class;
1155 unsigned char *n_sclass
;
1157 /* Suppress error reporting by bfd_coff_classify_symbol.
1158 Error messages can be generated when we are processing a local
1159 symbol which has no associated section and we do not have to
1160 worry about this, all we need to know is that it is local. */
1161 current_error_handler
= bfd_set_error_handler (null_error_handler
);
1162 class = bfd_coff_classify_symbol (abfd
, &c_symbol
->native
->u
.syment
);
1163 (void) bfd_set_error_handler (current_error_handler
);
1165 n_sclass
= &c_symbol
->native
->u
.syment
.n_sclass
;
1167 /* If the symbol class has been changed (eg objcopy/ld script/etc)
1168 we cannot retain the existing sclass from the original symbol.
1169 Weak symbols only have one valid sclass, so just set it always.
1170 If it is not local class and should be, set it C_STAT.
1171 If it is global and not classified as global, or if it is
1172 weak (which is also classified as global), set it C_EXT. */
1174 if (symbol
->flags
& BSF_WEAK
)
1175 *n_sclass
= obj_pe (abfd
) ? C_NT_WEAK
: C_WEAKEXT
;
1176 else if (symbol
->flags
& BSF_LOCAL
&& class != COFF_SYMBOL_LOCAL
)
1178 else if (symbol
->flags
& BSF_GLOBAL
1179 && (class != COFF_SYMBOL_GLOBAL
1181 || *n_sclass
== C_NT_WEAK
1183 || *n_sclass
== C_WEAKEXT
))
1184 c_symbol
->native
->u
.syment
.n_sclass
= C_EXT
;
1187 if (!coff_write_native_symbol (abfd
, c_symbol
, &written
,
1188 &string_size
, &debug_string_section
,
1189 &debug_string_size
))
1194 obj_raw_syment_count (abfd
) = written
;
1196 /* Now write out strings. */
1197 if (string_size
!= 0)
1199 unsigned int size
= string_size
+ STRING_SIZE_SIZE
;
1200 bfd_byte buffer
[STRING_SIZE_SIZE
];
1202 #if STRING_SIZE_SIZE == 4
1203 H_PUT_32 (abfd
, size
, buffer
);
1205 #error Change H_PUT_32
1207 if (bfd_bwrite ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
)
1211 /* Handle long section names. This code must handle section
1212 names just as they are handled in coff_write_object_contents. */
1213 if (bfd_coff_long_section_names (abfd
))
1217 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
1221 len
= strlen (o
->name
);
1224 if (bfd_bwrite (o
->name
, (bfd_size_type
) (len
+ 1), abfd
)
1231 for (p
= abfd
->outsymbols
, i
= 0;
1236 size_t name_length
= strlen (q
->name
);
1237 coff_symbol_type
*c_symbol
= coff_symbol_from (abfd
, q
);
1240 /* Figure out whether the symbol name should go in the string
1241 table. Symbol names that are short enough are stored
1242 directly in the syment structure. File names permit a
1243 different, longer, length in the syment structure. On
1244 XCOFF, some symbol names are stored in the .debug section
1245 rather than in the string table. */
1247 if (c_symbol
== NULL
1248 || c_symbol
->native
== NULL
)
1249 /* This is not a COFF symbol, so it certainly is not a
1250 file name, nor does it go in the .debug section. */
1251 maxlen
= bfd_coff_force_symnames_in_strings (abfd
) ? 0 : SYMNMLEN
;
1253 else if (bfd_coff_symname_in_debug (abfd
,
1254 &c_symbol
->native
->u
.syment
))
1255 /* This symbol name is in the XCOFF .debug section.
1256 Don't write it into the string table. */
1257 maxlen
= name_length
;
1259 else if (c_symbol
->native
->u
.syment
.n_sclass
== C_FILE
1260 && c_symbol
->native
->u
.syment
.n_numaux
> 0)
1262 if (bfd_coff_force_symnames_in_strings (abfd
))
1264 if (bfd_bwrite (".file", (bfd_size_type
) 6, abfd
) != 6)
1267 maxlen
= bfd_coff_filnmlen (abfd
);
1270 maxlen
= bfd_coff_force_symnames_in_strings (abfd
) ? 0 : SYMNMLEN
;
1272 if (name_length
> maxlen
)
1274 if (bfd_bwrite ((void *) (q
->name
), (bfd_size_type
) name_length
+ 1,
1275 abfd
) != name_length
+ 1)
1282 /* We would normally not write anything here, but we'll write
1283 out 4 so that any stupid coff reader which tries to read the
1284 string table even when there isn't one won't croak. */
1285 unsigned int size
= STRING_SIZE_SIZE
;
1286 bfd_byte buffer
[STRING_SIZE_SIZE
];
1288 #if STRING_SIZE_SIZE == 4
1289 H_PUT_32 (abfd
, size
, buffer
);
1291 #error Change H_PUT_32
1293 if (bfd_bwrite ((void *) buffer
, (bfd_size_type
) STRING_SIZE_SIZE
, abfd
)
1294 != STRING_SIZE_SIZE
)
1298 /* Make sure the .debug section was created to be the correct size.
1299 We should create it ourselves on the fly, but we don't because
1300 BFD won't let us write to any section until we know how large all
1301 the sections are. We could still do it by making another pass
1302 over the symbols. FIXME. */
1303 BFD_ASSERT (debug_string_size
== 0
1304 || (debug_string_section
!= (asection
*) NULL
1305 && (BFD_ALIGN (debug_string_size
,
1306 1 << debug_string_section
->alignment_power
)
1307 == debug_string_section
->size
)));
1313 coff_write_linenumbers (bfd
*abfd
)
1316 bfd_size_type linesz
;
1319 linesz
= bfd_coff_linesz (abfd
);
1320 buff
= bfd_alloc (abfd
, linesz
);
1323 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
1325 if (s
->lineno_count
)
1327 asymbol
**q
= abfd
->outsymbols
;
1328 if (bfd_seek (abfd
, s
->line_filepos
, SEEK_SET
) != 0)
1330 /* Find all the linenumbers in this section. */
1334 if (p
->section
->output_section
== s
)
1337 BFD_SEND (bfd_asymbol_bfd (p
), _get_lineno
,
1338 (bfd_asymbol_bfd (p
), p
));
1341 /* Found a linenumber entry, output. */
1342 struct internal_lineno out
;
1343 memset ((void *) & out
, 0, sizeof (out
));
1345 out
.l_addr
.l_symndx
= l
->u
.offset
;
1346 bfd_coff_swap_lineno_out (abfd
, &out
, buff
);
1347 if (bfd_bwrite (buff
, (bfd_size_type
) linesz
, abfd
)
1351 while (l
->line_number
)
1353 out
.l_lnno
= l
->line_number
;
1354 out
.l_addr
.l_symndx
= l
->u
.offset
;
1355 bfd_coff_swap_lineno_out (abfd
, &out
, buff
);
1356 if (bfd_bwrite (buff
, (bfd_size_type
) linesz
, abfd
)
1367 bfd_release (abfd
, buff
);
1372 coff_get_lineno (bfd
*ignore_abfd ATTRIBUTE_UNUSED
, asymbol
*symbol
)
1374 return coffsymbol (symbol
)->lineno
;
1377 /* This function transforms the offsets into the symbol table into
1378 pointers to syments. */
1381 coff_pointerize_aux (bfd
*abfd
,
1382 combined_entry_type
*table_base
,
1383 combined_entry_type
*symbol
,
1384 unsigned int indaux
,
1385 combined_entry_type
*auxent
)
1387 unsigned int type
= symbol
->u
.syment
.n_type
;
1388 unsigned int class = symbol
->u
.syment
.n_sclass
;
1390 if (coff_backend_info (abfd
)->_bfd_coff_pointerize_aux_hook
)
1392 if ((*coff_backend_info (abfd
)->_bfd_coff_pointerize_aux_hook
)
1393 (abfd
, table_base
, symbol
, indaux
, auxent
))
1397 /* Don't bother if this is a file or a section. */
1398 if (class == C_STAT
&& type
== T_NULL
)
1400 if (class == C_FILE
)
1403 /* Otherwise patch up. */
1404 #define N_TMASK coff_data (abfd)->local_n_tmask
1405 #define N_BTSHFT coff_data (abfd)->local_n_btshft
1407 if ((ISFCN (type
) || ISTAG (class) || class == C_BLOCK
|| class == C_FCN
)
1408 && auxent
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
> 0)
1410 auxent
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
=
1411 table_base
+ auxent
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
;
1412 auxent
->fix_end
= 1;
1414 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1415 generate one, so we must be careful to ignore it. */
1416 if (auxent
->u
.auxent
.x_sym
.x_tagndx
.l
> 0)
1418 auxent
->u
.auxent
.x_sym
.x_tagndx
.p
=
1419 table_base
+ auxent
->u
.auxent
.x_sym
.x_tagndx
.l
;
1420 auxent
->fix_tag
= 1;
1424 /* Allocate space for the ".debug" section, and read it.
1425 We did not read the debug section until now, because
1426 we didn't want to go to the trouble until someone needed it. */
1429 build_debug_section (bfd
*abfd
)
1431 char *debug_section
;
1433 bfd_size_type sec_size
;
1435 asection
*sect
= bfd_get_section_by_name (abfd
, ".debug");
1439 bfd_set_error (bfd_error_no_debug_section
);
1443 sec_size
= sect
->size
;
1444 debug_section
= bfd_alloc (abfd
, sec_size
);
1445 if (debug_section
== NULL
)
1448 /* Seek to the beginning of the `.debug' section and read it.
1449 Save the current position first; it is needed by our caller.
1450 Then read debug section and reset the file pointer. */
1452 position
= bfd_tell (abfd
);
1453 if (bfd_seek (abfd
, sect
->filepos
, SEEK_SET
) != 0
1454 || bfd_bread (debug_section
, sec_size
, abfd
) != sec_size
1455 || bfd_seek (abfd
, position
, SEEK_SET
) != 0)
1457 return debug_section
;
1460 /* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1461 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1462 be \0-terminated. */
1465 copy_name (bfd
*abfd
, char *name
, size_t maxlen
)
1470 for (len
= 0; len
< maxlen
; ++len
)
1471 if (name
[len
] == '\0')
1474 if ((newname
= bfd_alloc (abfd
, (bfd_size_type
) len
+ 1)) == NULL
)
1477 strncpy (newname
, name
, len
);
1478 newname
[len
] = '\0';
1482 /* Read in the external symbols. */
1485 _bfd_coff_get_external_symbols (bfd
*abfd
)
1487 bfd_size_type symesz
;
1491 if (obj_coff_external_syms (abfd
) != NULL
)
1494 symesz
= bfd_coff_symesz (abfd
);
1496 size
= obj_raw_syment_count (abfd
) * symesz
;
1500 syms
= bfd_malloc (size
);
1504 if (bfd_seek (abfd
, obj_sym_filepos (abfd
), SEEK_SET
) != 0
1505 || bfd_bread (syms
, size
, abfd
) != size
)
1512 obj_coff_external_syms (abfd
) = syms
;
1517 /* Read in the external strings. The strings are not loaded until
1518 they are needed. This is because we have no simple way of
1519 detecting a missing string table in an archive. */
1522 _bfd_coff_read_string_table (bfd
*abfd
)
1524 char extstrsize
[STRING_SIZE_SIZE
];
1525 bfd_size_type strsize
;
1529 if (obj_coff_strings (abfd
) != NULL
)
1530 return obj_coff_strings (abfd
);
1532 if (obj_sym_filepos (abfd
) == 0)
1534 bfd_set_error (bfd_error_no_symbols
);
1538 pos
= obj_sym_filepos (abfd
);
1539 pos
+= obj_raw_syment_count (abfd
) * bfd_coff_symesz (abfd
);
1540 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0)
1543 if (bfd_bread (extstrsize
, (bfd_size_type
) sizeof extstrsize
, abfd
)
1544 != sizeof extstrsize
)
1546 if (bfd_get_error () != bfd_error_file_truncated
)
1549 /* There is no string table. */
1550 strsize
= STRING_SIZE_SIZE
;
1554 #if STRING_SIZE_SIZE == 4
1555 strsize
= H_GET_32 (abfd
, extstrsize
);
1557 #error Change H_GET_32
1561 if (strsize
< STRING_SIZE_SIZE
)
1563 (*_bfd_error_handler
)
1564 (_("%B: bad string table size %lu"), abfd
, (unsigned long) strsize
);
1565 bfd_set_error (bfd_error_bad_value
);
1569 strings
= bfd_malloc (strsize
);
1570 if (strings
== NULL
)
1573 if (bfd_bread (strings
+ STRING_SIZE_SIZE
, strsize
- STRING_SIZE_SIZE
, abfd
)
1574 != strsize
- STRING_SIZE_SIZE
)
1580 obj_coff_strings (abfd
) = strings
;
1585 /* Free up the external symbols and strings read from a COFF file. */
1588 _bfd_coff_free_symbols (bfd
*abfd
)
1590 if (obj_coff_external_syms (abfd
) != NULL
1591 && ! obj_coff_keep_syms (abfd
))
1593 free (obj_coff_external_syms (abfd
));
1594 obj_coff_external_syms (abfd
) = NULL
;
1596 if (obj_coff_strings (abfd
) != NULL
1597 && ! obj_coff_keep_strings (abfd
))
1599 free (obj_coff_strings (abfd
));
1600 obj_coff_strings (abfd
) = NULL
;
1605 /* Read a symbol table into freshly bfd_allocated memory, swap it, and
1606 knit the symbol names into a normalized form. By normalized here I
1607 mean that all symbols have an n_offset pointer that points to a null-
1608 terminated string. */
1610 combined_entry_type
*
1611 coff_get_normalized_symtab (bfd
*abfd
)
1613 combined_entry_type
*internal
;
1614 combined_entry_type
*internal_ptr
;
1615 combined_entry_type
*symbol_ptr
;
1616 combined_entry_type
*internal_end
;
1620 const char *string_table
= NULL
;
1621 char *debug_section
= NULL
;
1624 if (obj_raw_syments (abfd
) != NULL
)
1625 return obj_raw_syments (abfd
);
1627 size
= obj_raw_syment_count (abfd
) * sizeof (combined_entry_type
);
1628 internal
= bfd_zalloc (abfd
, size
);
1629 if (internal
== NULL
&& size
!= 0)
1631 internal_end
= internal
+ obj_raw_syment_count (abfd
);
1633 if (! _bfd_coff_get_external_symbols (abfd
))
1636 raw_src
= (char *) obj_coff_external_syms (abfd
);
1638 /* Mark the end of the symbols. */
1639 symesz
= bfd_coff_symesz (abfd
);
1640 raw_end
= (char *) raw_src
+ obj_raw_syment_count (abfd
) * symesz
;
1642 /* FIXME SOMEDAY. A string table size of zero is very weird, but
1643 probably possible. If one shows up, it will probably kill us. */
1645 /* Swap all the raw entries. */
1646 for (internal_ptr
= internal
;
1648 raw_src
+= symesz
, internal_ptr
++)
1652 bfd_coff_swap_sym_in (abfd
, (void *) raw_src
,
1653 (void *) & internal_ptr
->u
.syment
);
1654 symbol_ptr
= internal_ptr
;
1657 i
< symbol_ptr
->u
.syment
.n_numaux
;
1662 bfd_coff_swap_aux_in (abfd
, (void *) raw_src
,
1663 symbol_ptr
->u
.syment
.n_type
,
1664 symbol_ptr
->u
.syment
.n_sclass
,
1665 (int) i
, symbol_ptr
->u
.syment
.n_numaux
,
1666 &(internal_ptr
->u
.auxent
));
1667 coff_pointerize_aux (abfd
, internal
, symbol_ptr
, i
,
1672 /* Free the raw symbols, but not the strings (if we have them). */
1673 obj_coff_keep_strings (abfd
) = TRUE
;
1674 if (! _bfd_coff_free_symbols (abfd
))
1677 for (internal_ptr
= internal
; internal_ptr
< internal_end
;
1680 if (internal_ptr
->u
.syment
.n_sclass
== C_FILE
1681 && internal_ptr
->u
.syment
.n_numaux
> 0)
1683 /* Make a file symbol point to the name in the auxent, since
1684 the text ".file" is redundant. */
1685 if ((internal_ptr
+ 1)->u
.auxent
.x_file
.x_n
.x_zeroes
== 0)
1687 /* The filename is a long one, point into the string table. */
1688 if (string_table
== NULL
)
1690 string_table
= _bfd_coff_read_string_table (abfd
);
1691 if (string_table
== NULL
)
1695 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1698 + (internal_ptr
+ 1)->u
.auxent
.x_file
.x_n
.x_offset
));
1702 /* Ordinary short filename, put into memory anyway. The
1703 Microsoft PE tools sometimes store a filename in
1704 multiple AUX entries. */
1705 if (internal_ptr
->u
.syment
.n_numaux
> 1
1706 && coff_data (abfd
)->pe
)
1707 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1710 (internal_ptr
+ 1)->u
.auxent
.x_file
.x_fname
,
1711 internal_ptr
->u
.syment
.n_numaux
* symesz
));
1713 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1716 (internal_ptr
+ 1)->u
.auxent
.x_file
.x_fname
,
1717 (size_t) bfd_coff_filnmlen (abfd
)));
1722 if (internal_ptr
->u
.syment
._n
._n_n
._n_zeroes
!= 0)
1724 /* This is a "short" name. Make it long. */
1728 /* Find the length of this string without walking into memory
1730 for (i
= 0; i
< 8; ++i
)
1731 if (internal_ptr
->u
.syment
._n
._n_name
[i
] == '\0')
1734 newstring
= bfd_zalloc (abfd
, (bfd_size_type
) (i
+ 1));
1735 if (newstring
== NULL
)
1737 strncpy (newstring
, internal_ptr
->u
.syment
._n
._n_name
, i
);
1738 internal_ptr
->u
.syment
._n
._n_n
._n_offset
= (bfd_hostptr_t
) newstring
;
1739 internal_ptr
->u
.syment
._n
._n_n
._n_zeroes
= 0;
1741 else if (internal_ptr
->u
.syment
._n
._n_n
._n_offset
== 0)
1742 internal_ptr
->u
.syment
._n
._n_n
._n_offset
= (bfd_hostptr_t
) "";
1743 else if (!bfd_coff_symname_in_debug (abfd
, &internal_ptr
->u
.syment
))
1745 /* Long name already. Point symbol at the string in the
1747 if (string_table
== NULL
)
1749 string_table
= _bfd_coff_read_string_table (abfd
);
1750 if (string_table
== NULL
)
1753 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1756 + internal_ptr
->u
.syment
._n
._n_n
._n_offset
));
1760 /* Long name in debug section. Very similar. */
1761 if (debug_section
== NULL
)
1762 debug_section
= build_debug_section (abfd
);
1763 internal_ptr
->u
.syment
._n
._n_n
._n_offset
= (bfd_hostptr_t
)
1764 (debug_section
+ internal_ptr
->u
.syment
._n
._n_n
._n_offset
);
1767 internal_ptr
+= internal_ptr
->u
.syment
.n_numaux
;
1770 obj_raw_syments (abfd
) = internal
;
1771 BFD_ASSERT (obj_raw_syment_count (abfd
)
1772 == (unsigned int) (internal_ptr
- internal
));
1778 coff_get_reloc_upper_bound (bfd
*abfd
, sec_ptr asect
)
1780 if (bfd_get_format (abfd
) != bfd_object
)
1782 bfd_set_error (bfd_error_invalid_operation
);
1785 return (asect
->reloc_count
+ 1) * sizeof (arelent
*);
1789 coff_make_empty_symbol (bfd
*abfd
)
1791 bfd_size_type amt
= sizeof (coff_symbol_type
);
1792 coff_symbol_type
*new = bfd_zalloc (abfd
, amt
);
1796 new->symbol
.section
= 0;
1799 new->done_lineno
= FALSE
;
1800 new->symbol
.the_bfd
= abfd
;
1802 return & new->symbol
;
1805 /* Make a debugging symbol. */
1808 coff_bfd_make_debug_symbol (bfd
*abfd
,
1809 void * ptr ATTRIBUTE_UNUSED
,
1810 unsigned long sz ATTRIBUTE_UNUSED
)
1812 bfd_size_type amt
= sizeof (coff_symbol_type
);
1813 coff_symbol_type
*new = bfd_alloc (abfd
, amt
);
1817 /* @@ The 10 is a guess at a plausible maximum number of aux entries
1818 (but shouldn't be a constant). */
1819 amt
= sizeof (combined_entry_type
) * 10;
1820 new->native
= bfd_zalloc (abfd
, amt
);
1823 new->symbol
.section
= bfd_abs_section_ptr
;
1824 new->symbol
.flags
= BSF_DEBUGGING
;
1826 new->done_lineno
= FALSE
;
1827 new->symbol
.the_bfd
= abfd
;
1829 return & new->symbol
;
1833 coff_get_symbol_info (bfd
*abfd
, asymbol
*symbol
, symbol_info
*ret
)
1835 bfd_symbol_info (symbol
, ret
);
1837 if (coffsymbol (symbol
)->native
!= NULL
1838 && coffsymbol (symbol
)->native
->fix_value
)
1839 ret
->value
= coffsymbol (symbol
)->native
->u
.syment
.n_value
-
1840 (bfd_hostptr_t
) obj_raw_syments (abfd
);
1843 /* Return the COFF syment for a symbol. */
1846 bfd_coff_get_syment (bfd
*abfd
,
1848 struct internal_syment
*psyment
)
1850 coff_symbol_type
*csym
;
1852 csym
= coff_symbol_from (abfd
, symbol
);
1853 if (csym
== NULL
|| csym
->native
== NULL
)
1855 bfd_set_error (bfd_error_invalid_operation
);
1859 *psyment
= csym
->native
->u
.syment
;
1861 if (csym
->native
->fix_value
)
1862 psyment
->n_value
= psyment
->n_value
-
1863 (bfd_hostptr_t
) obj_raw_syments (abfd
);
1865 /* FIXME: We should handle fix_line here. */
1870 /* Return the COFF auxent for a symbol. */
1873 bfd_coff_get_auxent (bfd
*abfd
,
1876 union internal_auxent
*pauxent
)
1878 coff_symbol_type
*csym
;
1879 combined_entry_type
*ent
;
1881 csym
= coff_symbol_from (abfd
, symbol
);
1884 || csym
->native
== NULL
1885 || indx
>= csym
->native
->u
.syment
.n_numaux
)
1887 bfd_set_error (bfd_error_invalid_operation
);
1891 ent
= csym
->native
+ indx
+ 1;
1893 *pauxent
= ent
->u
.auxent
;
1896 pauxent
->x_sym
.x_tagndx
.l
=
1897 ((combined_entry_type
*) pauxent
->x_sym
.x_tagndx
.p
1898 - obj_raw_syments (abfd
));
1901 pauxent
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
=
1902 ((combined_entry_type
*) pauxent
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
1903 - obj_raw_syments (abfd
));
1905 if (ent
->fix_scnlen
)
1906 pauxent
->x_csect
.x_scnlen
.l
=
1907 ((combined_entry_type
*) pauxent
->x_csect
.x_scnlen
.p
1908 - obj_raw_syments (abfd
));
1913 /* Print out information about COFF symbol. */
1916 coff_print_symbol (bfd
*abfd
,
1919 bfd_print_symbol_type how
)
1921 FILE * file
= (FILE *) filep
;
1925 case bfd_print_symbol_name
:
1926 fprintf (file
, "%s", symbol
->name
);
1929 case bfd_print_symbol_more
:
1930 fprintf (file
, "coff %s %s",
1931 coffsymbol (symbol
)->native
? "n" : "g",
1932 coffsymbol (symbol
)->lineno
? "l" : " ");
1935 case bfd_print_symbol_all
:
1936 if (coffsymbol (symbol
)->native
)
1940 combined_entry_type
*combined
= coffsymbol (symbol
)->native
;
1941 combined_entry_type
*root
= obj_raw_syments (abfd
);
1942 struct lineno_cache_entry
*l
= coffsymbol (symbol
)->lineno
;
1944 fprintf (file
, "[%3ld]", (long) (combined
- root
));
1946 if (! combined
->fix_value
)
1947 val
= (bfd_vma
) combined
->u
.syment
.n_value
;
1949 val
= combined
->u
.syment
.n_value
- (bfd_hostptr_t
) root
;
1951 fprintf (file
, "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x",
1952 combined
->u
.syment
.n_scnum
,
1953 combined
->u
.syment
.n_flags
,
1954 combined
->u
.syment
.n_type
,
1955 combined
->u
.syment
.n_sclass
,
1956 combined
->u
.syment
.n_numaux
);
1958 /* fprintf_vma() on a 64-bit enabled host will always print a 64-bit
1959 value, but really we want to display the address in the target's
1960 address size. Since we do not have a field in the bfd structure
1961 to tell us this, we take a guess, based on the target's name. */
1962 if (strstr (bfd_get_target (abfd
), "64") == NULL
)
1963 fprintf (file
, "%08lx", (unsigned long) (val
& 0xffffffff));
1966 fprintf_vma (file
, val
);
1967 fprintf (file
, " %s", symbol
->name
);
1969 for (aux
= 0; aux
< combined
->u
.syment
.n_numaux
; aux
++)
1971 combined_entry_type
*auxp
= combined
+ aux
+ 1;
1975 tagndx
= auxp
->u
.auxent
.x_sym
.x_tagndx
.p
- root
;
1977 tagndx
= auxp
->u
.auxent
.x_sym
.x_tagndx
.l
;
1979 fprintf (file
, "\n");
1981 if (bfd_coff_print_aux (abfd
, file
, root
, combined
, auxp
, aux
))
1984 switch (combined
->u
.syment
.n_sclass
)
1987 fprintf (file
, "File ");
1991 if (combined
->u
.syment
.n_type
== T_NULL
)
1992 /* Probably a section symbol ? */
1994 fprintf (file
, "AUX scnlen 0x%lx nreloc %d nlnno %d",
1995 (unsigned long) auxp
->u
.auxent
.x_scn
.x_scnlen
,
1996 auxp
->u
.auxent
.x_scn
.x_nreloc
,
1997 auxp
->u
.auxent
.x_scn
.x_nlinno
);
1998 if (auxp
->u
.auxent
.x_scn
.x_checksum
!= 0
1999 || auxp
->u
.auxent
.x_scn
.x_associated
!= 0
2000 || auxp
->u
.auxent
.x_scn
.x_comdat
!= 0)
2001 fprintf (file
, " checksum 0x%lx assoc %d comdat %d",
2002 auxp
->u
.auxent
.x_scn
.x_checksum
,
2003 auxp
->u
.auxent
.x_scn
.x_associated
,
2004 auxp
->u
.auxent
.x_scn
.x_comdat
);
2007 /* Otherwise fall through. */
2009 if (ISFCN (combined
->u
.syment
.n_type
))
2014 next
= (auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
2017 next
= auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
;
2018 llnos
= auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
;
2020 "AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld",
2022 (unsigned long) auxp
->u
.auxent
.x_sym
.x_misc
.x_fsize
,
2026 /* Otherwise fall through. */
2028 fprintf (file
, "AUX lnno %d size 0x%x tagndx %ld",
2029 auxp
->u
.auxent
.x_sym
.x_misc
.x_lnsz
.x_lnno
,
2030 auxp
->u
.auxent
.x_sym
.x_misc
.x_lnsz
.x_size
,
2033 fprintf (file
, " endndx %ld",
2035 (auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
2043 fprintf (file
, "\n%s :", l
->u
.sym
->name
);
2045 while (l
->line_number
)
2047 fprintf (file
, "\n%4d : ", l
->line_number
);
2048 fprintf_vma (file
, l
->u
.offset
+ symbol
->section
->vma
);
2055 bfd_print_symbol_vandf (abfd
, (void *) file
, symbol
);
2056 fprintf (file
, " %-5s %s %s %s",
2057 symbol
->section
->name
,
2058 coffsymbol (symbol
)->native
? "n" : "g",
2059 coffsymbol (symbol
)->lineno
? "l" : " ",
2065 /* Return whether a symbol name implies a local symbol. In COFF,
2066 local symbols generally start with ``.L''. Most targets use this
2067 function for the is_local_label_name entry point, but some may
2071 _bfd_coff_is_local_label_name (bfd
*abfd ATTRIBUTE_UNUSED
,
2074 return name
[0] == '.' && name
[1] == 'L';
2077 /* Provided a BFD, a section and an offset (in bytes, not octets) into the
2078 section, calculate and return the name of the source file and the line
2079 nearest to the wanted location. */
2082 coff_find_nearest_line (bfd
*abfd
,
2086 const char **filename_ptr
,
2087 const char **functionname_ptr
,
2088 unsigned int *line_ptr
)
2092 unsigned int line_base
;
2093 coff_data_type
*cof
= coff_data (abfd
);
2094 /* Run through the raw syments if available. */
2095 combined_entry_type
*p
;
2096 combined_entry_type
*pend
;
2098 struct coff_section_tdata
*sec_data
;
2101 /* Before looking through the symbol table, try to use a .stab
2102 section to find the information. */
2103 if (! _bfd_stab_section_find_nearest_line (abfd
, symbols
, section
, offset
,
2104 &found
, filename_ptr
,
2105 functionname_ptr
, line_ptr
,
2106 &coff_data(abfd
)->line_info
))
2112 /* Also try examining DWARF2 debugging information. */
2113 if (_bfd_dwarf2_find_nearest_line (abfd
, section
, symbols
, offset
,
2114 filename_ptr
, functionname_ptr
,
2116 &coff_data(abfd
)->dwarf2_find_line_info
))
2120 *functionname_ptr
= 0;
2123 /* Don't try and find line numbers in a non coff file. */
2124 if (!bfd_family_coff (abfd
))
2130 /* Find the first C_FILE symbol. */
2131 p
= cof
->raw_syments
;
2135 pend
= p
+ cof
->raw_syment_count
;
2138 if (p
->u
.syment
.n_sclass
== C_FILE
)
2140 p
+= 1 + p
->u
.syment
.n_numaux
;
2148 /* Look through the C_FILE symbols to find the best one. */
2149 sec_vma
= bfd_get_section_vma (abfd
, section
);
2150 *filename_ptr
= (char *) p
->u
.syment
._n
._n_n
._n_offset
;
2151 maxdiff
= (bfd_vma
) 0 - (bfd_vma
) 1;
2154 combined_entry_type
*p2
;
2156 for (p2
= p
+ 1 + p
->u
.syment
.n_numaux
;
2158 p2
+= 1 + p2
->u
.syment
.n_numaux
)
2160 if (p2
->u
.syment
.n_scnum
> 0
2162 == coff_section_from_bfd_index (abfd
,
2163 p2
->u
.syment
.n_scnum
)))
2165 if (p2
->u
.syment
.n_sclass
== C_FILE
)
2172 /* We use <= MAXDIFF here so that if we get a zero length
2173 file, we actually use the next file entry. */
2175 && offset
+ sec_vma
>= (bfd_vma
) p2
->u
.syment
.n_value
2176 && offset
+ sec_vma
- (bfd_vma
) p2
->u
.syment
.n_value
<= maxdiff
)
2178 *filename_ptr
= (char *) p
->u
.syment
._n
._n_n
._n_offset
;
2179 maxdiff
= offset
+ sec_vma
- p2
->u
.syment
.n_value
;
2182 /* Avoid endless loops on erroneous files by ensuring that
2183 we always move forward in the file. */
2184 if (p
>= cof
->raw_syments
+ p
->u
.syment
.n_value
)
2187 p
= cof
->raw_syments
+ p
->u
.syment
.n_value
;
2188 if (p
> pend
|| p
->u
.syment
.n_sclass
!= C_FILE
)
2193 /* Now wander though the raw linenumbers of the section. */
2194 /* If we have been called on this section before, and the offset we
2195 want is further down then we can prime the lookup loop. */
2196 sec_data
= coff_section_data (abfd
, section
);
2197 if (sec_data
!= NULL
2199 && offset
>= sec_data
->offset
)
2202 *functionname_ptr
= sec_data
->function
;
2203 line_base
= sec_data
->line_base
;
2211 if (section
->lineno
!= NULL
)
2213 bfd_vma last_value
= 0;
2215 l
= §ion
->lineno
[i
];
2217 for (; i
< section
->lineno_count
; i
++)
2219 if (l
->line_number
== 0)
2221 /* Get the symbol this line number points at. */
2222 coff_symbol_type
*coff
= (coff_symbol_type
*) (l
->u
.sym
);
2223 if (coff
->symbol
.value
> offset
)
2225 *functionname_ptr
= coff
->symbol
.name
;
2226 last_value
= coff
->symbol
.value
;
2229 combined_entry_type
*s
= coff
->native
;
2230 s
= s
+ 1 + s
->u
.syment
.n_numaux
;
2232 /* In XCOFF a debugging symbol can follow the
2234 if (s
->u
.syment
.n_scnum
== N_DEBUG
)
2235 s
= s
+ 1 + s
->u
.syment
.n_numaux
;
2237 /* S should now point to the .bf of the function. */
2238 if (s
->u
.syment
.n_numaux
)
2240 /* The linenumber is stored in the auxent. */
2241 union internal_auxent
*a
= &((s
+ 1)->u
.auxent
);
2242 line_base
= a
->x_sym
.x_misc
.x_lnsz
.x_lnno
;
2243 *line_ptr
= line_base
;
2249 if (l
->u
.offset
> offset
)
2251 *line_ptr
= l
->line_number
+ line_base
- 1;
2256 /* If we fell off the end of the loop, then assume that this
2257 symbol has no line number info. Otherwise, symbols with no
2258 line number info get reported with the line number of the
2259 last line of the last symbol which does have line number
2260 info. We use 0x100 as a slop to account for cases where the
2261 last line has executable code. */
2262 if (i
>= section
->lineno_count
2264 && offset
- last_value
> 0x100)
2266 *functionname_ptr
= NULL
;
2271 /* Cache the results for the next call. */
2272 if (sec_data
== NULL
&& section
->owner
== abfd
)
2274 amt
= sizeof (struct coff_section_tdata
);
2275 section
->used_by_bfd
= bfd_zalloc (abfd
, amt
);
2276 sec_data
= (struct coff_section_tdata
*) section
->used_by_bfd
;
2278 if (sec_data
!= NULL
)
2280 sec_data
->offset
= offset
;
2281 sec_data
->i
= i
- 1;
2282 sec_data
->function
= *functionname_ptr
;
2283 sec_data
->line_base
= line_base
;
2290 coff_find_inliner_info (bfd
*abfd
,
2291 const char **filename_ptr
,
2292 const char **functionname_ptr
,
2293 unsigned int *line_ptr
)
2297 found
= _bfd_dwarf2_find_inliner_info (abfd
, filename_ptr
,
2298 functionname_ptr
, line_ptr
,
2299 &coff_data(abfd
)->dwarf2_find_line_info
);
2304 coff_sizeof_headers (bfd
*abfd
, struct bfd_link_info
*info
)
2308 if (!info
->relocatable
)
2309 size
= bfd_coff_filhsz (abfd
) + bfd_coff_aoutsz (abfd
);
2311 size
= bfd_coff_filhsz (abfd
);
2313 size
+= abfd
->section_count
* bfd_coff_scnhsz (abfd
);
2317 /* Change the class of a coff symbol held by BFD. */
2320 bfd_coff_set_symbol_class (bfd
* abfd
,
2324 coff_symbol_type
* csym
;
2326 csym
= coff_symbol_from (abfd
, symbol
);
2329 bfd_set_error (bfd_error_invalid_operation
);
2332 else if (csym
->native
== NULL
)
2334 /* This is an alien symbol which no native coff backend data.
2335 We cheat here by creating a fake native entry for it and
2336 then filling in the class. This code is based on that in
2337 coff_write_alien_symbol(). */
2339 combined_entry_type
* native
;
2340 bfd_size_type amt
= sizeof (* native
);
2342 native
= bfd_zalloc (abfd
, amt
);
2346 native
->u
.syment
.n_type
= T_NULL
;
2347 native
->u
.syment
.n_sclass
= class;
2349 if (bfd_is_und_section (symbol
->section
))
2351 native
->u
.syment
.n_scnum
= N_UNDEF
;
2352 native
->u
.syment
.n_value
= symbol
->value
;
2354 else if (bfd_is_com_section (symbol
->section
))
2356 native
->u
.syment
.n_scnum
= N_UNDEF
;
2357 native
->u
.syment
.n_value
= symbol
->value
;
2361 native
->u
.syment
.n_scnum
=
2362 symbol
->section
->output_section
->target_index
;
2363 native
->u
.syment
.n_value
= (symbol
->value
2364 + symbol
->section
->output_offset
);
2365 if (! obj_pe (abfd
))
2366 native
->u
.syment
.n_value
+= symbol
->section
->output_section
->vma
;
2368 /* Copy the any flags from the file header into the symbol.
2370 native
->u
.syment
.n_flags
= bfd_asymbol_bfd (& csym
->symbol
)->flags
;
2373 csym
->native
= native
;
2376 csym
->native
->u
.syment
.n_sclass
= class;
2381 struct coff_comdat_info
*
2382 bfd_coff_get_comdat_section (bfd
*abfd
, struct bfd_section
*sec
)
2384 if (bfd_get_flavour (abfd
) == bfd_target_coff_flavour
2385 && coff_section_data (abfd
, sec
) != NULL
)
2386 return coff_section_data (abfd
, sec
)->comdat
;