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
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. */
63 if (bfd_coff_long_section_names (abfd
)
64 && hdr
->s_name
[0] == '/')
71 memcpy (buf
, hdr
->s_name
+ 1, SCNNMLEN
- 1);
72 buf
[SCNNMLEN
- 1] = '\0';
73 strindex
= strtol (buf
, &p
, 10);
74 if (*p
== '\0' && strindex
>= 0)
76 strings
= _bfd_coff_read_string_table (abfd
);
79 /* FIXME: For extra safety, we should make sure that
80 strindex does not run us past the end, but right now we
81 don't know the length of the string table. */
83 name
= bfd_alloc (abfd
, (bfd_size_type
) strlen (strings
) + 1);
86 strcpy (name
, strings
);
92 /* Assorted wastage to null-terminate the name, thanks AT&T! */
93 name
= bfd_alloc (abfd
, (bfd_size_type
) sizeof (hdr
->s_name
) + 1);
96 strncpy (name
, (char *) &hdr
->s_name
[0], sizeof (hdr
->s_name
));
97 name
[sizeof (hdr
->s_name
)] = 0;
100 return_section
= bfd_make_section_anyway (abfd
, name
);
101 if (return_section
== NULL
)
104 return_section
->vma
= hdr
->s_vaddr
;
105 return_section
->lma
= hdr
->s_paddr
;
106 return_section
->size
= hdr
->s_size
;
107 return_section
->filepos
= hdr
->s_scnptr
;
108 return_section
->rel_filepos
= hdr
->s_relptr
;
109 return_section
->reloc_count
= hdr
->s_nreloc
;
111 bfd_coff_set_alignment_hook (abfd
, return_section
, hdr
);
113 return_section
->line_filepos
= hdr
->s_lnnoptr
;
115 return_section
->lineno_count
= hdr
->s_nlnno
;
116 return_section
->userdata
= NULL
;
117 return_section
->next
= NULL
;
118 return_section
->target_index
= target_index
;
120 if (! bfd_coff_styp_to_sec_flags_hook (abfd
, hdr
, name
, return_section
,
124 return_section
->flags
= flags
;
126 /* At least on i386-coff, the line number count for a shared library
127 section must be ignored. */
128 if ((return_section
->flags
& SEC_COFF_SHARED_LIBRARY
) != 0)
129 return_section
->lineno_count
= 0;
131 if (hdr
->s_nreloc
!= 0)
132 return_section
->flags
|= SEC_RELOC
;
133 /* FIXME: should this check 'hdr->s_size > 0'. */
134 if (hdr
->s_scnptr
!= 0)
135 return_section
->flags
|= SEC_HAS_CONTENTS
;
140 /* Read in a COFF object and make it into a BFD. This is used by
143 static const bfd_target
*
144 coff_real_object_p (bfd
*abfd
,
146 struct internal_filehdr
*internal_f
,
147 struct internal_aouthdr
*internal_a
)
149 flagword oflags
= abfd
->flags
;
150 bfd_vma ostart
= bfd_get_start_address (abfd
);
153 bfd_size_type readsize
; /* Length of file_info. */
155 char *external_sections
;
157 if (!(internal_f
->f_flags
& F_RELFLG
))
158 abfd
->flags
|= HAS_RELOC
;
159 if ((internal_f
->f_flags
& F_EXEC
))
160 abfd
->flags
|= EXEC_P
;
161 if (!(internal_f
->f_flags
& F_LNNO
))
162 abfd
->flags
|= HAS_LINENO
;
163 if (!(internal_f
->f_flags
& F_LSYMS
))
164 abfd
->flags
|= HAS_LOCALS
;
166 /* FIXME: How can we set D_PAGED correctly? */
167 if ((internal_f
->f_flags
& F_EXEC
) != 0)
168 abfd
->flags
|= D_PAGED
;
170 bfd_get_symcount (abfd
) = internal_f
->f_nsyms
;
171 if (internal_f
->f_nsyms
)
172 abfd
->flags
|= HAS_SYMS
;
174 if (internal_a
!= (struct internal_aouthdr
*) NULL
)
175 bfd_get_start_address (abfd
) = internal_a
->entry
;
177 bfd_get_start_address (abfd
) = 0;
179 /* Set up the tdata area. ECOFF uses its own routine, and overrides
181 tdata_save
= abfd
->tdata
.any
;
182 tdata
= bfd_coff_mkobject_hook (abfd
, (void *) internal_f
, (void *) internal_a
);
186 scnhsz
= bfd_coff_scnhsz (abfd
);
187 readsize
= (bfd_size_type
) nscns
* scnhsz
;
188 external_sections
= bfd_alloc (abfd
, readsize
);
189 if (!external_sections
)
192 if (bfd_bread ((void *) external_sections
, readsize
, abfd
) != readsize
)
195 /* Set the arch/mach *before* swapping in sections; section header swapping
196 may depend on arch/mach info. */
197 if (! bfd_coff_set_arch_mach_hook (abfd
, (void *) internal_f
))
200 /* Now copy data as required; construct all asections etc. */
204 for (i
= 0; i
< nscns
; i
++)
206 struct internal_scnhdr tmp
;
207 bfd_coff_swap_scnhdr_in (abfd
,
208 (void *) (external_sections
+ i
* scnhsz
),
210 if (! make_a_section_from_file (abfd
, &tmp
, i
+ 1))
218 bfd_release (abfd
, tdata
);
220 abfd
->tdata
.any
= tdata_save
;
221 abfd
->flags
= oflags
;
222 bfd_get_start_address (abfd
) = ostart
;
223 return (const bfd_target
*) NULL
;
226 /* Turn a COFF file into a BFD, but fail with bfd_error_wrong_format if it is
227 not a COFF file. This is also used by ECOFF. */
230 coff_object_p (bfd
*abfd
)
232 bfd_size_type filhsz
;
233 bfd_size_type aoutsz
;
236 struct internal_filehdr internal_f
;
237 struct internal_aouthdr internal_a
;
239 /* Figure out how much to read. */
240 filhsz
= bfd_coff_filhsz (abfd
);
241 aoutsz
= bfd_coff_aoutsz (abfd
);
243 filehdr
= bfd_alloc (abfd
, filhsz
);
246 if (bfd_bread (filehdr
, filhsz
, abfd
) != filhsz
)
248 if (bfd_get_error () != bfd_error_system_call
)
249 bfd_set_error (bfd_error_wrong_format
);
250 bfd_release (abfd
, filehdr
);
253 bfd_coff_swap_filehdr_in (abfd
, filehdr
, &internal_f
);
254 bfd_release (abfd
, filehdr
);
256 /* The XCOFF format has two sizes for the f_opthdr. SMALL_AOUTSZ
257 (less than aoutsz) used in object files and AOUTSZ (equal to
258 aoutsz) in executables. The bfd_coff_swap_aouthdr_in function
259 expects this header to be aoutsz bytes in length, so we use that
260 value in the call to bfd_alloc below. But we must be careful to
261 only read in f_opthdr bytes in the call to bfd_bread. We should
262 also attempt to catch corrupt or non-COFF binaries with a strange
263 value for f_opthdr. */
264 if (! bfd_coff_bad_format_hook (abfd
, &internal_f
)
265 || internal_f
.f_opthdr
> aoutsz
)
267 bfd_set_error (bfd_error_wrong_format
);
270 nscns
= internal_f
.f_nscns
;
272 if (internal_f
.f_opthdr
)
276 opthdr
= bfd_alloc (abfd
, aoutsz
);
279 if (bfd_bread (opthdr
, (bfd_size_type
) internal_f
.f_opthdr
, abfd
)
280 != internal_f
.f_opthdr
)
282 bfd_release (abfd
, opthdr
);
285 bfd_coff_swap_aouthdr_in (abfd
, opthdr
, (void *) &internal_a
);
286 bfd_release (abfd
, opthdr
);
289 return coff_real_object_p (abfd
, nscns
, &internal_f
,
290 (internal_f
.f_opthdr
!= 0
292 : (struct internal_aouthdr
*) NULL
));
295 /* Get the BFD section from a COFF symbol section number. */
298 coff_section_from_bfd_index (bfd
*abfd
, int index
)
300 struct bfd_section
*answer
= abfd
->sections
;
303 return bfd_abs_section_ptr
;
304 if (index
== N_UNDEF
)
305 return bfd_und_section_ptr
;
306 if (index
== N_DEBUG
)
307 return bfd_abs_section_ptr
;
311 if (answer
->target_index
== index
)
313 answer
= answer
->next
;
316 /* We should not reach this point, but the SCO 3.2v4 /lib/libc_s.a
317 has a bad symbol table in biglitpow.o. */
318 return bfd_und_section_ptr
;
321 /* Get the upper bound of a COFF symbol table. */
324 coff_get_symtab_upper_bound (bfd
*abfd
)
326 if (!bfd_coff_slurp_symbol_table (abfd
))
329 return (bfd_get_symcount (abfd
) + 1) * (sizeof (coff_symbol_type
*));
332 /* Canonicalize a COFF symbol table. */
335 coff_canonicalize_symtab (bfd
*abfd
, asymbol
**alocation
)
337 unsigned int counter
;
338 coff_symbol_type
*symbase
;
339 coff_symbol_type
**location
= (coff_symbol_type
**) alocation
;
341 if (!bfd_coff_slurp_symbol_table (abfd
))
344 symbase
= obj_symbols (abfd
);
345 counter
= bfd_get_symcount (abfd
);
346 while (counter
-- > 0)
347 *location
++ = symbase
++;
351 return bfd_get_symcount (abfd
);
354 /* Get the name of a symbol. The caller must pass in a buffer of size
358 _bfd_coff_internal_syment_name (bfd
*abfd
,
359 const struct internal_syment
*sym
,
362 /* FIXME: It's not clear this will work correctly if sizeof
364 if (sym
->_n
._n_n
._n_zeroes
!= 0
365 || sym
->_n
._n_n
._n_offset
== 0)
367 memcpy (buf
, sym
->_n
._n_name
, SYMNMLEN
);
368 buf
[SYMNMLEN
] = '\0';
375 BFD_ASSERT (sym
->_n
._n_n
._n_offset
>= STRING_SIZE_SIZE
);
376 strings
= obj_coff_strings (abfd
);
379 strings
= _bfd_coff_read_string_table (abfd
);
383 return strings
+ sym
->_n
._n_n
._n_offset
;
387 /* Read in and swap the relocs. This returns a buffer holding the
388 relocs for section SEC in file ABFD. If CACHE is TRUE and
389 INTERNAL_RELOCS is NULL, the relocs read in will be saved in case
390 the function is called again. If EXTERNAL_RELOCS is not NULL, it
391 is a buffer large enough to hold the unswapped relocs. If
392 INTERNAL_RELOCS is not NULL, it is a buffer large enough to hold
393 the swapped relocs. If REQUIRE_INTERNAL is TRUE, then the return
394 value must be INTERNAL_RELOCS. The function returns NULL on error. */
396 struct internal_reloc
*
397 _bfd_coff_read_internal_relocs (bfd
*abfd
,
400 bfd_byte
*external_relocs
,
401 bfd_boolean require_internal
,
402 struct internal_reloc
*internal_relocs
)
405 bfd_byte
*free_external
= NULL
;
406 struct internal_reloc
*free_internal
= NULL
;
409 struct internal_reloc
*irel
;
412 if (sec
->reloc_count
== 0)
413 return internal_relocs
; /* Nothing to do. */
415 if (coff_section_data (abfd
, sec
) != NULL
416 && coff_section_data (abfd
, sec
)->relocs
!= NULL
)
418 if (! require_internal
)
419 return coff_section_data (abfd
, sec
)->relocs
;
420 memcpy (internal_relocs
, coff_section_data (abfd
, sec
)->relocs
,
421 sec
->reloc_count
* sizeof (struct internal_reloc
));
422 return internal_relocs
;
425 relsz
= bfd_coff_relsz (abfd
);
427 amt
= sec
->reloc_count
* relsz
;
428 if (external_relocs
== NULL
)
430 free_external
= bfd_malloc (amt
);
431 if (free_external
== NULL
)
433 external_relocs
= free_external
;
436 if (bfd_seek (abfd
, sec
->rel_filepos
, SEEK_SET
) != 0
437 || bfd_bread (external_relocs
, amt
, abfd
) != amt
)
440 if (internal_relocs
== NULL
)
442 amt
= sec
->reloc_count
;
443 amt
*= sizeof (struct internal_reloc
);
444 free_internal
= bfd_malloc (amt
);
445 if (free_internal
== NULL
)
447 internal_relocs
= free_internal
;
450 /* Swap in the relocs. */
451 erel
= external_relocs
;
452 erel_end
= erel
+ relsz
* sec
->reloc_count
;
453 irel
= internal_relocs
;
454 for (; erel
< erel_end
; erel
+= relsz
, irel
++)
455 bfd_coff_swap_reloc_in (abfd
, (void *) erel
, (void *) irel
);
457 if (free_external
!= NULL
)
459 free (free_external
);
460 free_external
= NULL
;
463 if (cache
&& free_internal
!= NULL
)
465 if (coff_section_data (abfd
, sec
) == NULL
)
467 amt
= sizeof (struct coff_section_tdata
);
468 sec
->used_by_bfd
= bfd_zalloc (abfd
, amt
);
469 if (sec
->used_by_bfd
== NULL
)
471 coff_section_data (abfd
, sec
)->contents
= NULL
;
473 coff_section_data (abfd
, sec
)->relocs
= free_internal
;
476 return internal_relocs
;
479 if (free_external
!= NULL
)
480 free (free_external
);
481 if (free_internal
!= NULL
)
482 free (free_internal
);
486 /* Set lineno_count for the output sections of a COFF file. */
489 coff_count_linenumbers (bfd
*abfd
)
491 unsigned int limit
= bfd_get_symcount (abfd
);
499 /* This may be from the backend linker, in which case the
500 lineno_count in the sections is correct. */
501 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
502 total
+= s
->lineno_count
;
506 for (s
= abfd
->sections
; s
!= NULL
; s
= s
->next
)
507 BFD_ASSERT (s
->lineno_count
== 0);
509 for (p
= abfd
->outsymbols
, i
= 0; i
< limit
; i
++, p
++)
511 asymbol
*q_maybe
= *p
;
513 if (bfd_family_coff (bfd_asymbol_bfd (q_maybe
)))
515 coff_symbol_type
*q
= coffsymbol (q_maybe
);
517 /* The AIX 4.1 compiler can sometimes generate line numbers
518 attached to debugging symbols. We try to simply ignore
520 if (q
->lineno
!= NULL
521 && q
->symbol
.section
->owner
!= NULL
)
523 /* This symbol has line numbers. Increment the owning
524 section's linenumber count. */
525 alent
*l
= q
->lineno
;
529 asection
* sec
= q
->symbol
.section
->output_section
;
531 /* Do not try to update fields in read-only sections. */
532 if (! bfd_is_const_section (sec
))
533 sec
->lineno_count
++;
538 while (l
->line_number
!= 0);
546 /* Takes a bfd and a symbol, returns a pointer to the coff specific
547 area of the symbol if there is one. */
550 coff_symbol_from (bfd
*ignore_abfd ATTRIBUTE_UNUSED
,
553 if (!bfd_family_coff (bfd_asymbol_bfd (symbol
)))
554 return (coff_symbol_type
*) NULL
;
556 if (bfd_asymbol_bfd (symbol
)->tdata
.coff_obj_data
== (coff_data_type
*) NULL
)
557 return (coff_symbol_type
*) NULL
;
559 return (coff_symbol_type
*) symbol
;
563 fixup_symbol_value (bfd
*abfd
,
564 coff_symbol_type
*coff_symbol_ptr
,
565 struct internal_syment
*syment
)
567 /* Normalize the symbol flags. */
568 if (coff_symbol_ptr
->symbol
.section
569 && bfd_is_com_section (coff_symbol_ptr
->symbol
.section
))
571 /* A common symbol is undefined with a value. */
572 syment
->n_scnum
= N_UNDEF
;
573 syment
->n_value
= coff_symbol_ptr
->symbol
.value
;
575 else if ((coff_symbol_ptr
->symbol
.flags
& BSF_DEBUGGING
) != 0
576 && (coff_symbol_ptr
->symbol
.flags
& BSF_DEBUGGING_RELOC
) == 0)
578 syment
->n_value
= coff_symbol_ptr
->symbol
.value
;
580 else if (bfd_is_und_section (coff_symbol_ptr
->symbol
.section
))
582 syment
->n_scnum
= N_UNDEF
;
585 /* FIXME: Do we need to handle the absolute section here? */
588 if (coff_symbol_ptr
->symbol
.section
)
591 coff_symbol_ptr
->symbol
.section
->output_section
->target_index
;
593 syment
->n_value
= (coff_symbol_ptr
->symbol
.value
594 + coff_symbol_ptr
->symbol
.section
->output_offset
);
597 syment
->n_value
+= (syment
->n_sclass
== C_STATLAB
)
598 ? coff_symbol_ptr
->symbol
.section
->output_section
->lma
599 : coff_symbol_ptr
->symbol
.section
->output_section
->vma
;
605 /* This can happen, but I don't know why yet (steve@cygnus.com) */
606 syment
->n_scnum
= N_ABS
;
607 syment
->n_value
= coff_symbol_ptr
->symbol
.value
;
612 /* Run through all the symbols in the symbol table and work out what
613 their indexes into the symbol table will be when output.
615 Coff requires that each C_FILE symbol points to the next one in the
616 chain, and that the last one points to the first external symbol. We
620 coff_renumber_symbols (bfd
*bfd_ptr
, int *first_undef
)
622 unsigned int symbol_count
= bfd_get_symcount (bfd_ptr
);
623 asymbol
**symbol_ptr_ptr
= bfd_ptr
->outsymbols
;
624 unsigned int native_index
= 0;
625 struct internal_syment
*last_file
= NULL
;
626 unsigned int symbol_index
;
628 /* COFF demands that undefined symbols come after all other symbols.
629 Since we don't need to impose this extra knowledge on all our
630 client programs, deal with that here. Sort the symbol table;
631 just move the undefined symbols to the end, leaving the rest
632 alone. The O'Reilly book says that defined global symbols come
633 at the end before the undefined symbols, so we do that here as
635 /* @@ Do we have some condition we could test for, so we don't always
636 have to do this? I don't think relocatability is quite right, but
637 I'm not certain. [raeburn:19920508.1711EST] */
643 amt
= sizeof (asymbol
*) * ((bfd_size_type
) symbol_count
+ 1);
644 newsyms
= bfd_alloc (bfd_ptr
, amt
);
647 bfd_ptr
->outsymbols
= newsyms
;
648 for (i
= 0; i
< symbol_count
; i
++)
649 if ((symbol_ptr_ptr
[i
]->flags
& BSF_NOT_AT_END
) != 0
650 || (!bfd_is_und_section (symbol_ptr_ptr
[i
]->section
)
651 && !bfd_is_com_section (symbol_ptr_ptr
[i
]->section
)
652 && ((symbol_ptr_ptr
[i
]->flags
& BSF_FUNCTION
) != 0
653 || ((symbol_ptr_ptr
[i
]->flags
& (BSF_GLOBAL
| BSF_WEAK
))
655 *newsyms
++ = symbol_ptr_ptr
[i
];
657 for (i
= 0; i
< symbol_count
; i
++)
658 if ((symbol_ptr_ptr
[i
]->flags
& BSF_NOT_AT_END
) == 0
659 && !bfd_is_und_section (symbol_ptr_ptr
[i
]->section
)
660 && (bfd_is_com_section (symbol_ptr_ptr
[i
]->section
)
661 || ((symbol_ptr_ptr
[i
]->flags
& BSF_FUNCTION
) == 0
662 && ((symbol_ptr_ptr
[i
]->flags
& (BSF_GLOBAL
| BSF_WEAK
))
664 *newsyms
++ = symbol_ptr_ptr
[i
];
666 *first_undef
= newsyms
- bfd_ptr
->outsymbols
;
668 for (i
= 0; i
< symbol_count
; i
++)
669 if ((symbol_ptr_ptr
[i
]->flags
& BSF_NOT_AT_END
) == 0
670 && bfd_is_und_section (symbol_ptr_ptr
[i
]->section
))
671 *newsyms
++ = symbol_ptr_ptr
[i
];
672 *newsyms
= (asymbol
*) NULL
;
673 symbol_ptr_ptr
= bfd_ptr
->outsymbols
;
676 for (symbol_index
= 0; symbol_index
< symbol_count
; symbol_index
++)
678 coff_symbol_type
*coff_symbol_ptr
= coff_symbol_from (bfd_ptr
, symbol_ptr_ptr
[symbol_index
]);
679 symbol_ptr_ptr
[symbol_index
]->udata
.i
= symbol_index
;
680 if (coff_symbol_ptr
&& coff_symbol_ptr
->native
)
682 combined_entry_type
*s
= coff_symbol_ptr
->native
;
685 if (s
->u
.syment
.n_sclass
== C_FILE
)
687 if (last_file
!= NULL
)
688 last_file
->n_value
= native_index
;
689 last_file
= &(s
->u
.syment
);
692 /* Modify the symbol values according to their section and
694 fixup_symbol_value (bfd_ptr
, coff_symbol_ptr
, &(s
->u
.syment
));
696 for (i
= 0; i
< s
->u
.syment
.n_numaux
+ 1; i
++)
697 s
[i
].offset
= native_index
++;
703 obj_conv_table_size (bfd_ptr
) = native_index
;
708 /* Run thorough the symbol table again, and fix it so that all
709 pointers to entries are changed to the entries' index in the output
713 coff_mangle_symbols (bfd
*bfd_ptr
)
715 unsigned int symbol_count
= bfd_get_symcount (bfd_ptr
);
716 asymbol
**symbol_ptr_ptr
= bfd_ptr
->outsymbols
;
717 unsigned int symbol_index
;
719 for (symbol_index
= 0; symbol_index
< symbol_count
; symbol_index
++)
721 coff_symbol_type
*coff_symbol_ptr
=
722 coff_symbol_from (bfd_ptr
, symbol_ptr_ptr
[symbol_index
]);
724 if (coff_symbol_ptr
&& coff_symbol_ptr
->native
)
727 combined_entry_type
*s
= coff_symbol_ptr
->native
;
731 /* FIXME: We should use a union here. */
732 s
->u
.syment
.n_value
=
733 (bfd_hostptr_t
) ((combined_entry_type
*)
734 ((bfd_hostptr_t
) s
->u
.syment
.n_value
))->offset
;
739 /* The value is the offset into the line number entries
740 for the symbol's section. On output, the symbol's
741 section should be N_DEBUG. */
742 s
->u
.syment
.n_value
=
743 (coff_symbol_ptr
->symbol
.section
->output_section
->line_filepos
744 + s
->u
.syment
.n_value
* bfd_coff_linesz (bfd_ptr
));
745 coff_symbol_ptr
->symbol
.section
=
746 coff_section_from_bfd_index (bfd_ptr
, N_DEBUG
);
747 BFD_ASSERT (coff_symbol_ptr
->symbol
.flags
& BSF_DEBUGGING
);
749 for (i
= 0; i
< s
->u
.syment
.n_numaux
; i
++)
751 combined_entry_type
*a
= s
+ i
+ 1;
754 a
->u
.auxent
.x_sym
.x_tagndx
.l
=
755 a
->u
.auxent
.x_sym
.x_tagndx
.p
->offset
;
760 a
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
=
761 a
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
->offset
;
766 a
->u
.auxent
.x_csect
.x_scnlen
.l
=
767 a
->u
.auxent
.x_csect
.x_scnlen
.p
->offset
;
776 coff_fix_symbol_name (bfd
*abfd
,
778 combined_entry_type
*native
,
779 bfd_size_type
*string_size_p
,
780 asection
**debug_string_section_p
,
781 bfd_size_type
*debug_string_size_p
)
783 unsigned int name_length
;
784 union internal_auxent
*auxent
;
785 char *name
= (char *) (symbol
->name
);
789 /* COFF symbols always have names, so we'll make one up. */
790 symbol
->name
= "strange";
791 name
= (char *) symbol
->name
;
793 name_length
= strlen (name
);
795 if (native
->u
.syment
.n_sclass
== C_FILE
796 && native
->u
.syment
.n_numaux
> 0)
798 unsigned int filnmlen
;
800 if (bfd_coff_force_symnames_in_strings (abfd
))
802 native
->u
.syment
._n
._n_n
._n_offset
=
803 (*string_size_p
+ STRING_SIZE_SIZE
);
804 native
->u
.syment
._n
._n_n
._n_zeroes
= 0;
805 *string_size_p
+= 6; /* strlen(".file") + 1 */
808 strncpy (native
->u
.syment
._n
._n_name
, ".file", SYMNMLEN
);
810 auxent
= &(native
+ 1)->u
.auxent
;
812 filnmlen
= bfd_coff_filnmlen (abfd
);
814 if (bfd_coff_long_filenames (abfd
))
816 if (name_length
<= filnmlen
)
817 strncpy (auxent
->x_file
.x_fname
, name
, filnmlen
);
820 auxent
->x_file
.x_n
.x_offset
= *string_size_p
+ STRING_SIZE_SIZE
;
821 auxent
->x_file
.x_n
.x_zeroes
= 0;
822 *string_size_p
+= name_length
+ 1;
827 strncpy (auxent
->x_file
.x_fname
, name
, filnmlen
);
828 if (name_length
> filnmlen
)
829 name
[filnmlen
] = '\0';
834 if (name_length
<= SYMNMLEN
&& !bfd_coff_force_symnames_in_strings (abfd
))
835 /* This name will fit into the symbol neatly. */
836 strncpy (native
->u
.syment
._n
._n_name
, symbol
->name
, SYMNMLEN
);
838 else if (!bfd_coff_symname_in_debug (abfd
, &native
->u
.syment
))
840 native
->u
.syment
._n
._n_n
._n_offset
= (*string_size_p
842 native
->u
.syment
._n
._n_n
._n_zeroes
= 0;
843 *string_size_p
+= name_length
+ 1;
849 int prefix_len
= bfd_coff_debug_string_prefix_length (abfd
);
851 /* This name should be written into the .debug section. For
852 some reason each name is preceded by a two byte length
853 and also followed by a null byte. FIXME: We assume that
854 the .debug section has already been created, and that it
856 if (*debug_string_section_p
== (asection
*) NULL
)
857 *debug_string_section_p
= bfd_get_section_by_name (abfd
, ".debug");
858 filepos
= bfd_tell (abfd
);
860 bfd_put_32 (abfd
, (bfd_vma
) (name_length
+ 1), buf
);
862 bfd_put_16 (abfd
, (bfd_vma
) (name_length
+ 1), buf
);
864 if (!bfd_set_section_contents (abfd
,
865 *debug_string_section_p
,
867 (file_ptr
) *debug_string_size_p
,
868 (bfd_size_type
) prefix_len
)
869 || !bfd_set_section_contents (abfd
,
870 *debug_string_section_p
,
871 (void *) symbol
->name
,
872 (file_ptr
) (*debug_string_size_p
874 (bfd_size_type
) name_length
+ 1))
876 if (bfd_seek (abfd
, filepos
, SEEK_SET
) != 0)
878 native
->u
.syment
._n
._n_n
._n_offset
=
879 *debug_string_size_p
+ prefix_len
;
880 native
->u
.syment
._n
._n_n
._n_zeroes
= 0;
881 *debug_string_size_p
+= name_length
+ 1 + prefix_len
;
886 /* We need to keep track of the symbol index so that when we write out
887 the relocs we can get the index for a symbol. This method is a
890 #define set_index(symbol, idx) ((symbol)->udata.i = (idx))
892 /* Write a symbol out to a COFF file. */
895 coff_write_symbol (bfd
*abfd
,
897 combined_entry_type
*native
,
899 bfd_size_type
*string_size_p
,
900 asection
**debug_string_section_p
,
901 bfd_size_type
*debug_string_size_p
)
903 unsigned int numaux
= native
->u
.syment
.n_numaux
;
904 int type
= native
->u
.syment
.n_type
;
905 int class = native
->u
.syment
.n_sclass
;
907 bfd_size_type symesz
;
909 if (native
->u
.syment
.n_sclass
== C_FILE
)
910 symbol
->flags
|= BSF_DEBUGGING
;
912 if (symbol
->flags
& BSF_DEBUGGING
913 && bfd_is_abs_section (symbol
->section
))
914 native
->u
.syment
.n_scnum
= N_DEBUG
;
916 else if (bfd_is_abs_section (symbol
->section
))
917 native
->u
.syment
.n_scnum
= N_ABS
;
919 else if (bfd_is_und_section (symbol
->section
))
920 native
->u
.syment
.n_scnum
= N_UNDEF
;
923 native
->u
.syment
.n_scnum
=
924 symbol
->section
->output_section
->target_index
;
926 coff_fix_symbol_name (abfd
, symbol
, native
, string_size_p
,
927 debug_string_section_p
, debug_string_size_p
);
929 symesz
= bfd_coff_symesz (abfd
);
930 buf
= bfd_alloc (abfd
, symesz
);
933 bfd_coff_swap_sym_out (abfd
, &native
->u
.syment
, buf
);
934 if (bfd_bwrite (buf
, symesz
, abfd
) != symesz
)
936 bfd_release (abfd
, buf
);
938 if (native
->u
.syment
.n_numaux
> 0)
940 bfd_size_type auxesz
;
943 auxesz
= bfd_coff_auxesz (abfd
);
944 buf
= bfd_alloc (abfd
, auxesz
);
947 for (j
= 0; j
< native
->u
.syment
.n_numaux
; j
++)
949 bfd_coff_swap_aux_out (abfd
,
950 &((native
+ j
+ 1)->u
.auxent
),
951 type
, class, (int) j
,
952 native
->u
.syment
.n_numaux
,
954 if (bfd_bwrite (buf
, auxesz
, abfd
) != auxesz
)
957 bfd_release (abfd
, buf
);
960 /* Store the index for use when we write out the relocs. */
961 set_index (symbol
, *written
);
963 *written
+= numaux
+ 1;
967 /* Write out a symbol to a COFF file that does not come from a COFF
968 file originally. This symbol may have been created by the linker,
969 or we may be linking a non COFF file to a COFF file. */
972 coff_write_alien_symbol (bfd
*abfd
,
975 bfd_size_type
*string_size_p
,
976 asection
**debug_string_section_p
,
977 bfd_size_type
*debug_string_size_p
)
979 combined_entry_type
*native
;
980 combined_entry_type dummy
;
983 native
->u
.syment
.n_type
= T_NULL
;
984 native
->u
.syment
.n_flags
= 0;
985 if (bfd_is_und_section (symbol
->section
))
987 native
->u
.syment
.n_scnum
= N_UNDEF
;
988 native
->u
.syment
.n_value
= symbol
->value
;
990 else if (bfd_is_com_section (symbol
->section
))
992 native
->u
.syment
.n_scnum
= N_UNDEF
;
993 native
->u
.syment
.n_value
= symbol
->value
;
995 else if (symbol
->flags
& BSF_DEBUGGING
)
997 /* There isn't much point to writing out a debugging symbol
998 unless we are prepared to convert it into COFF debugging
999 format. So, we just ignore them. We must clobber the symbol
1000 name to keep it from being put in the string table. */
1006 native
->u
.syment
.n_scnum
=
1007 symbol
->section
->output_section
->target_index
;
1008 native
->u
.syment
.n_value
= (symbol
->value
1009 + symbol
->section
->output_offset
);
1010 if (! obj_pe (abfd
))
1011 native
->u
.syment
.n_value
+= symbol
->section
->output_section
->vma
;
1013 /* Copy the any flags from the file header into the symbol.
1016 coff_symbol_type
*c
= coff_symbol_from (abfd
, symbol
);
1017 if (c
!= (coff_symbol_type
*) NULL
)
1018 native
->u
.syment
.n_flags
= bfd_asymbol_bfd (&c
->symbol
)->flags
;
1022 native
->u
.syment
.n_type
= 0;
1023 if (symbol
->flags
& BSF_LOCAL
)
1024 native
->u
.syment
.n_sclass
= C_STAT
;
1025 else if (symbol
->flags
& BSF_WEAK
)
1026 native
->u
.syment
.n_sclass
= obj_pe (abfd
) ? C_NT_WEAK
: C_WEAKEXT
;
1028 native
->u
.syment
.n_sclass
= C_EXT
;
1029 native
->u
.syment
.n_numaux
= 0;
1031 return coff_write_symbol (abfd
, symbol
, native
, written
, string_size_p
,
1032 debug_string_section_p
, debug_string_size_p
);
1035 /* Write a native symbol to a COFF file. */
1038 coff_write_native_symbol (bfd
*abfd
,
1039 coff_symbol_type
*symbol
,
1041 bfd_size_type
*string_size_p
,
1042 asection
**debug_string_section_p
,
1043 bfd_size_type
*debug_string_size_p
)
1045 combined_entry_type
*native
= symbol
->native
;
1046 alent
*lineno
= symbol
->lineno
;
1048 /* If this symbol has an associated line number, we must store the
1049 symbol index in the line number field. We also tag the auxent to
1050 point to the right place in the lineno table. */
1051 if (lineno
&& !symbol
->done_lineno
&& symbol
->symbol
.section
->owner
!= NULL
)
1053 unsigned int count
= 0;
1055 lineno
[count
].u
.offset
= *written
;
1056 if (native
->u
.syment
.n_numaux
)
1058 union internal_auxent
*a
= &((native
+ 1)->u
.auxent
);
1060 a
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
=
1061 symbol
->symbol
.section
->output_section
->moving_line_filepos
;
1064 /* Count and relocate all other linenumbers. */
1066 while (lineno
[count
].line_number
!= 0)
1068 lineno
[count
].u
.offset
+=
1069 (symbol
->symbol
.section
->output_section
->vma
1070 + symbol
->symbol
.section
->output_offset
);
1073 symbol
->done_lineno
= TRUE
;
1075 if (! bfd_is_const_section (symbol
->symbol
.section
->output_section
))
1076 symbol
->symbol
.section
->output_section
->moving_line_filepos
+=
1077 count
* bfd_coff_linesz (abfd
);
1080 return coff_write_symbol (abfd
, &(symbol
->symbol
), native
, written
,
1081 string_size_p
, debug_string_section_p
,
1082 debug_string_size_p
);
1085 /* Write out the COFF symbols. */
1088 coff_write_symbols (bfd
*abfd
)
1090 bfd_size_type string_size
;
1091 asection
*debug_string_section
;
1092 bfd_size_type debug_string_size
;
1094 unsigned int limit
= bfd_get_symcount (abfd
);
1095 bfd_vma written
= 0;
1099 debug_string_section
= NULL
;
1100 debug_string_size
= 0;
1102 /* If this target supports long section names, they must be put into
1103 the string table. This is supported by PE. This code must
1104 handle section names just as they are handled in
1105 coff_write_object_contents. */
1106 if (bfd_coff_long_section_names (abfd
))
1110 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
1114 len
= strlen (o
->name
);
1116 string_size
+= len
+ 1;
1120 /* Seek to the right place. */
1121 if (bfd_seek (abfd
, obj_sym_filepos (abfd
), SEEK_SET
) != 0)
1124 /* Output all the symbols we have. */
1126 for (p
= abfd
->outsymbols
, i
= 0; i
< limit
; i
++, p
++)
1128 asymbol
*symbol
= *p
;
1129 coff_symbol_type
*c_symbol
= coff_symbol_from (abfd
, symbol
);
1131 if (c_symbol
== (coff_symbol_type
*) NULL
1132 || c_symbol
->native
== (combined_entry_type
*) NULL
)
1134 if (!coff_write_alien_symbol (abfd
, symbol
, &written
, &string_size
,
1135 &debug_string_section
,
1136 &debug_string_size
))
1141 if (!coff_write_native_symbol (abfd
, c_symbol
, &written
,
1142 &string_size
, &debug_string_section
,
1143 &debug_string_size
))
1148 obj_raw_syment_count (abfd
) = written
;
1150 /* Now write out strings. */
1151 if (string_size
!= 0)
1153 unsigned int size
= string_size
+ STRING_SIZE_SIZE
;
1154 bfd_byte buffer
[STRING_SIZE_SIZE
];
1156 #if STRING_SIZE_SIZE == 4
1157 H_PUT_32 (abfd
, size
, buffer
);
1159 #error Change H_PUT_32
1161 if (bfd_bwrite ((void *) buffer
, (bfd_size_type
) sizeof (buffer
), abfd
)
1165 /* Handle long section names. This code must handle section
1166 names just as they are handled in coff_write_object_contents. */
1167 if (bfd_coff_long_section_names (abfd
))
1171 for (o
= abfd
->sections
; o
!= NULL
; o
= o
->next
)
1175 len
= strlen (o
->name
);
1178 if (bfd_bwrite (o
->name
, (bfd_size_type
) (len
+ 1), abfd
)
1185 for (p
= abfd
->outsymbols
, i
= 0;
1190 size_t name_length
= strlen (q
->name
);
1191 coff_symbol_type
*c_symbol
= coff_symbol_from (abfd
, q
);
1194 /* Figure out whether the symbol name should go in the string
1195 table. Symbol names that are short enough are stored
1196 directly in the syment structure. File names permit a
1197 different, longer, length in the syment structure. On
1198 XCOFF, some symbol names are stored in the .debug section
1199 rather than in the string table. */
1201 if (c_symbol
== NULL
1202 || c_symbol
->native
== NULL
)
1203 /* This is not a COFF symbol, so it certainly is not a
1204 file name, nor does it go in the .debug section. */
1205 maxlen
= bfd_coff_force_symnames_in_strings (abfd
) ? 0 : SYMNMLEN
;
1207 else if (bfd_coff_symname_in_debug (abfd
,
1208 &c_symbol
->native
->u
.syment
))
1209 /* This symbol name is in the XCOFF .debug section.
1210 Don't write it into the string table. */
1211 maxlen
= name_length
;
1213 else if (c_symbol
->native
->u
.syment
.n_sclass
== C_FILE
1214 && c_symbol
->native
->u
.syment
.n_numaux
> 0)
1216 if (bfd_coff_force_symnames_in_strings (abfd
))
1218 if (bfd_bwrite (".file", (bfd_size_type
) 6, abfd
) != 6)
1221 maxlen
= bfd_coff_filnmlen (abfd
);
1224 maxlen
= bfd_coff_force_symnames_in_strings (abfd
) ? 0 : SYMNMLEN
;
1226 if (name_length
> maxlen
)
1228 if (bfd_bwrite ((void *) (q
->name
), (bfd_size_type
) name_length
+ 1,
1229 abfd
) != name_length
+ 1)
1236 /* We would normally not write anything here, but we'll write
1237 out 4 so that any stupid coff reader which tries to read the
1238 string table even when there isn't one won't croak. */
1239 unsigned int size
= STRING_SIZE_SIZE
;
1240 bfd_byte buffer
[STRING_SIZE_SIZE
];
1242 #if STRING_SIZE_SIZE == 4
1243 H_PUT_32 (abfd
, size
, buffer
);
1245 #error Change H_PUT_32
1247 if (bfd_bwrite ((void *) buffer
, (bfd_size_type
) STRING_SIZE_SIZE
, abfd
)
1248 != STRING_SIZE_SIZE
)
1252 /* Make sure the .debug section was created to be the correct size.
1253 We should create it ourselves on the fly, but we don't because
1254 BFD won't let us write to any section until we know how large all
1255 the sections are. We could still do it by making another pass
1256 over the symbols. FIXME. */
1257 BFD_ASSERT (debug_string_size
== 0
1258 || (debug_string_section
!= (asection
*) NULL
1259 && (BFD_ALIGN (debug_string_size
,
1260 1 << debug_string_section
->alignment_power
)
1261 == debug_string_section
->size
)));
1267 coff_write_linenumbers (bfd
*abfd
)
1270 bfd_size_type linesz
;
1273 linesz
= bfd_coff_linesz (abfd
);
1274 buff
= bfd_alloc (abfd
, linesz
);
1277 for (s
= abfd
->sections
; s
!= (asection
*) NULL
; s
= s
->next
)
1279 if (s
->lineno_count
)
1281 asymbol
**q
= abfd
->outsymbols
;
1282 if (bfd_seek (abfd
, s
->line_filepos
, SEEK_SET
) != 0)
1284 /* Find all the linenumbers in this section. */
1288 if (p
->section
->output_section
== s
)
1291 BFD_SEND (bfd_asymbol_bfd (p
), _get_lineno
,
1292 (bfd_asymbol_bfd (p
), p
));
1295 /* Found a linenumber entry, output. */
1296 struct internal_lineno out
;
1297 memset ((void *) & out
, 0, sizeof (out
));
1299 out
.l_addr
.l_symndx
= l
->u
.offset
;
1300 bfd_coff_swap_lineno_out (abfd
, &out
, buff
);
1301 if (bfd_bwrite (buff
, (bfd_size_type
) linesz
, abfd
)
1305 while (l
->line_number
)
1307 out
.l_lnno
= l
->line_number
;
1308 out
.l_addr
.l_symndx
= l
->u
.offset
;
1309 bfd_coff_swap_lineno_out (abfd
, &out
, buff
);
1310 if (bfd_bwrite (buff
, (bfd_size_type
) linesz
, abfd
)
1321 bfd_release (abfd
, buff
);
1326 coff_get_lineno (bfd
*ignore_abfd ATTRIBUTE_UNUSED
, asymbol
*symbol
)
1328 return coffsymbol (symbol
)->lineno
;
1331 /* This function transforms the offsets into the symbol table into
1332 pointers to syments. */
1335 coff_pointerize_aux (bfd
*abfd
,
1336 combined_entry_type
*table_base
,
1337 combined_entry_type
*symbol
,
1338 unsigned int indaux
,
1339 combined_entry_type
*auxent
)
1341 unsigned int type
= symbol
->u
.syment
.n_type
;
1342 unsigned int class = symbol
->u
.syment
.n_sclass
;
1344 if (coff_backend_info (abfd
)->_bfd_coff_pointerize_aux_hook
)
1346 if ((*coff_backend_info (abfd
)->_bfd_coff_pointerize_aux_hook
)
1347 (abfd
, table_base
, symbol
, indaux
, auxent
))
1351 /* Don't bother if this is a file or a section. */
1352 if (class == C_STAT
&& type
== T_NULL
)
1354 if (class == C_FILE
)
1357 /* Otherwise patch up. */
1358 #define N_TMASK coff_data (abfd)->local_n_tmask
1359 #define N_BTSHFT coff_data (abfd)->local_n_btshft
1361 if ((ISFCN (type
) || ISTAG (class) || class == C_BLOCK
|| class == C_FCN
)
1362 && auxent
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
> 0)
1364 auxent
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
=
1365 table_base
+ auxent
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
;
1366 auxent
->fix_end
= 1;
1368 /* A negative tagndx is meaningless, but the SCO 3.2v4 cc can
1369 generate one, so we must be careful to ignore it. */
1370 if (auxent
->u
.auxent
.x_sym
.x_tagndx
.l
> 0)
1372 auxent
->u
.auxent
.x_sym
.x_tagndx
.p
=
1373 table_base
+ auxent
->u
.auxent
.x_sym
.x_tagndx
.l
;
1374 auxent
->fix_tag
= 1;
1378 /* Allocate space for the ".debug" section, and read it.
1379 We did not read the debug section until now, because
1380 we didn't want to go to the trouble until someone needed it. */
1383 build_debug_section (bfd
*abfd
)
1385 char *debug_section
;
1387 bfd_size_type sec_size
;
1389 asection
*sect
= bfd_get_section_by_name (abfd
, ".debug");
1393 bfd_set_error (bfd_error_no_debug_section
);
1397 sec_size
= sect
->size
;
1398 debug_section
= bfd_alloc (abfd
, sec_size
);
1399 if (debug_section
== NULL
)
1402 /* Seek to the beginning of the `.debug' section and read it.
1403 Save the current position first; it is needed by our caller.
1404 Then read debug section and reset the file pointer. */
1406 position
= bfd_tell (abfd
);
1407 if (bfd_seek (abfd
, sect
->filepos
, SEEK_SET
) != 0
1408 || bfd_bread (debug_section
, sec_size
, abfd
) != sec_size
1409 || bfd_seek (abfd
, position
, SEEK_SET
) != 0)
1411 return debug_section
;
1414 /* Return a pointer to a malloc'd copy of 'name'. 'name' may not be
1415 \0-terminated, but will not exceed 'maxlen' characters. The copy *will*
1416 be \0-terminated. */
1419 copy_name (bfd
*abfd
, char *name
, size_t maxlen
)
1424 for (len
= 0; len
< maxlen
; ++len
)
1425 if (name
[len
] == '\0')
1428 if ((newname
= bfd_alloc (abfd
, (bfd_size_type
) len
+ 1)) == NULL
)
1431 strncpy (newname
, name
, len
);
1432 newname
[len
] = '\0';
1436 /* Read in the external symbols. */
1439 _bfd_coff_get_external_symbols (bfd
*abfd
)
1441 bfd_size_type symesz
;
1445 if (obj_coff_external_syms (abfd
) != NULL
)
1448 symesz
= bfd_coff_symesz (abfd
);
1450 size
= obj_raw_syment_count (abfd
) * symesz
;
1454 syms
= bfd_malloc (size
);
1458 if (bfd_seek (abfd
, obj_sym_filepos (abfd
), SEEK_SET
) != 0
1459 || bfd_bread (syms
, size
, abfd
) != size
)
1466 obj_coff_external_syms (abfd
) = syms
;
1471 /* Read in the external strings. The strings are not loaded until
1472 they are needed. This is because we have no simple way of
1473 detecting a missing string table in an archive. */
1476 _bfd_coff_read_string_table (bfd
*abfd
)
1478 char extstrsize
[STRING_SIZE_SIZE
];
1479 bfd_size_type strsize
;
1483 if (obj_coff_strings (abfd
) != NULL
)
1484 return obj_coff_strings (abfd
);
1486 if (obj_sym_filepos (abfd
) == 0)
1488 bfd_set_error (bfd_error_no_symbols
);
1492 pos
= obj_sym_filepos (abfd
);
1493 pos
+= obj_raw_syment_count (abfd
) * bfd_coff_symesz (abfd
);
1494 if (bfd_seek (abfd
, pos
, SEEK_SET
) != 0)
1497 if (bfd_bread (extstrsize
, (bfd_size_type
) sizeof extstrsize
, abfd
)
1498 != sizeof extstrsize
)
1500 if (bfd_get_error () != bfd_error_file_truncated
)
1503 /* There is no string table. */
1504 strsize
= STRING_SIZE_SIZE
;
1508 #if STRING_SIZE_SIZE == 4
1509 strsize
= H_GET_32 (abfd
, extstrsize
);
1511 #error Change H_GET_32
1515 if (strsize
< STRING_SIZE_SIZE
)
1517 (*_bfd_error_handler
)
1518 (_("%B: bad string table size %lu"), abfd
, (unsigned long) strsize
);
1519 bfd_set_error (bfd_error_bad_value
);
1523 strings
= bfd_malloc (strsize
);
1524 if (strings
== NULL
)
1527 if (bfd_bread (strings
+ STRING_SIZE_SIZE
, strsize
- STRING_SIZE_SIZE
, abfd
)
1528 != strsize
- STRING_SIZE_SIZE
)
1534 obj_coff_strings (abfd
) = strings
;
1539 /* Free up the external symbols and strings read from a COFF file. */
1542 _bfd_coff_free_symbols (bfd
*abfd
)
1544 if (obj_coff_external_syms (abfd
) != NULL
1545 && ! obj_coff_keep_syms (abfd
))
1547 free (obj_coff_external_syms (abfd
));
1548 obj_coff_external_syms (abfd
) = NULL
;
1550 if (obj_coff_strings (abfd
) != NULL
1551 && ! obj_coff_keep_strings (abfd
))
1553 free (obj_coff_strings (abfd
));
1554 obj_coff_strings (abfd
) = NULL
;
1559 /* Read a symbol table into freshly bfd_allocated memory, swap it, and
1560 knit the symbol names into a normalized form. By normalized here I
1561 mean that all symbols have an n_offset pointer that points to a null-
1562 terminated string. */
1564 combined_entry_type
*
1565 coff_get_normalized_symtab (bfd
*abfd
)
1567 combined_entry_type
*internal
;
1568 combined_entry_type
*internal_ptr
;
1569 combined_entry_type
*symbol_ptr
;
1570 combined_entry_type
*internal_end
;
1574 const char *string_table
= NULL
;
1575 char *debug_section
= NULL
;
1578 if (obj_raw_syments (abfd
) != NULL
)
1579 return obj_raw_syments (abfd
);
1581 size
= obj_raw_syment_count (abfd
) * sizeof (combined_entry_type
);
1582 internal
= bfd_zalloc (abfd
, size
);
1583 if (internal
== NULL
&& size
!= 0)
1585 internal_end
= internal
+ obj_raw_syment_count (abfd
);
1587 if (! _bfd_coff_get_external_symbols (abfd
))
1590 raw_src
= (char *) obj_coff_external_syms (abfd
);
1592 /* Mark the end of the symbols. */
1593 symesz
= bfd_coff_symesz (abfd
);
1594 raw_end
= (char *) raw_src
+ obj_raw_syment_count (abfd
) * symesz
;
1596 /* FIXME SOMEDAY. A string table size of zero is very weird, but
1597 probably possible. If one shows up, it will probably kill us. */
1599 /* Swap all the raw entries. */
1600 for (internal_ptr
= internal
;
1602 raw_src
+= symesz
, internal_ptr
++)
1606 bfd_coff_swap_sym_in (abfd
, (void *) raw_src
,
1607 (void *) & internal_ptr
->u
.syment
);
1608 symbol_ptr
= internal_ptr
;
1611 i
< symbol_ptr
->u
.syment
.n_numaux
;
1616 bfd_coff_swap_aux_in (abfd
, (void *) raw_src
,
1617 symbol_ptr
->u
.syment
.n_type
,
1618 symbol_ptr
->u
.syment
.n_sclass
,
1619 (int) i
, symbol_ptr
->u
.syment
.n_numaux
,
1620 &(internal_ptr
->u
.auxent
));
1621 coff_pointerize_aux (abfd
, internal
, symbol_ptr
, i
,
1626 /* Free the raw symbols, but not the strings (if we have them). */
1627 obj_coff_keep_strings (abfd
) = TRUE
;
1628 if (! _bfd_coff_free_symbols (abfd
))
1631 for (internal_ptr
= internal
; internal_ptr
< internal_end
;
1634 if (internal_ptr
->u
.syment
.n_sclass
== C_FILE
1635 && internal_ptr
->u
.syment
.n_numaux
> 0)
1637 /* Make a file symbol point to the name in the auxent, since
1638 the text ".file" is redundant. */
1639 if ((internal_ptr
+ 1)->u
.auxent
.x_file
.x_n
.x_zeroes
== 0)
1641 /* The filename is a long one, point into the string table. */
1642 if (string_table
== NULL
)
1644 string_table
= _bfd_coff_read_string_table (abfd
);
1645 if (string_table
== NULL
)
1649 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1652 + (internal_ptr
+ 1)->u
.auxent
.x_file
.x_n
.x_offset
));
1656 /* Ordinary short filename, put into memory anyway. The
1657 Microsoft PE tools sometimes store a filename in
1658 multiple AUX entries. */
1659 if (internal_ptr
->u
.syment
.n_numaux
> 1
1660 && coff_data (abfd
)->pe
)
1661 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1664 (internal_ptr
+ 1)->u
.auxent
.x_file
.x_fname
,
1665 internal_ptr
->u
.syment
.n_numaux
* symesz
));
1667 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1670 (internal_ptr
+ 1)->u
.auxent
.x_file
.x_fname
,
1671 (size_t) bfd_coff_filnmlen (abfd
)));
1676 if (internal_ptr
->u
.syment
._n
._n_n
._n_zeroes
!= 0)
1678 /* This is a "short" name. Make it long. */
1682 /* Find the length of this string without walking into memory
1684 for (i
= 0; i
< 8; ++i
)
1685 if (internal_ptr
->u
.syment
._n
._n_name
[i
] == '\0')
1688 newstring
= bfd_zalloc (abfd
, (bfd_size_type
) (i
+ 1));
1689 if (newstring
== NULL
)
1691 strncpy (newstring
, internal_ptr
->u
.syment
._n
._n_name
, i
);
1692 internal_ptr
->u
.syment
._n
._n_n
._n_offset
= (bfd_hostptr_t
) newstring
;
1693 internal_ptr
->u
.syment
._n
._n_n
._n_zeroes
= 0;
1695 else if (internal_ptr
->u
.syment
._n
._n_n
._n_offset
== 0)
1696 internal_ptr
->u
.syment
._n
._n_n
._n_offset
= (bfd_vma
) "";
1697 else if (!bfd_coff_symname_in_debug (abfd
, &internal_ptr
->u
.syment
))
1699 /* Long name already. Point symbol at the string in the
1701 if (string_table
== NULL
)
1703 string_table
= _bfd_coff_read_string_table (abfd
);
1704 if (string_table
== NULL
)
1707 internal_ptr
->u
.syment
._n
._n_n
._n_offset
=
1710 + internal_ptr
->u
.syment
._n
._n_n
._n_offset
));
1714 /* Long name in debug section. Very similar. */
1715 if (debug_section
== NULL
)
1716 debug_section
= build_debug_section (abfd
);
1717 internal_ptr
->u
.syment
._n
._n_n
._n_offset
= (bfd_hostptr_t
)
1718 (debug_section
+ internal_ptr
->u
.syment
._n
._n_n
._n_offset
);
1721 internal_ptr
+= internal_ptr
->u
.syment
.n_numaux
;
1724 obj_raw_syments (abfd
) = internal
;
1725 BFD_ASSERT (obj_raw_syment_count (abfd
)
1726 == (unsigned int) (internal_ptr
- internal
));
1732 coff_get_reloc_upper_bound (bfd
*abfd
, sec_ptr asect
)
1734 if (bfd_get_format (abfd
) != bfd_object
)
1736 bfd_set_error (bfd_error_invalid_operation
);
1739 return (asect
->reloc_count
+ 1) * sizeof (arelent
*);
1743 coff_make_empty_symbol (bfd
*abfd
)
1745 bfd_size_type amt
= sizeof (coff_symbol_type
);
1746 coff_symbol_type
*new = bfd_zalloc (abfd
, amt
);
1750 new->symbol
.section
= 0;
1753 new->done_lineno
= FALSE
;
1754 new->symbol
.the_bfd
= abfd
;
1756 return & new->symbol
;
1759 /* Make a debugging symbol. */
1762 coff_bfd_make_debug_symbol (bfd
*abfd
,
1763 void * ptr ATTRIBUTE_UNUSED
,
1764 unsigned long sz ATTRIBUTE_UNUSED
)
1766 bfd_size_type amt
= sizeof (coff_symbol_type
);
1767 coff_symbol_type
*new = bfd_alloc (abfd
, amt
);
1771 /* @@ The 10 is a guess at a plausible maximum number of aux entries
1772 (but shouldn't be a constant). */
1773 amt
= sizeof (combined_entry_type
) * 10;
1774 new->native
= bfd_zalloc (abfd
, amt
);
1777 new->symbol
.section
= bfd_abs_section_ptr
;
1778 new->symbol
.flags
= BSF_DEBUGGING
;
1780 new->done_lineno
= FALSE
;
1781 new->symbol
.the_bfd
= abfd
;
1783 return & new->symbol
;
1787 coff_get_symbol_info (bfd
*abfd
, asymbol
*symbol
, symbol_info
*ret
)
1789 bfd_symbol_info (symbol
, ret
);
1791 if (coffsymbol (symbol
)->native
!= NULL
1792 && coffsymbol (symbol
)->native
->fix_value
)
1793 ret
->value
= coffsymbol (symbol
)->native
->u
.syment
.n_value
-
1794 (bfd_hostptr_t
) obj_raw_syments (abfd
);
1797 /* Return the COFF syment for a symbol. */
1800 bfd_coff_get_syment (bfd
*abfd
,
1802 struct internal_syment
*psyment
)
1804 coff_symbol_type
*csym
;
1806 csym
= coff_symbol_from (abfd
, symbol
);
1807 if (csym
== NULL
|| csym
->native
== NULL
)
1809 bfd_set_error (bfd_error_invalid_operation
);
1813 *psyment
= csym
->native
->u
.syment
;
1815 if (csym
->native
->fix_value
)
1816 psyment
->n_value
= psyment
->n_value
-
1817 (bfd_hostptr_t
) obj_raw_syments (abfd
);
1819 /* FIXME: We should handle fix_line here. */
1824 /* Return the COFF auxent for a symbol. */
1827 bfd_coff_get_auxent (bfd
*abfd
,
1830 union internal_auxent
*pauxent
)
1832 coff_symbol_type
*csym
;
1833 combined_entry_type
*ent
;
1835 csym
= coff_symbol_from (abfd
, symbol
);
1838 || csym
->native
== NULL
1839 || indx
>= csym
->native
->u
.syment
.n_numaux
)
1841 bfd_set_error (bfd_error_invalid_operation
);
1845 ent
= csym
->native
+ indx
+ 1;
1847 *pauxent
= ent
->u
.auxent
;
1850 pauxent
->x_sym
.x_tagndx
.l
=
1851 ((combined_entry_type
*) pauxent
->x_sym
.x_tagndx
.p
1852 - obj_raw_syments (abfd
));
1855 pauxent
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
=
1856 ((combined_entry_type
*) pauxent
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
1857 - obj_raw_syments (abfd
));
1859 if (ent
->fix_scnlen
)
1860 pauxent
->x_csect
.x_scnlen
.l
=
1861 ((combined_entry_type
*) pauxent
->x_csect
.x_scnlen
.p
1862 - obj_raw_syments (abfd
));
1867 /* Print out information about COFF symbol. */
1870 coff_print_symbol (bfd
*abfd
,
1873 bfd_print_symbol_type how
)
1875 FILE * file
= (FILE *) filep
;
1879 case bfd_print_symbol_name
:
1880 fprintf (file
, "%s", symbol
->name
);
1883 case bfd_print_symbol_more
:
1884 fprintf (file
, "coff %s %s",
1885 coffsymbol (symbol
)->native
? "n" : "g",
1886 coffsymbol (symbol
)->lineno
? "l" : " ");
1889 case bfd_print_symbol_all
:
1890 if (coffsymbol (symbol
)->native
)
1894 combined_entry_type
*combined
= coffsymbol (symbol
)->native
;
1895 combined_entry_type
*root
= obj_raw_syments (abfd
);
1896 struct lineno_cache_entry
*l
= coffsymbol (symbol
)->lineno
;
1898 fprintf (file
, "[%3ld]", (long) (combined
- root
));
1900 if (! combined
->fix_value
)
1901 val
= (bfd_vma
) combined
->u
.syment
.n_value
;
1903 val
= combined
->u
.syment
.n_value
- (bfd_hostptr_t
) root
;
1905 fprintf (file
, "(sec %2d)(fl 0x%02x)(ty %3x)(scl %3d) (nx %d) 0x",
1906 combined
->u
.syment
.n_scnum
,
1907 combined
->u
.syment
.n_flags
,
1908 combined
->u
.syment
.n_type
,
1909 combined
->u
.syment
.n_sclass
,
1910 combined
->u
.syment
.n_numaux
);
1912 /* fprintf_vma() on a 64-bit enabled host will always print a 64-bit
1913 value, but really we want to display the address in the target's
1914 address size. Since we do not have a field in the bfd structure
1915 to tell us this, we take a guess, based on the target's name. */
1916 if (strstr (bfd_get_target (abfd
), "64") == NULL
)
1917 fprintf (file
, "%08lx", (unsigned long) (val
& 0xffffffff));
1920 fprintf_vma (file
, val
);
1921 fprintf (file
, " %s", symbol
->name
);
1923 for (aux
= 0; aux
< combined
->u
.syment
.n_numaux
; aux
++)
1925 combined_entry_type
*auxp
= combined
+ aux
+ 1;
1929 tagndx
= auxp
->u
.auxent
.x_sym
.x_tagndx
.p
- root
;
1931 tagndx
= auxp
->u
.auxent
.x_sym
.x_tagndx
.l
;
1933 fprintf (file
, "\n");
1935 if (bfd_coff_print_aux (abfd
, file
, root
, combined
, auxp
, aux
))
1938 switch (combined
->u
.syment
.n_sclass
)
1941 fprintf (file
, "File ");
1945 if (combined
->u
.syment
.n_type
== T_NULL
)
1946 /* Probably a section symbol ? */
1948 fprintf (file
, "AUX scnlen 0x%lx nreloc %d nlnno %d",
1949 (long) auxp
->u
.auxent
.x_scn
.x_scnlen
,
1950 auxp
->u
.auxent
.x_scn
.x_nreloc
,
1951 auxp
->u
.auxent
.x_scn
.x_nlinno
);
1952 if (auxp
->u
.auxent
.x_scn
.x_checksum
!= 0
1953 || auxp
->u
.auxent
.x_scn
.x_associated
!= 0
1954 || auxp
->u
.auxent
.x_scn
.x_comdat
!= 0)
1955 fprintf (file
, " checksum 0x%lx assoc %d comdat %d",
1956 auxp
->u
.auxent
.x_scn
.x_checksum
,
1957 auxp
->u
.auxent
.x_scn
.x_associated
,
1958 auxp
->u
.auxent
.x_scn
.x_comdat
);
1961 /* Otherwise fall through. */
1963 if (ISFCN (combined
->u
.syment
.n_type
))
1968 next
= (auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
1971 next
= auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
;
1972 llnos
= auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
;
1974 "AUX tagndx %ld ttlsiz 0x%lx lnnos %ld next %ld",
1975 tagndx
, auxp
->u
.auxent
.x_sym
.x_misc
.x_fsize
,
1979 /* Otherwise fall through. */
1981 fprintf (file
, "AUX lnno %d size 0x%x tagndx %ld",
1982 auxp
->u
.auxent
.x_sym
.x_misc
.x_lnsz
.x_lnno
,
1983 auxp
->u
.auxent
.x_sym
.x_misc
.x_lnsz
.x_size
,
1986 fprintf (file
, " endndx %ld",
1988 (auxp
->u
.auxent
.x_sym
.x_fcnary
.x_fcn
.x_endndx
.p
1996 fprintf (file
, "\n%s :", l
->u
.sym
->name
);
1998 while (l
->line_number
)
2000 fprintf (file
, "\n%4d : ", l
->line_number
);
2001 fprintf_vma (file
, l
->u
.offset
+ symbol
->section
->vma
);
2008 bfd_print_symbol_vandf (abfd
, (void *) file
, symbol
);
2009 fprintf (file
, " %-5s %s %s %s",
2010 symbol
->section
->name
,
2011 coffsymbol (symbol
)->native
? "n" : "g",
2012 coffsymbol (symbol
)->lineno
? "l" : " ",
2018 /* Return whether a symbol name implies a local symbol. In COFF,
2019 local symbols generally start with ``.L''. Most targets use this
2020 function for the is_local_label_name entry point, but some may
2024 _bfd_coff_is_local_label_name (bfd
*abfd ATTRIBUTE_UNUSED
,
2027 return name
[0] == '.' && name
[1] == 'L';
2030 /* Provided a BFD, a section and an offset (in bytes, not octets) into the
2031 section, calculate and return the name of the source file and the line
2032 nearest to the wanted location. */
2035 coff_find_nearest_line (bfd
*abfd
,
2039 const char **filename_ptr
,
2040 const char **functionname_ptr
,
2041 unsigned int *line_ptr
)
2045 unsigned int line_base
;
2046 coff_data_type
*cof
= coff_data (abfd
);
2047 /* Run through the raw syments if available. */
2048 combined_entry_type
*p
;
2049 combined_entry_type
*pend
;
2051 struct coff_section_tdata
*sec_data
;
2054 /* Before looking through the symbol table, try to use a .stab
2055 section to find the information. */
2056 if (! _bfd_stab_section_find_nearest_line (abfd
, symbols
, section
, offset
,
2057 &found
, filename_ptr
,
2058 functionname_ptr
, line_ptr
,
2059 &coff_data(abfd
)->line_info
))
2065 /* Also try examining DWARF2 debugging information. */
2066 if (_bfd_dwarf2_find_nearest_line (abfd
, section
, symbols
, offset
,
2067 filename_ptr
, functionname_ptr
,
2069 &coff_data(abfd
)->dwarf2_find_line_info
))
2073 *functionname_ptr
= 0;
2076 /* Don't try and find line numbers in a non coff file. */
2077 if (!bfd_family_coff (abfd
))
2083 /* Find the first C_FILE symbol. */
2084 p
= cof
->raw_syments
;
2088 pend
= p
+ cof
->raw_syment_count
;
2091 if (p
->u
.syment
.n_sclass
== C_FILE
)
2093 p
+= 1 + p
->u
.syment
.n_numaux
;
2101 /* Look through the C_FILE symbols to find the best one. */
2102 sec_vma
= bfd_get_section_vma (abfd
, section
);
2103 *filename_ptr
= (char *) p
->u
.syment
._n
._n_n
._n_offset
;
2104 maxdiff
= (bfd_vma
) 0 - (bfd_vma
) 1;
2107 combined_entry_type
*p2
;
2109 for (p2
= p
+ 1 + p
->u
.syment
.n_numaux
;
2111 p2
+= 1 + p2
->u
.syment
.n_numaux
)
2113 if (p2
->u
.syment
.n_scnum
> 0
2115 == coff_section_from_bfd_index (abfd
,
2116 p2
->u
.syment
.n_scnum
)))
2118 if (p2
->u
.syment
.n_sclass
== C_FILE
)
2125 /* We use <= MAXDIFF here so that if we get a zero length
2126 file, we actually use the next file entry. */
2128 && offset
+ sec_vma
>= (bfd_vma
) p2
->u
.syment
.n_value
2129 && offset
+ sec_vma
- (bfd_vma
) p2
->u
.syment
.n_value
<= maxdiff
)
2131 *filename_ptr
= (char *) p
->u
.syment
._n
._n_n
._n_offset
;
2132 maxdiff
= offset
+ sec_vma
- p2
->u
.syment
.n_value
;
2135 /* Avoid endless loops on erroneous files by ensuring that
2136 we always move forward in the file. */
2137 if (p
>= cof
->raw_syments
+ p
->u
.syment
.n_value
)
2140 p
= cof
->raw_syments
+ p
->u
.syment
.n_value
;
2141 if (p
> pend
|| p
->u
.syment
.n_sclass
!= C_FILE
)
2146 /* Now wander though the raw linenumbers of the section. */
2147 /* If we have been called on this section before, and th. e offset we
2148 want is further down then we can prime the lookup loop. */
2149 sec_data
= coff_section_data (abfd
, section
);
2150 if (sec_data
!= NULL
2152 && offset
>= sec_data
->offset
)
2155 *functionname_ptr
= sec_data
->function
;
2156 line_base
= sec_data
->line_base
;
2164 if (section
->lineno
!= NULL
)
2166 bfd_vma last_value
= 0;
2168 l
= §ion
->lineno
[i
];
2170 for (; i
< section
->lineno_count
; i
++)
2172 if (l
->line_number
== 0)
2174 /* Get the symbol this line number points at. */
2175 coff_symbol_type
*coff
= (coff_symbol_type
*) (l
->u
.sym
);
2176 if (coff
->symbol
.value
> offset
)
2178 *functionname_ptr
= coff
->symbol
.name
;
2179 last_value
= coff
->symbol
.value
;
2182 combined_entry_type
*s
= coff
->native
;
2183 s
= s
+ 1 + s
->u
.syment
.n_numaux
;
2185 /* In XCOFF a debugging symbol can follow the
2187 if (s
->u
.syment
.n_scnum
== N_DEBUG
)
2188 s
= s
+ 1 + s
->u
.syment
.n_numaux
;
2190 /* S should now point to the .bf of the function. */
2191 if (s
->u
.syment
.n_numaux
)
2193 /* The linenumber is stored in the auxent. */
2194 union internal_auxent
*a
= &((s
+ 1)->u
.auxent
);
2195 line_base
= a
->x_sym
.x_misc
.x_lnsz
.x_lnno
;
2196 *line_ptr
= line_base
;
2202 if (l
->u
.offset
> offset
)
2204 *line_ptr
= l
->line_number
+ line_base
- 1;
2209 /* If we fell off the end of the loop, then assume that this
2210 symbol has no line number info. Otherwise, symbols with no
2211 line number info get reported with the line number of the
2212 last line of the last symbol which does have line number
2213 info. We use 0x100 as a slop to account for cases where the
2214 last line has executable code. */
2215 if (i
>= section
->lineno_count
2217 && offset
- last_value
> 0x100)
2219 *functionname_ptr
= NULL
;
2224 /* Cache the results for the next call. */
2225 if (sec_data
== NULL
&& section
->owner
== abfd
)
2227 amt
= sizeof (struct coff_section_tdata
);
2228 section
->used_by_bfd
= bfd_zalloc (abfd
, amt
);
2229 sec_data
= (struct coff_section_tdata
*) section
->used_by_bfd
;
2231 if (sec_data
!= NULL
)
2233 sec_data
->offset
= offset
;
2235 sec_data
->function
= *functionname_ptr
;
2236 sec_data
->line_base
= line_base
;
2243 coff_find_inliner_info (bfd
*abfd
,
2244 const char **filename_ptr
,
2245 const char **functionname_ptr
,
2246 unsigned int *line_ptr
)
2250 found
= _bfd_dwarf2_find_inliner_info (abfd
, filename_ptr
,
2251 functionname_ptr
, line_ptr
,
2252 &coff_data(abfd
)->dwarf2_find_line_info
);
2257 coff_sizeof_headers (bfd
*abfd
, struct bfd_link_info
*info
)
2261 if (!info
->relocatable
)
2262 size
= bfd_coff_filhsz (abfd
) + bfd_coff_aoutsz (abfd
);
2264 size
= bfd_coff_filhsz (abfd
);
2266 size
+= abfd
->section_count
* bfd_coff_scnhsz (abfd
);
2270 /* Change the class of a coff symbol held by BFD. */
2273 bfd_coff_set_symbol_class (bfd
* abfd
,
2277 coff_symbol_type
* csym
;
2279 csym
= coff_symbol_from (abfd
, symbol
);
2282 bfd_set_error (bfd_error_invalid_operation
);
2285 else if (csym
->native
== NULL
)
2287 /* This is an alien symbol which no native coff backend data.
2288 We cheat here by creating a fake native entry for it and
2289 then filling in the class. This code is based on that in
2290 coff_write_alien_symbol(). */
2292 combined_entry_type
* native
;
2293 bfd_size_type amt
= sizeof (* native
);
2295 native
= bfd_zalloc (abfd
, amt
);
2299 native
->u
.syment
.n_type
= T_NULL
;
2300 native
->u
.syment
.n_sclass
= class;
2302 if (bfd_is_und_section (symbol
->section
))
2304 native
->u
.syment
.n_scnum
= N_UNDEF
;
2305 native
->u
.syment
.n_value
= symbol
->value
;
2307 else if (bfd_is_com_section (symbol
->section
))
2309 native
->u
.syment
.n_scnum
= N_UNDEF
;
2310 native
->u
.syment
.n_value
= symbol
->value
;
2314 native
->u
.syment
.n_scnum
=
2315 symbol
->section
->output_section
->target_index
;
2316 native
->u
.syment
.n_value
= (symbol
->value
2317 + symbol
->section
->output_offset
);
2318 if (! obj_pe (abfd
))
2319 native
->u
.syment
.n_value
+= symbol
->section
->output_section
->vma
;
2321 /* Copy the any flags from the file header into the symbol.
2323 native
->u
.syment
.n_flags
= bfd_asymbol_bfd (& csym
->symbol
)->flags
;
2326 csym
->native
= native
;
2329 csym
->native
->u
.syment
.n_sclass
= class;
2334 struct coff_comdat_info
*
2335 bfd_coff_get_comdat_section (bfd
*abfd
, struct bfd_section
*sec
)
2337 if (bfd_get_flavour (abfd
) == bfd_target_coff_flavour
2338 && coff_section_data (abfd
, sec
) != NULL
)
2339 return coff_section_data (abfd
, sec
)->comdat
;