aboutsummaryrefslogtreecommitdiff
path: root/bfd/elflink.h
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@airs.com>1996-04-22 22:35:53 +0000
committerIan Lance Taylor <ian@airs.com>1996-04-22 22:35:53 +0000
commit1726b8f0a44d01188241c6f3f7de429b6ce39aae (patch)
tree92a51387034557098d1caf93e1e2e3ed24fd1749 /bfd/elflink.h
parentf9fedc48d1d676bbcc6afd2187052d9b4ff804dc (diff)
downloadgdb-1726b8f0a44d01188241c6f3f7de429b6ce39aae.zip
gdb-1726b8f0a44d01188241c6f3f7de429b6ce39aae.tar.gz
gdb-1726b8f0a44d01188241c6f3f7de429b6ce39aae.tar.bz2
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.
Diffstat (limited to 'bfd/elflink.h')
-rw-r--r--bfd/elflink.h61
1 files changed, 54 insertions, 7 deletions
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;