X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=ld%2Flexsup.c;h=d7766c3c557cb751a70754818dd3938f020f0079;hb=29298bf66f62f2f6c1efb0685623fbc29dfade90;hp=86a033a383f86bea9b480fc43c93b34e1f143c80;hpb=b14b7ff14ffe911ec562004304841cf7d2775a19;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/lexsup.c b/ld/lexsup.c index 86a033a383..d7766c3c55 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -1,5 +1,5 @@ /* Parse options for the GNU linker. - Copyright (C) 1991-2018 Free Software Foundation, Inc. + Copyright (C) 1991-2019 Free Software Foundation, Inc. This file is part of the GNU Binutils. @@ -27,6 +27,7 @@ #include "safe-ctype.h" #include "getopt.h" #include "bfdlink.h" +#include "ctf-api.h" #include "ld.h" #include "ldmain.h" #include "ldmisc.h" @@ -543,6 +544,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) @@ -559,6 +566,18 @@ parse_args (unsigned argc, char **argv) struct option *really_longopts; int last_optind; enum report_method how_to_report_unresolved_symbols = RM_GENERATE_ERROR; + enum symbolic_enum + { + symbolic_unset = 0, + symbolic, + symbolic_functions, + } opt_symbolic = symbolic_unset; + enum dynamic_list_enum + { + dynamic_list_unset = 0, + dynamic_list_data, + dynamic_list + } opt_dynamic_list = dynamic_list_unset; shortopts = (char *) xmalloc (OPTION_COUNT * 3 + 2); longopts = (struct option *) @@ -1227,17 +1246,17 @@ parse_args (unsigned argc, char **argv) config.stats = TRUE; break; case OPTION_SYMBOLIC: - command_line.symbolic = symbolic; + opt_symbolic = symbolic; break; case OPTION_SYMBOLIC_FUNCTIONS: - command_line.symbolic = symbolic_functions; + opt_symbolic = symbolic_functions; break; case 't': - trace_files = TRUE; + ++trace_files; break; case 'T': previous_script_handle = saved_script_handle; - ldfile_open_command_file (optarg); + ldfile_open_script_file (optarg); parser_input = input_script; yyparse (); previous_script_handle = NULL; @@ -1375,23 +1394,23 @@ parse_args (unsigned argc, char **argv) command_line.version_exports_section = optarg; break; case OPTION_DYNAMIC_LIST_DATA: - command_line.dynamic_list = dynamic_list_data; - if (command_line.symbolic == symbolic) - command_line.symbolic = symbolic_unset; + opt_dynamic_list = dynamic_list_data; + if (opt_symbolic == symbolic) + opt_symbolic = symbolic_unset; break; case OPTION_DYNAMIC_LIST_CPP_TYPEINFO: lang_append_dynamic_list_cpp_typeinfo (); - if (command_line.dynamic_list != dynamic_list_data) - command_line.dynamic_list = dynamic_list; - if (command_line.symbolic == symbolic) - command_line.symbolic = symbolic_unset; + if (opt_dynamic_list != dynamic_list_data) + opt_dynamic_list = dynamic_list; + if (opt_symbolic == symbolic) + opt_symbolic = symbolic_unset; break; case OPTION_DYNAMIC_LIST_CPP_NEW: lang_append_dynamic_list_cpp_new (); - if (command_line.dynamic_list != dynamic_list_data) - command_line.dynamic_list = dynamic_list; - if (command_line.symbolic == symbolic) - command_line.symbolic = symbolic_unset; + if (opt_dynamic_list != dynamic_list_data) + opt_dynamic_list = dynamic_list; + if (opt_symbolic == symbolic) + opt_symbolic = symbolic_unset; break; case OPTION_DYNAMIC_LIST: /* This option indicates a small script that only specifies @@ -1406,10 +1425,10 @@ parse_args (unsigned argc, char **argv) parser_input = input_dynamic_list; yyparse (); } - if (command_line.dynamic_list != dynamic_list_data) - command_line.dynamic_list = dynamic_list; - if (command_line.symbolic == symbolic) - command_line.symbolic = symbolic_unset; + if (opt_dynamic_list != dynamic_list_data) + opt_dynamic_list = dynamic_list; + if (opt_symbolic == symbolic) + opt_symbolic = symbolic_unset; break; case OPTION_WARN_COMMON: config.warn_common = TRUE; @@ -1577,6 +1596,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; } } @@ -1588,6 +1615,7 @@ parse_args (unsigned argc, char **argv) while (ingroup) { + einfo (_("%P: missing --end-group; added as last command line option\n")); lang_leave_group (); ingroup--; } @@ -1610,32 +1638,33 @@ parse_args (unsigned argc, char **argv) && command_line.check_section_addresses < 0) command_line.check_section_addresses = 0; - /* We may have -Bsymbolic, -Bsymbolic-functions, --dynamic-list-data, - --dynamic-list-cpp-new, --dynamic-list-cpp-typeinfo and - --dynamic-list FILE. -Bsymbolic and -Bsymbolic-functions are - for PIC outputs. -Bsymbolic overrides all others and vice versa. */ - switch (command_line.symbolic) - { - case symbolic_unset: - break; - case symbolic: - /* -Bsymbolic is for PIC output only. */ - if (bfd_link_pic (&link_info)) - { - link_info.symbolic = TRUE; - /* Should we free the unused memory? */ - link_info.dynamic_list = NULL; - command_line.dynamic_list = dynamic_list_unset; - } - break; - case symbolic_functions: - /* -Bsymbolic-functions is for PIC output only. */ - if (bfd_link_pic (&link_info)) - command_line.dynamic_list = dynamic_list_data; - break; - } + /* -Bsymbolic and -Bsymbols-functions are for shared library output. */ + if (bfd_link_dll (&link_info)) + switch (opt_symbolic) + { + case symbolic_unset: + break; + case symbolic: + link_info.symbolic = TRUE; + if (link_info.dynamic_list) + { + struct bfd_elf_version_expr *ent, *next; + for (ent = link_info.dynamic_list->head.list; ent; ent = next) + { + next = ent->next; + free (ent); + } + free (link_info.dynamic_list); + link_info.dynamic_list = NULL; + } + opt_dynamic_list = dynamic_list_unset; + break; + case symbolic_functions: + opt_dynamic_list = dynamic_list_data; + break; + } - switch (command_line.dynamic_list) + switch (opt_dynamic_list) { case dynamic_list_unset: break; @@ -1719,7 +1748,7 @@ set_segment_start (const char *section, char *valstr) } /* There was no existing value so we must create a new segment entry. */ - seg = (segment_type *) stat_alloc (sizeof (*seg)); + seg = stat_alloc (sizeof (*seg)); seg->name = name; seg->value = val; seg->used = FALSE;