From 221855059a11ab76aa909a5df4104354f9384139 Mon Sep 17 00:00:00 2001 From: fincs Date: Fri, 16 Dec 2016 13:42:02 +1030 Subject: [PATCH] Implement and document --gc-keep-exported include/ * bfdlink.h (struct bfd_link_info): Add gc_keep_exported. bfd/ * elflink.c (bfd_elf_gc_mark_dynamic_ref_symbol): Add handling for info->gc_keep_exported. (bfd_elf_gc_sections): Likewise. ld/ * ld.texinfo: Document --gc-keep-exported. * ldlex.h (enum option_values): Add OPTION_GC_KEEP_EXPORTED. * lexsup.c (parse_args): Add handling for --gc-keep-exported. --- bfd/ChangeLog | 6 ++++++ bfd/elflink.c | 3 ++- include/ChangeLog | 4 ++++ include/bfdlink.h | 3 +++ ld/ChangeLog | 6 ++++++ ld/ld.texinfo | 12 ++++++++++++ ld/ldlex.h | 1 + ld/lexsup.c | 6 ++++++ 8 files changed, 40 insertions(+), 1 deletion(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 46cb3834dd5..8c09c2c3910 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2016-12-16 fincs + + * elflink.c (bfd_elf_gc_mark_dynamic_ref_symbol): Add handling + for info->gc_keep_exported. + (bfd_elf_gc_sections): Likewise. + 2016-12-15 Alan Modra PR ld/20968 diff --git a/bfd/elflink.c b/bfd/elflink.c index fe6662d0dd7..07b79013d90 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -13051,6 +13051,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 @@ -13170,7 +13171,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/ChangeLog b/include/ChangeLog index 57ea85ec4c6..7e69c42f486 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2016-12-16 fincs + + * bfdlink.h (struct bfd_link_info): Add gc_keep_exported. + 2016-12-14 Maciej W. Rozycki * elf/mips.h (Elf_Internal_ABIFlags_v0): Also declare struct diff --git a/include/bfdlink.h b/include/bfdlink.h index 9b2194f6d5c..aea027b138d 100644 --- a/include/bfdlink.h +++ b/include/bfdlink.h @@ -328,6 +328,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/ChangeLog b/ld/ChangeLog index 086434aa3bb..8463c7c23b9 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,9 @@ +2016-12-16 fincs + + * ld.texinfo: Document --gc-keep-exported. + * ldlex.h (enum option_values): Add OPTION_GC_KEEP_EXPORTED. + * lexsup.c (parse_args): Add handling for --gc-keep-exported. + 2016-12-14 Yury Norov * ld/testsuite/ld-aarch64/aarch64-elf.exp: Add tests for tiny and diff --git a/ld/ld.texinfo b/ld/ld.texinfo index ec7ff1b85a7..17503eb4973 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -1558,6 +1558,18 @@ default behaviour (of not listing the sections that are removed) can be restored by specifying @samp{--no-print-gc-sections} on the command line. +@kindex --gc-keep-exported +@cindex garbage collection +@item --gc-keep-exported +When @samp{--gc-sections} is enabled, this option prevents garbage +collection of unused input sections that contain global symbols having +default or protected visibility. This option is intended to be used for +executables where unreferenced sections would otherwise be garbage +collected regardless of the external visibility of contained symbols. +Note that this option has no effect when linking shared objects since +it is already the default behaviour. This option is only supported for +ELF format targets. + @kindex --print-output-format @cindex output format @item --print-output-format diff --git a/ld/ldlex.h b/ld/ldlex.h index 52f7198ad2c..fd29008e3c7 100644 --- a/ld/ldlex.h +++ b/ld/ldlex.h @@ -101,6 +101,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 fb0b47f24e4..8ff5d1f567e 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -335,6 +335,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 }, @@ -861,6 +864,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.39.5