diff options
Diffstat (limited to 'binutils-2.22/bfd/coffgen.c')
-rw-r--r-- | binutils-2.22/bfd/coffgen.c | 86 |
1 files changed, 68 insertions, 18 deletions
diff --git a/binutils-2.22/bfd/coffgen.c b/binutils-2.22/bfd/coffgen.c index bbb0acc..509119b 100644 --- a/binutils-2.22/bfd/coffgen.c +++ b/binutils-2.22/bfd/coffgen.c @@ -983,23 +983,36 @@ coff_write_symbol (bfd *abfd, file originally. This symbol may have been created by the linker, or we may be linking a non COFF file to a COFF file. */ -static bfd_boolean +bfd_boolean coff_write_alien_symbol (bfd *abfd, asymbol *symbol, + struct internal_syment *isym, bfd_vma *written, bfd_size_type *string_size_p, asection **debug_string_section_p, bfd_size_type *debug_string_size_p) { combined_entry_type *native; - combined_entry_type dummy; + combined_entry_type dummy[2]; asection *output_section = symbol->section->output_section ? symbol->section->output_section : symbol->section; + struct bfd_link_info *link_info = coff_data (abfd)->link_info; + bfd_boolean ret; - native = &dummy; + if ((!link_info || link_info->strip_discarded) + && !bfd_is_abs_section (symbol->section) + && symbol->section->output_section == bfd_abs_section_ptr) + { + symbol->name = ""; + if (isym != NULL) + memset (isym, 0, sizeof(*isym)); + return TRUE; + } + native = dummy; native->u.syment.n_type = T_NULL; native->u.syment.n_flags = 0; + native->u.syment.n_numaux = 0; if (bfd_is_und_section (symbol->section)) { native->u.syment.n_scnum = N_UNDEF; @@ -1010,6 +1023,11 @@ coff_write_alien_symbol (bfd *abfd, native->u.syment.n_scnum = N_UNDEF; native->u.syment.n_value = symbol->value; } + else if (symbol->flags & BSF_FILE) + { + native->u.syment.n_scnum = N_DEBUG; + native->u.syment.n_numaux = 1; + } else if (symbol->flags & BSF_DEBUGGING) { /* There isn't much point to writing out a debugging symbol @@ -1017,6 +1035,8 @@ coff_write_alien_symbol (bfd *abfd, format. So, we just ignore them. We must clobber the symbol name to keep it from being put in the string table. */ symbol->name = ""; + if (isym != NULL) + memset (isym, 0, sizeof(*isym)); return TRUE; } else @@ -1037,16 +1057,20 @@ coff_write_alien_symbol (bfd *abfd, } native->u.syment.n_type = 0; - if (symbol->flags & BSF_LOCAL) + if (symbol->flags & BSF_FILE) + native->u.syment.n_sclass = C_FILE; + else if (symbol->flags & BSF_LOCAL) native->u.syment.n_sclass = C_STAT; else if (symbol->flags & BSF_WEAK) native->u.syment.n_sclass = obj_pe (abfd) ? C_NT_WEAK : C_WEAKEXT; else native->u.syment.n_sclass = C_EXT; - native->u.syment.n_numaux = 0; - return coff_write_symbol (abfd, symbol, native, written, string_size_p, - debug_string_section_p, debug_string_size_p); + ret = coff_write_symbol (abfd, symbol, native, written, string_size_p, + debug_string_section_p, debug_string_size_p); + if (isym != NULL) + *isym = native->u.syment; + return ret; } /* Write a native symbol to a COFF file. */ @@ -1061,6 +1085,15 @@ coff_write_native_symbol (bfd *abfd, { combined_entry_type *native = symbol->native; alent *lineno = symbol->lineno; + struct bfd_link_info *link_info = coff_data (abfd)->link_info; + + if ((!link_info || link_info->strip_discarded) + && !bfd_is_abs_section (symbol->symbol.section) + && symbol->symbol.section->output_section == bfd_abs_section_ptr) + { + symbol->symbol.name = ""; + return TRUE; + } /* If this symbol has an associated line number, we must store the symbol index in the line number field. We also tag the auxent to @@ -1153,8 +1186,8 @@ coff_write_symbols (bfd *abfd) if (c_symbol == (coff_symbol_type *) NULL || c_symbol->native == (combined_entry_type *) NULL) { - if (!coff_write_alien_symbol (abfd, symbol, &written, &string_size, - &debug_string_section, + if (!coff_write_alien_symbol (abfd, symbol, NULL, &written, + &string_size, &debug_string_section, &debug_string_size)) return FALSE; } @@ -2085,13 +2118,14 @@ _bfd_coff_is_local_label_name (bfd *abfd ATTRIBUTE_UNUSED, nearest to the wanted location. */ bfd_boolean -coff_find_nearest_line (bfd *abfd, - asection *section, - asymbol **symbols, - bfd_vma offset, - const char **filename_ptr, - const char **functionname_ptr, - unsigned int *line_ptr) +coff_find_nearest_line_with_names (bfd *abfd, + const struct dwarf_debug_section *debug_sections, + asection *section, + asymbol **symbols, + bfd_vma offset, + const char **filename_ptr, + const char **functionname_ptr, + unsigned int *line_ptr) { bfd_boolean found; unsigned int i; @@ -2116,9 +2150,10 @@ coff_find_nearest_line (bfd *abfd, return TRUE; /* Also try examining DWARF2 debugging information. */ - if (_bfd_dwarf2_find_nearest_line (abfd, section, symbols, offset, + if (_bfd_dwarf2_find_nearest_line (abfd, debug_sections, + section, symbols, offset, filename_ptr, functionname_ptr, - line_ptr, 0, + line_ptr, NULL, 0, &coff_data(abfd)->dwarf2_find_line_info)) return TRUE; @@ -2299,6 +2334,21 @@ coff_find_nearest_line (bfd *abfd, } bfd_boolean +coff_find_nearest_line (bfd *abfd, + asection *section, + asymbol **symbols, + bfd_vma offset, + const char **filename_ptr, + const char **functionname_ptr, + unsigned int *line_ptr) +{ + return coff_find_nearest_line_with_names (abfd, dwarf_debug_sections, + section, symbols, offset, + filename_ptr, functionname_ptr, + line_ptr); +} + +bfd_boolean coff_find_inliner_info (bfd *abfd, const char **filename_ptr, const char **functionname_ptr, |