From 4ca62a9b990a030552cd747f224bc0f265141c70 Mon Sep 17 00:00:00 2001 From: fincs Date: Sun, 2 Oct 2016 12:27:52 +0200 Subject: [PATCH] First attempt at implementing --gc-keep-exported --- bfd/elflink.c | 3 ++- include/bfdlink.h | 3 +++ ld/ldlex.h | 1 + ld/lexsup.c | 6 ++++++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/bfd/elflink.c b/bfd/elflink.c index 3e249400f6..e34216ff09 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -12894,6 +12894,7 @@ bfd_elf_gc_mark_dynamic_ref_symbol (struct elf_link_hash_entry *h, void *inf) && ELF_ST_VISIBILITY (h->other) != STV_INTERNAL && ELF_ST_VISIBILITY (h->other) != STV_HIDDEN && (!bfd_link_executable (info) + || info->gc_keep_exported || info->export_dynamic || (h->dynamic && d != NULL @@ -13012,7 +13013,7 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info) return FALSE; /* Mark dynamically referenced symbols. */ - if (htab->dynamic_sections_created) + if (htab->dynamic_sections_created || info->gc_keep_exported) elf_link_hash_traverse (htab, bed->gc_mark_dynamic_ref, info); /* Grovel through relocs to find out who stays ... */ diff --git a/include/bfdlink.h b/include/bfdlink.h index b392d54b35..d6a3bb701f 100644 --- a/include/bfdlink.h +++ b/include/bfdlink.h @@ -325,6 +325,9 @@ struct bfd_link_info /* TRUE if unreferenced sections should be removed. */ unsigned int gc_sections: 1; + /* TRUE if exported symbols should be kept during section gc. */ + unsigned int gc_keep_exported: 1; + /* TRUE if every symbol should be reported back via the notice callback. */ unsigned int notice_all: 1; diff --git a/ld/ldlex.h b/ld/ldlex.h index cf943e425f..cbe3267d0d 100644 --- a/ld/ldlex.h +++ b/ld/ldlex.h @@ -100,6 +100,7 @@ enum option_values OPTION_NO_GC_SECTIONS, OPTION_PRINT_GC_SECTIONS, OPTION_NO_PRINT_GC_SECTIONS, + OPTION_GC_KEEP_EXPORTED, OPTION_HASH_SIZE, OPTION_CHECK_SECTIONS, OPTION_NO_CHECK_SECTIONS, diff --git a/ld/lexsup.c b/ld/lexsup.c index 6d28e9142b..f4f0d59485 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -333,6 +333,9 @@ static const struct ld_option ld_options[] = { {"no-print-gc-sections", no_argument, NULL, OPTION_NO_PRINT_GC_SECTIONS}, '\0', NULL, N_("Do not list removed unused sections"), TWO_DASHES }, + { {"gc-keep-exported", no_argument, NULL, OPTION_GC_KEEP_EXPORTED}, + '\0', NULL, N_("Keep exported symbols when removing unused sections"), + TWO_DASHES }, { {"hash-size=", required_argument, NULL, OPTION_HASH_SIZE}, '\0', NULL, N_("Set default hash table size close to "), TWO_DASHES }, @@ -858,6 +861,9 @@ parse_args (unsigned argc, char **argv) case OPTION_PRINT_GC_SECTIONS: link_info.print_gc_sections = TRUE; break; + case OPTION_GC_KEEP_EXPORTED: + link_info.gc_keep_exported = TRUE; + break; case OPTION_HELP: help (); xexit (0); -- 2.11.0