From 035801cebe9ffbdddb465b81ae514a465ce9c64c Mon Sep 17 00:00:00 2001 From: Faraz Shahbazker Date: Tue, 2 Apr 2019 20:17:16 +0000 Subject: [PATCH] ld: Add --no-print-map-discarded option Add a new option to disable the listing of discarded sections in map file output. The use case stems from a large application built with -ffunction-sections --gc-sections where the list of discarded sections blows up the map file output. The default behaviour remains to print discarded sections, but the new option allows us to disable it. ld/ * NEWS: Mention new option --no-print-map-discarded. * ld.h (ld_config_type) : New field. * ldlang.c (lang_map): Conditionally output discarded sections in map files based on configuration option. * ldlex.h (option_values) : New. * ldmain.c (main): Enabled print_map_discarded by default. * lexsup.c (ld_options): Add new command-line options. (parse_args) : New cases. * ld.texi: Document new options. * testsuite/ld-gc/gc.exp: Add new test. * testsuite/ld-gc/skip-map-discarded.s: New file. * testsuite/ld-gc/skip-map-discarded.d: New file. * testsuite/ld-gc/skip-map-discarded.map: New file. --- ld/ChangeLog | 18 ++++++++++++++++ ld/NEWS | 2 ++ ld/ld.h | 3 +++ ld/ld.texi | 8 ++++++++ ld/ldlang.c | 25 ++++++++++++----------- ld/ldlex.h | 2 ++ ld/ldmain.c | 1 + ld/lexsup.c | 14 +++++++++++++ ld/testsuite/ld-gc/gc.exp | 2 ++ ld/testsuite/ld-gc/skip-map-discarded.d | 3 +++ ld/testsuite/ld-gc/skip-map-discarded.map | 5 +++++ ld/testsuite/ld-gc/skip-map-discarded.s | 5 +++++ 12 files changed, 76 insertions(+), 12 deletions(-) create mode 100644 ld/testsuite/ld-gc/skip-map-discarded.d create mode 100644 ld/testsuite/ld-gc/skip-map-discarded.map create mode 100644 ld/testsuite/ld-gc/skip-map-discarded.s diff --git a/ld/ChangeLog b/ld/ChangeLog index 8e6a2d423fe..c8eda47e2f5 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,21 @@ +2019-04-11 Faraz Shahbazker + + * NEWS: Mention new option --no-print-map-discarded. + * ld.h (ld_config_type) : New field. + * ldlang.c (lang_map): Conditionally output discarded sections + in map files based on configuration option. + * ldlex.h (option_values) : New. + * ldmain.c (main): Enabled print_map_discarded by default. + * lexsup.c (ld_options): Add new command-line options. + (parse_args) : New cases. + * ld.texi: Document new options. + * testsuite/ld-gc/gc.exp: Add new test. + * testsuite/ld-gc/skip-map-discarded.s: New file. + * testsuite/ld-gc/skip-map-discarded.d: New file. + * testsuite/ld-gc/skip-map-discarded.map: New file. + 2019-04-11 H.J. Lu * ld.texi: Document -z cet-report=[none|warning|error]. diff --git a/ld/NEWS b/ld/NEWS index 597845a351f..de2cd16c4ef 100644 --- a/ld/NEWS +++ b/ld/NEWS @@ -1,5 +1,7 @@ -*- text -*- +* Add command-line option --no-print-map-discarded. + Changes in 2.33: * Add target handlers for AArch64 for ELF GNU program properties. diff --git a/ld/ld.h b/ld/ld.h index b97d977f37b..55078a9637b 100644 --- a/ld/ld.h +++ b/ld/ld.h @@ -318,6 +318,9 @@ typedef struct /* The common page size for ELF. */ bfd_vma commonpagesize; + + /* If set, print discarded sections in map file output. */ + bfd_boolean print_map_discarded; } ld_config_type; extern ld_config_type config; diff --git a/ld/ld.texi b/ld/ld.texi index 8e2ce869f86..71c8d2599b8 100644 --- a/ld/ld.texi +++ b/ld/ld.texi @@ -783,6 +783,14 @@ when merging properties in @file{foo.o}, whose 0xc0010001 property value is 0x1, and @file{bar.o}, whose 0xc0010001 property value is 0x1. @end itemize +@cindex link map discarded +@kindex --print-map-discarded +@kindex --no-print-map-discarded +@item --print-map-discarded +@itemx --no-print-map-discarded +Print (or do not print) the list of discarded and garbage collected sections +in the link map. Enabled by default. + @kindex -n @cindex read-only text @cindex NMAGIC diff --git a/ld/ldlang.c b/ld/ldlang.c index 1952d4a475c..898735efab5 100644 --- a/ld/ldlang.c +++ b/ld/ldlang.c @@ -2251,19 +2251,20 @@ lang_map (void) || file->flags.just_syms) continue; - for (s = file->the_bfd->sections; s != NULL; s = s->next) - if ((s->output_section == NULL - || s->output_section->owner != link_info.output_bfd) - && (s->flags & (SEC_LINKER_CREATED | SEC_KEEP)) == 0) - { - if (!dis_header_printed) - { - fprintf (config.map_file, _("\nDiscarded input sections\n\n")); - dis_header_printed = TRUE; - } + if (config.print_map_discarded) + for (s = file->the_bfd->sections; s != NULL; s = s->next) + if ((s->output_section == NULL + || s->output_section->owner != link_info.output_bfd) + && (s->flags & (SEC_LINKER_CREATED | SEC_KEEP)) == 0) + { + if (! dis_header_printed) + { + fprintf (config.map_file, _("\nDiscarded input sections\n\n")); + dis_header_printed = TRUE; + } - print_input_section (s, TRUE); - } + print_input_section (s, TRUE); + } } minfo (_("\nMemory Configuration\n\n")); diff --git a/ld/ldlex.h b/ld/ldlex.h index 32853debe45..32a7a6409e8 100644 --- a/ld/ldlex.h +++ b/ld/ldlex.h @@ -148,6 +148,8 @@ enum option_values OPTION_REQUIRE_DEFINED_SYMBOL, OPTION_ORPHAN_HANDLING, OPTION_FORCE_GROUP_ALLOCATION, + OPTION_PRINT_MAP_DISCARDED, + OPTION_NO_PRINT_MAP_DISCARDED, }; /* The initial parser states. */ diff --git a/ld/ldmain.c b/ld/ldmain.c index 77cdbd0dd29..da1c6a7658f 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -264,6 +264,7 @@ main (int argc, char **argv) config.make_executable = TRUE; config.magic_demand_paged = TRUE; config.text_read_only = TRUE; + config.print_map_discarded = TRUE; link_info.disable_target_specific_optimizations = -1; command_line.warn_mismatch = TRUE; diff --git a/ld/lexsup.c b/ld/lexsup.c index 88e85c73f49..dacb9623b40 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -543,6 +543,12 @@ static const struct ld_option ld_options[] = { {"orphan-handling", required_argument, NULL, OPTION_ORPHAN_HANDLING}, '\0', N_("=MODE"), N_("Control how orphan sections are handled."), TWO_DASHES }, + { {"print-map-discarded", no_argument, NULL, OPTION_PRINT_MAP_DISCARDED}, + '\0', NULL, N_("Show discarded sections in map file output (default)"), + TWO_DASHES }, + { {"no-print-map-discarded", no_argument, NULL, OPTION_NO_PRINT_MAP_DISCARDED}, + '\0', NULL, N_("Do not show discarded sections in map file output"), + TWO_DASHES }, }; #define OPTION_COUNT ARRAY_SIZE (ld_options) @@ -1577,6 +1583,14 @@ parse_args (unsigned argc, char **argv) einfo (_("%F%P: invalid argument to option" " \"--orphan-handling\"\n")); break; + + case OPTION_NO_PRINT_MAP_DISCARDED: + config.print_map_discarded = FALSE; + break; + + case OPTION_PRINT_MAP_DISCARDED: + config.print_map_discarded = TRUE; + break; } } diff --git a/ld/testsuite/ld-gc/gc.exp b/ld/testsuite/ld-gc/gc.exp index 536356c3816..13968cc7d1b 100644 --- a/ld/testsuite/ld-gc/gc.exp +++ b/ld/testsuite/ld-gc/gc.exp @@ -171,3 +171,5 @@ if { [is_elf_format] && [check_shared_lib_support] \ ] run_dump_test "pr20306" } + +run_dump_test "skip-map-discarded" diff --git a/ld/testsuite/ld-gc/skip-map-discarded.d b/ld/testsuite/ld-gc/skip-map-discarded.d new file mode 100644 index 00000000000..2e79f0be17e --- /dev/null +++ b/ld/testsuite/ld-gc/skip-map-discarded.d @@ -0,0 +1,3 @@ +#name: Check --no-print-map-discarded linker option +#ld: -e 0 --gc-sections --no-print-map-discarded +#map: skip-map-discarded.map diff --git a/ld/testsuite/ld-gc/skip-map-discarded.map b/ld/testsuite/ld-gc/skip-map-discarded.map new file mode 100644 index 00000000000..ca4818e7126 --- /dev/null +++ b/ld/testsuite/ld-gc/skip-map-discarded.map @@ -0,0 +1,5 @@ +#failif +Discarded input sections +#... + _foo.* +#... diff --git a/ld/testsuite/ld-gc/skip-map-discarded.s b/ld/testsuite/ld-gc/skip-map-discarded.s new file mode 100644 index 00000000000..630aab0d9ce --- /dev/null +++ b/ld/testsuite/ld-gc/skip-map-discarded.s @@ -0,0 +1,5 @@ +.globl __start +__start: + .section _foo +foo: + .long 1 -- 2.39.2