From 1726b8f0a44d01188241c6f3f7de429b6ce39aae Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 22 Apr 1996 22:35:53 +0000 Subject: Optimize linking of stabs in sections as used in ELF and COFF. * stabs.c: New file. * libbfd-in.h (_bfd_link_section_stabs): Declare. (_bfd_write_section_stabs): Declare. (_bfd_write_stab_strings): Declare. * libbfd.h: Rebuild. * libcoff-in.h (struct coff_section_tdata): Add stab_info field. (struct coff_link_hash_table): Add stab_info field. * libcoff.h: Rebuild. * cofflink.c (_bfd_coff_link_hash_table_init): Initialize stab_info field. (coff_link_add_symbols): Call _bfd_link_section_stabs if appropriate. (_bfd_coff_final_link): Write out stab strings hash table. (_bfd_coff_link_input_bfd): Handle optimized stabs sections. * coff-ppc.c (ppc_bfd_coff_final_link): Write out stab strings hash table. * elf-bfd.h (struct elf_link_hash_table): Add stab_info field. (struct bfd_elf_section_data): Add stab_info field. * elf.c (_bfd_elf_link_hash_table_init): Initialize stab_info field. * elflink.h (elf_link_add_object_symbols): If appropriate, call _bfd_link_section_stabs. (elf_bfd_final_link): Write out stab strings hash table. (elf_link_input_bfd): Handle optimized stabs sections. * reloc.c (_bfd_final_link_relocate): Check address against _raw_size rather than _cooked_size. * Makefile.in: Rebuild dependencies. (BFD_LIBS): Add stabs.o (BFD_LIBS_CFILES): Add stabs.c. --- bfd/.Sanitize | 1 + bfd/ChangeLog | 33 ++++++++++++++++++++++++++++++++ bfd/VERSION | 2 +- bfd/elflink.h | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++------- 4 files changed, 89 insertions(+), 8 deletions(-) diff --git a/bfd/.Sanitize b/bfd/.Sanitize index 03e138d..54fca53 100644 --- a/bfd/.Sanitize +++ b/bfd/.Sanitize @@ -240,6 +240,7 @@ som.h sparclynx.c sparcnetbsd.c srec.c +stabs.c stab-syms.c sunos.c syms.c diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 902bfcd..a15ccef 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,5 +1,38 @@ Mon Apr 22 15:07:24 1996 Ian Lance Taylor + Optimize linking of stabs in sections as used in ELF and COFF. + * stabs.c: New file. + * libbfd-in.h (_bfd_link_section_stabs): Declare. + (_bfd_write_section_stabs): Declare. + (_bfd_write_stab_strings): Declare. + * libbfd.h: Rebuild. + * libcoff-in.h (struct coff_section_tdata): Add stab_info field. + (struct coff_link_hash_table): Add stab_info field. + * libcoff.h: Rebuild. + * cofflink.c (_bfd_coff_link_hash_table_init): Initialize + stab_info field. + (coff_link_add_symbols): Call _bfd_link_section_stabs if + appropriate. + (_bfd_coff_final_link): Write out stab strings hash table. + (_bfd_coff_link_input_bfd): Handle optimized stabs sections. + * coff-ppc.c (ppc_bfd_coff_final_link): Write out stab strings + hash table. + * elf-bfd.h (struct elf_link_hash_table): Add stab_info field. + (struct bfd_elf_section_data): Add stab_info field. + * elf.c (_bfd_elf_link_hash_table_init): Initialize stab_info + field. + * elflink.h (elf_link_add_object_symbols): If appropriate, call + _bfd_link_section_stabs. + (elf_bfd_final_link): Write out stab strings hash table. + (elf_link_input_bfd): Handle optimized stabs sections. + * reloc.c (_bfd_final_link_relocate): Check address against + _raw_size rather than _cooked_size. + * Makefile.in: Rebuild dependencies. + (BFD_LIBS): Add stabs.o + (BFD_LIBS_CFILES): Add stabs.c. + + * VERSION: Increment for bfdlink.h change. + * coffgen.c (coff_renumber_symbols): Correct handling of BSF_NOT_AT_END common symbols. diff --git a/bfd/VERSION b/bfd/VERSION index d4b6a2b..6d4c068 100644 --- a/bfd/VERSION +++ b/bfd/VERSION @@ -1 +1 @@ -cygnus-2.6.1 +cygnus-2.6.2 diff --git a/bfd/elflink.h b/bfd/elflink.h index 32da750..7fb51a7 100644 --- a/bfd/elflink.h +++ b/bfd/elflink.h @@ -964,6 +964,35 @@ elf_link_add_object_symbols (abfd, info) } } + /* If this is a non-traditional, non-relocateable link, try to + optimize the handling of the .stab/.stabstr sections. */ + if (! dynamic + && ! info->relocateable + && ! info->traditional_format + && info->hash->creator->flavour == bfd_target_elf_flavour + && (info->strip != strip_all && info->strip != strip_debugger)) + { + asection *stab, *stabstr; + + stab = bfd_get_section_by_name (abfd, ".stab"); + if (stab != NULL) + { + stabstr = bfd_get_section_by_name (abfd, ".stabstr"); + + if (stabstr != NULL) + { + struct bfd_elf_section_data *secdata; + + secdata = elf_section_data (stab); + if (! _bfd_link_section_stabs (abfd, + &elf_hash_table (info)->stab_info, + stab, stabstr, + &secdata->stab_info)) + goto error_return; + } + } + } + return true; error_return: @@ -2329,6 +2358,13 @@ elf_bfd_final_link (abfd, info) } } + /* If we have optimized stabs strings, output them. */ + if (elf_hash_table (info)->stab_info != NULL) + { + if (! _bfd_write_stab_strings (abfd, &elf_hash_table (info)->stab_info)) + goto error_return; + } + if (finfo.symstrtab != NULL) _bfd_stringtab_free (finfo.symstrtab); if (finfo.contents != NULL) @@ -2829,7 +2865,8 @@ elf_link_input_bfd (finfo, input_bfd) continue; } - if ((o->flags & SEC_HAS_CONTENTS) == 0) + if ((o->flags & SEC_HAS_CONTENTS) == 0 + || (o->_raw_size == 0 && (o->flags & SEC_RELOC) == 0)) continue; if ((o->flags & SEC_IN_MEMORY) != 0 @@ -3050,12 +3087,22 @@ elf_link_input_bfd (finfo, input_bfd) } /* Write out the modified section contents. */ - if (! bfd_set_section_contents (output_bfd, o->output_section, - finfo->contents, o->output_offset, - (o->_cooked_size != 0 - ? o->_cooked_size - : o->_raw_size))) - return false; + if (elf_section_data (o)->stab_info == NULL) + { + if (! bfd_set_section_contents (output_bfd, o->output_section, + finfo->contents, o->output_offset, + (o->_cooked_size != 0 + ? o->_cooked_size + : o->_raw_size))) + return false; + } + else + { + if (! _bfd_write_section_stabs (output_bfd, o, + &elf_section_data (o)->stab_info, + finfo->contents)) + return false; + } } return true; -- cgit v1.1