aboutsummaryrefslogtreecommitdiff
path: root/bfd/reloc.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2005-06-09 02:02:18 +0000
committerAlan Modra <amodra@gmail.com>2005-06-09 02:02:18 +0000
commit0e58fcf31568ed177c553ab05d95a31467173129 (patch)
tree7c70c256148107eb659165040ecc2822d63f61c6 /bfd/reloc.c
parent8f736feabda89768501fa9d2cc04328e2a578883 (diff)
downloadgdb-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.c30
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;
}