diff options
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r-- | bfd/elflink.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c index 1721f3f..9f1be5f 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -8996,7 +8996,28 @@ elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h, return TRUE; } + +/* Mark sections containing global symbols. This is called through + elf_link_hash_traverse. */ +static bfd_boolean +elf_mark_used_section (struct elf_link_hash_entry *h, + void *global ATTRIBUTE_UNUSED) +{ + if (h->root.type == bfd_link_hash_warning) + h = (struct elf_link_hash_entry *) h->root.u.i.link; + + if ((h->root.type == bfd_link_hash_defined + || h->root.type == bfd_link_hash_defweak)) + { + asection *s = h->root.u.def.section->output_section; + if (s) + s->flags |= SEC_KEEP; + } + + return TRUE; +} + /* Do mark and sweep of unused sections. */ bfd_boolean @@ -9008,6 +9029,17 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info) (asection *, struct bfd_link_info *, Elf_Internal_Rela *, struct elf_link_hash_entry *h, Elf_Internal_Sym *); + if (!info->gc_sections) + { + /* If we are called when info->gc_sections is 0, we will mark + all sections containing global symbols for non-relocable + link. */ + if (!info->relocatable) + elf_link_hash_traverse (elf_hash_table (info), + elf_mark_used_section, NULL); + return TRUE; + } + if (!get_elf_backend_data (abfd)->can_gc_sections || info->relocatable || info->emitrelocations |