X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=ld%2Flexsup.c;h=b618241f0d89bffc3d6cc235cd59215f6d9d03f6;hb=0ce398f106dac65c3a1d2f7d254213fa652af089;hp=b5e34683be7134d5dc8881c365ad73397cc98206;hpb=f05eb3b73cbb938b6519ad4462ab6fd9934804f9;p=deliverable%2Fbinutils-gdb.git diff --git a/ld/lexsup.c b/ld/lexsup.c index b5e34683be..b618241f0d 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -1,7 +1,5 @@ /* Parse options for the GNU linker. - Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 - Free Software Foundation, Inc. + Copyright (C) 1991-2015 Free Software Foundation, Inc. This file is part of the GNU Binutils. @@ -175,6 +173,15 @@ static const struct ld_option ld_options[] = '\0', NULL, N_("Ignored for GCC LTO option compatibility"), ONE_DASH }, #endif /* ENABLE_PLUGINS */ + { {"fuse-ld=", required_argument, NULL, OPTION_IGNORE}, + '\0', NULL, N_("Ignored for GCC linker option compatibility"), + ONE_DASH }, + { {"map-whole-files", optional_argument, NULL, OPTION_IGNORE}, + '\0', NULL, N_("Ignored for gold option compatibility"), + TWO_DASHES }, + { {"no-map-whole-files", optional_argument, NULL, OPTION_IGNORE}, + '\0', NULL, N_("Ignored for gold option compatibility"), + TWO_DASHES }, { {"Qy", no_argument, NULL, OPTION_IGNORE}, '\0', NULL, N_("Ignored for SVR4 compatibility"), ONE_DASH }, { {"emit-relocs", no_argument, NULL, 'q'}, @@ -378,6 +385,8 @@ static const struct ld_option ld_options[] = EXACTLY_TWO_DASHES }, { {"print-output-format", no_argument, NULL, OPTION_PRINT_OUTPUT_FORMAT}, '\0', NULL, N_("Print default output format"), TWO_DASHES }, + { {"print-sysroot", no_argument, NULL, OPTION_PRINT_SYSROOT}, + '\0', NULL, N_("Print current sysroot"), TWO_DASHES }, { {"qmagic", no_argument, NULL, OPTION_IGNORE}, '\0', NULL, N_("Ignored for Linux compatibility"), ONE_DASH }, { {"reduce-memory-overheads", no_argument, NULL, @@ -405,13 +414,13 @@ static const struct ld_option ld_options[] = { {"pic-executable", no_argument, NULL, OPTION_PIE}, '\0', NULL, NULL, TWO_DASHES }, { {"sort-common", optional_argument, NULL, OPTION_SORT_COMMON}, - '\0', N_("[=ascending|descending]"), - N_("Sort common symbols by alignment [in specified order]"), + '\0', N_("[=ascending|descending]"), + N_("Sort common symbols by alignment [in specified order]"), TWO_DASHES }, { {"sort_common", no_argument, NULL, OPTION_SORT_COMMON}, '\0', NULL, NULL, NO_HELP }, { {"sort-section", required_argument, NULL, OPTION_SORT_SECTION}, - '\0', N_("name|alignment"), + '\0', N_("name|alignment"), N_("Sort sections by name or maximum alignment"), TWO_DASHES }, { {"spare-dynamic-tags", required_argument, NULL, OPTION_SPARE_DYNAMIC_TAGS}, '\0', N_("COUNT"), N_("How many tags to reserve in .dynamic section"), @@ -441,6 +450,10 @@ static const struct ld_option ld_options[] = '\0', N_("ADDRESS"), N_("Set address of .text section"), ONE_DASH }, { {"Ttext-segment", required_argument, NULL, OPTION_TTEXT_SEGMENT}, '\0', N_("ADDRESS"), N_("Set address of text segment"), ONE_DASH }, + { {"Trodata-segment", required_argument, NULL, OPTION_TRODATA_SEGMENT}, + '\0', N_("ADDRESS"), N_("Set address of rodata segment"), ONE_DASH }, + { {"Tldata-segment", required_argument, NULL, OPTION_TLDATA_SEGMENT}, + '\0', N_("ADDRESS"), N_("Set address of ldata segment"), ONE_DASH }, { {"unresolved-symbols=", required_argument, NULL, OPTION_UNRESOLVED_SYMBOLS}, '\0', NULL, N_("How to handle unresolved symbols. is:\n" @@ -476,6 +489,10 @@ static const struct ld_option ld_options[] = '\0', NULL, N_("Warn if the multiple GP values are used"), TWO_DASHES }, { {"warn-once", no_argument, NULL, OPTION_WARN_ONCE}, '\0', NULL, N_("Warn only once per undefined symbol"), TWO_DASHES }, + { {"warn-orphan", no_argument, NULL, OPTION_WARN_ORPHAN}, + '\0', NULL, N_("Warn if any orphan sections are encountered"), TWO_DASHES }, + { {"no-warn-orphan", no_argument, NULL, OPTION_NO_WARN_ORPHAN}, + '\0', NULL, N_("Do not warn if orphan sections are encountered (default)"), TWO_DASHES }, { {"warn-section-align", no_argument, NULL, OPTION_WARN_SECTION_ALIGN}, '\0', NULL, N_("Warn if start of section changes due to alignment"), TWO_DASHES }, @@ -496,6 +513,16 @@ static const struct ld_option ld_options[] = TWO_DASHES }, { {"wrap", required_argument, NULL, OPTION_WRAP}, '\0', N_("SYMBOL"), N_("Use wrapper functions for SYMBOL"), TWO_DASHES }, + { {"ignore-unresolved-symbol", required_argument, NULL, + OPTION_IGNORE_UNRESOLVED_SYMBOL}, + '\0', N_("SYMBOL"), + N_("Unresolved SYMBOL will not cause an error or warning"), TWO_DASHES }, + { {"push-state", no_argument, NULL, OPTION_PUSH_STATE}, + '\0', NULL, N_("Push state of flags governing input file handling"), + TWO_DASHES }, + { {"pop-state", no_argument, NULL, OPTION_POP_STATE}, + '\0', NULL, N_("Pop state of flags governing input file handling"), + TWO_DASHES }, }; #define OPTION_COUNT ARRAY_SIZE (ld_options) @@ -945,14 +972,17 @@ parse_args (unsigned argc, char **argv) case OPTION_OFORMAT: lang_add_output_format (optarg, NULL, NULL, 0); break; + case OPTION_PRINT_SYSROOT: + if (*ld_sysroot) + puts (ld_sysroot); + xexit (0); + break; case OPTION_PRINT_OUTPUT_FORMAT: command_line.print_output_format = TRUE; break; #ifdef ENABLE_PLUGINS case OPTION_PLUGIN: - if (plugin_opt_plugin (optarg)) - einfo (_("%P%F: %s: error loading plugin\n"), - plugin_error_plugin ()); + plugin_opt_plugin (optarg); break; case OPTION_PLUGIN_OPT: if (plugin_opt_plugin_arg (optarg)) @@ -973,7 +1003,7 @@ parse_args (unsigned argc, char **argv) an error message here. We cannot just make this a warning, increment optind, and continue because getopt is too confused and will seg-fault the next time around. */ - einfo(_("%P%F: bad -rpath option\n")); + einfo(_("%P%F: unrecognised option: %s\n"), argv[optind]); link_info.relocatable = TRUE; config.build_constructors = FALSE; @@ -1100,7 +1130,11 @@ parse_args (unsigned argc, char **argv) break; case 'h': /* Used on Solaris. */ case OPTION_SONAME: - command_line.soname = optarg; + if (optarg[0] == '\0' && command_line.soname + && command_line.soname[0]) + einfo (_("%P: SONAME must not be empty string; keeping previous one\n")); + else + command_line.soname = optarg; break; case OPTION_SORT_COMMON: if (optarg == NULL @@ -1189,6 +1223,12 @@ parse_args (unsigned argc, char **argv) case OPTION_TTEXT_SEGMENT: set_segment_start (".text-segment", optarg); break; + case OPTION_TRODATA_SEGMENT: + set_segment_start (".rodata-segment", optarg); + break; + case OPTION_TLDATA_SEGMENT: + set_segment_start (".ldata-segment", optarg); + break; case OPTION_TRADITIONAL_FORMAT: link_info.traditional_format = TRUE; break; @@ -1214,7 +1254,7 @@ parse_args (unsigned argc, char **argv) case OPTION_VERBOSE: ldversion (1); version_printed = TRUE; - trace_file_tries = TRUE; + verbose = TRUE; overflow_cutoff_limit = -2; if (optarg != NULL) { @@ -1314,6 +1354,12 @@ parse_args (unsigned argc, char **argv) case OPTION_WARN_ONCE: config.warn_once = TRUE; break; + case OPTION_WARN_ORPHAN: + config.warn_orphan = TRUE; + break; + case OPTION_NO_WARN_ORPHAN: + config.warn_orphan = FALSE; + break; case OPTION_WARN_SECTION_ALIGN: config.warn_section_align = TRUE; break; @@ -1341,6 +1387,9 @@ parse_args (unsigned argc, char **argv) case OPTION_WRAP: add_wrap (optarg); break; + case OPTION_IGNORE_UNRESOLVED_SYMBOL: + add_ignoresym (&link_info, optarg); + break; case OPTION_DISCARD_NONE: link_info.discard = discard_none; break; @@ -1424,9 +1473,32 @@ parse_args (unsigned argc, char **argv) einfo (_("%P%X: --hash-size needs a numeric argument\n")); } break; + + case OPTION_PUSH_STATE: + input_flags.pushed = xmemdup (&input_flags, + sizeof (input_flags), + sizeof (input_flags)); + break; + + case OPTION_POP_STATE: + if (input_flags.pushed == NULL) + einfo (_("%P%F: no state pushed before popping\n")); + else + { + struct lang_input_statement_flags *oldp = input_flags.pushed; + memcpy (&input_flags, oldp, sizeof (input_flags)); + free (oldp); + } + break; } } + if (command_line.soname && command_line.soname[0] == '\0') + { + einfo (_("%P: SONAME must not be empty string; ignored\n")); + command_line.soname = NULL; + } + while (ingroup) { lang_leave_group (); @@ -1580,6 +1652,115 @@ set_segment_start (const char *section, char *valstr) lang_section_start (section, exp_intop (val), seg); } +static void +elf_shlib_list_options (FILE *file) +{ + fprintf (file, _("\ + --audit=AUDITLIB Specify a library to use for auditing\n")); + fprintf (file, _("\ + -Bgroup Selects group name lookup rules for DSO\n")); + fprintf (file, _("\ + --disable-new-dtags Disable new dynamic tags\n")); + fprintf (file, _("\ + --enable-new-dtags Enable new dynamic tags\n")); + fprintf (file, _("\ + --eh-frame-hdr Create .eh_frame_hdr section\n")); + fprintf (file, _("\ + --exclude-libs=LIBS Make all symbols in LIBS hidden\n")); + fprintf (file, _("\ + --hash-style=STYLE Set hash style to sysv, gnu or both\n")); + fprintf (file, _("\ + -P AUDITLIB, --depaudit=AUDITLIB\n" "\ + Specify a library to use for auditing dependencies\n")); + fprintf (file, _("\ + -z combreloc Merge dynamic relocs into one section and sort\n")); + fprintf (file, _("\ + -z nocombreloc Don't merge dynamic relocs into one section\n")); + fprintf (file, _("\ + -z global Make symbols in DSO available for subsequently\n\ + loaded objects\n")); + fprintf (file, _("\ + -z initfirst Mark DSO to be initialized first at runtime\n")); + fprintf (file, _("\ + -z interpose Mark object to interpose all DSOs but executable\n")); + fprintf (file, _("\ + -z lazy Mark object lazy runtime binding (default)\n")); + fprintf (file, _("\ + -z loadfltr Mark object requiring immediate process\n")); + fprintf (file, _("\ + -z nocopyreloc Don't create copy relocs\n")); + fprintf (file, _("\ + -z nodefaultlib Mark object not to use default search paths\n")); + fprintf (file, _("\ + -z nodelete Mark DSO non-deletable at runtime\n")); + fprintf (file, _("\ + -z nodlopen Mark DSO not available to dlopen\n")); + fprintf (file, _("\ + -z nodump Mark DSO not available to dldump\n")); + fprintf (file, _("\ + -z now Mark object non-lazy runtime binding\n")); + fprintf (file, _("\ + -z origin Mark object requiring immediate $ORIGIN\n\ + processing at runtime\n")); + fprintf (file, _("\ + -z relro Create RELRO program header\n")); + fprintf (file, _("\ + -z norelro Don't create RELRO program header\n")); + fprintf (file, _("\ + -z stacksize=SIZE Set size of stack segment\n")); + fprintf (file, _("\ + -z text Treat DT_TEXTREL in shared object as error\n")); + fprintf (file, _("\ + -z notext Don't treat DT_TEXTREL in shared object as error\n")); + fprintf (file, _("\ + -z textoff Don't treat DT_TEXTREL in shared object as error\n")); +} + +static void +elf_static_list_options (FILE *file) +{ + fprintf (file, _("\ + --build-id[=STYLE] Generate build ID note\n")); + fprintf (file, _("\ + --compress-debug-sections=[none|zlib|zlib-gnu|zlib-gabi]\n\ + Compress DWARF debug sections using zlib\n")); + fprintf (file, _("\ + -z common-page-size=SIZE Set common page size to SIZE\n")); + fprintf (file, _("\ + -z max-page-size=SIZE Set maximum page size to SIZE\n")); + fprintf (file, _("\ + -z defs Report unresolved symbols in object files.\n")); + fprintf (file, _("\ + -z muldefs Allow multiple definitions\n")); + fprintf (file, _("\ + -z execstack Mark executable as requiring executable stack\n")); + fprintf (file, _("\ + -z noexecstack Mark executable as not requiring executable stack\n")); +} + +static void +elf_plt_unwind_list_options (FILE *file) +{ + fprintf (file, _("\ + --ld-generated-unwind-info Generate exception handling info for PLT\n\ + --no-ld-generated-unwind-info\n\ + Don't generate exception handling info for PLT\n")); +} + +static void +ld_list_options (FILE *file, bfd_boolean elf, bfd_boolean shlib, + bfd_boolean plt_unwind) +{ + if (!elf) + return; + printf (_("ELF emulations:\n")); + if (plt_unwind) + elf_plt_unwind_list_options (file); + elf_static_list_options (file); + if (shlib) + elf_shlib_list_options (file); +} + /* Print help messages for the options. */ @@ -1692,6 +1873,8 @@ help (void) /* xgettext:c-format */ printf (_("%s: emulation specific options:\n"), program_name); + ld_list_options (stdout, ELF_LIST_OPTIONS, ELF_SHLIB_LIST_OPTIONS, + ELF_PLT_UNWIND_LIST_OPTIONS); ldemul_list_emulation_options (stdout); printf ("\n");