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.
This commit is contained in:
fincs 2016-12-16 13:42:02 +10:30 committed by Alan Modra
parent 4c4067e410
commit 221855059a
8 changed files with 40 additions and 1 deletions

View File

@ -1,3 +1,9 @@
2016-12-16 fincs <fincs.alt1@gmail.com>
* 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 <amodra@gmail.com>
PR ld/20968

View File

@ -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 ... */

View File

@ -1,3 +1,7 @@
2016-12-16 fincs <fincs.alt1@gmail.com>
* bfdlink.h (struct bfd_link_info): Add gc_keep_exported.
2016-12-14 Maciej W. Rozycki <macro@imgtec.com>
* elf/mips.h (Elf_Internal_ABIFlags_v0): Also declare struct

View File

@ -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;

View File

@ -1,3 +1,9 @@
2016-12-16 fincs <fincs.alt1@gmail.com>
* 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 <ynorov@caviumnetworks.com>
* ld/testsuite/ld-aarch64/aarch64-elf.exp: Add tests for tiny and

View File

@ -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

View File

@ -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,

View File

@ -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=<NUMBER>", required_argument, NULL, OPTION_HASH_SIZE},
'\0', NULL, N_("Set default hash table size close to <NUMBER>"),
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);