diff options
author | Alan Modra <amodra@gmail.com> | 2005-06-09 02:02:18 +0000 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2005-06-09 02:02:18 +0000 |
commit | 0e58fcf31568ed177c553ab05d95a31467173129 (patch) | |
tree | 7c70c256148107eb659165040ecc2822d63f61c6 /bfd/reloc.c | |
parent | 8f736feabda89768501fa9d2cc04328e2a578883 (diff) | |
download | gdb-0e58fcf31568ed177c553ab05d95a31467173129.zip gdb-0e58fcf31568ed177c553ab05d95a31467173129.tar.gz gdb-0e58fcf31568ed177c553ab05d95a31467173129.tar.bz2 |
* elflink.c (elf_mark_used_section): Delete.
(bfd_elf_gc_sections): Call bfd_generic_gc_sections.
* reloc.c (bfd_mark_used_section): New function.
(bfd_generic_gc_sections): Call bfd_mark_used_section.
Diffstat (limited to 'bfd/reloc.c')
-rw-r--r-- | bfd/reloc.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/bfd/reloc.c b/bfd/reloc.c index 078529d..207b775 100644 --- a/bfd/reloc.c +++ b/bfd/reloc.c @@ -4516,6 +4516,27 @@ bfd_generic_relax_section (bfd *abfd ATTRIBUTE_UNUSED, return TRUE; } +/* Mark sections containing global symbols. This is called through + bfd_link_hash_traverse. */ + +static bfd_boolean +bfd_mark_used_section (struct bfd_link_hash_entry *h, + void *data ATTRIBUTE_UNUSED) +{ + if (h->type == bfd_link_hash_warning) + h = h->u.i.link; + + if (h->type == bfd_link_hash_defined + || h->type == bfd_link_hash_defweak) + { + asection *s = h->u.def.section; + if (s != NULL && s->output_section != NULL) + s->output_section->flags |= SEC_KEEP; + } + + return TRUE; +} + /* INTERNAL_FUNCTION bfd_generic_gc_sections @@ -4526,13 +4547,18 @@ SYNOPSIS DESCRIPTION Provides default handling for relaxing for back ends which - don't do section gc -- i.e., does nothing. + don't do section gc -- i.e., does nothing besides the special + case for marking sections having global symbols. */ bfd_boolean bfd_generic_gc_sections (bfd *abfd ATTRIBUTE_UNUSED, - struct bfd_link_info *link_info ATTRIBUTE_UNUSED) + struct bfd_link_info *info) { + /* If called when info->gc_sections is 0, then mark all sections + containing global symbols with SEC_KEEP. */ + if (!info->gc_sections && !info->relocatable) + bfd_link_hash_traverse (info->hash, bfd_mark_used_section, NULL); return TRUE; } |