aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/.Sanitize1
-rw-r--r--bfd/ChangeLog33
-rw-r--r--bfd/VERSION2
-rw-r--r--bfd/elflink.h61
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 <ian@cygnus.com>
+ 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;