[ARM] PR ld/20608 Relocation truncated to fit: R_ARM_THM_JUMP24 for relocation to...
[deliverable/binutils-gdb.git] / ld / lexsup.c
index e4356bc20032182ab72cd115eef0334491640427..294c4b2d1b9fb481899fadf2f5d2a163fcd6ff14 100644 (file)
@@ -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
-   Free Software Foundation, Inc.
+   Copyright (C) 1991-2016 Free Software Foundation, Inc.
 
    This file is part of the GNU Binutils.
 
@@ -62,129 +60,14 @@ static void set_section_start (char *, char *);
 static void set_segment_start (const char *, char *);
 static void help (void);
 
-/* Non-zero if we are processing a --defsym from the command line.  */
-int parsing_defsym = 0;
-
-/* Codes used for the long options with no short synonyms.  150 isn't
-   special; it's just an arbitrary non-ASCII char value.  */
-enum option_values
-{
-  OPTION_ASSERT = 150,
-  OPTION_CALL_SHARED,
-  OPTION_CREF,
-  OPTION_DEFSYM,
-  OPTION_DEMANGLE,
-  OPTION_DYNAMIC_LINKER,
-  OPTION_SYSROOT,
-  OPTION_EB,
-  OPTION_EL,
-  OPTION_EMBEDDED_RELOCS,
-  OPTION_EXPORT_DYNAMIC,
-  OPTION_NO_EXPORT_DYNAMIC,
-  OPTION_HELP,
-  OPTION_IGNORE,
-  OPTION_MAP,
-  OPTION_NO_DEMANGLE,
-  OPTION_NO_KEEP_MEMORY,
-  OPTION_NO_WARN_MISMATCH,
-  OPTION_NO_WARN_SEARCH_MISMATCH,
-  OPTION_NOINHIBIT_EXEC,
-  OPTION_NON_SHARED,
-  OPTION_NO_WHOLE_ARCHIVE,
-  OPTION_OFORMAT,
-  OPTION_RELAX,
-  OPTION_NO_RELAX,
-  OPTION_RETAIN_SYMBOLS_FILE,
-  OPTION_RPATH,
-  OPTION_RPATH_LINK,
-  OPTION_SHARED,
-  OPTION_SONAME,
-  OPTION_SORT_COMMON,
-  OPTION_SORT_SECTION,
-  OPTION_STATS,
-  OPTION_SYMBOLIC,
-  OPTION_SYMBOLIC_FUNCTIONS,
-  OPTION_TASK_LINK,
-  OPTION_TBSS,
-  OPTION_TDATA,
-  OPTION_TTEXT,
-  OPTION_TTEXT_SEGMENT,
-  OPTION_TRADITIONAL_FORMAT,
-  OPTION_UR,
-  OPTION_VERBOSE,
-  OPTION_VERSION,
-  OPTION_VERSION_SCRIPT,
-  OPTION_VERSION_EXPORTS_SECTION,
-  OPTION_DYNAMIC_LIST,
-  OPTION_DYNAMIC_LIST_CPP_NEW,
-  OPTION_DYNAMIC_LIST_CPP_TYPEINFO,
-  OPTION_DYNAMIC_LIST_DATA,
-  OPTION_WARN_COMMON,
-  OPTION_WARN_CONSTRUCTORS,
-  OPTION_WARN_FATAL,
-  OPTION_NO_WARN_FATAL,
-  OPTION_WARN_MULTIPLE_GP,
-  OPTION_WARN_ONCE,
-  OPTION_WARN_SECTION_ALIGN,
-  OPTION_SPLIT_BY_RELOC,
-  OPTION_SPLIT_BY_FILE ,
-  OPTION_WHOLE_ARCHIVE,
-  OPTION_ADD_DT_NEEDED_FOR_DYNAMIC,
-  OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC,
-  OPTION_ADD_DT_NEEDED_FOR_REGULAR,
-  OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR,
-  OPTION_WRAP,
-  OPTION_FORCE_EXE_SUFFIX,
-  OPTION_GC_SECTIONS,
-  OPTION_NO_GC_SECTIONS,
-  OPTION_PRINT_GC_SECTIONS,
-  OPTION_NO_PRINT_GC_SECTIONS,
-  OPTION_HASH_SIZE,
-  OPTION_CHECK_SECTIONS,
-  OPTION_NO_CHECK_SECTIONS,
-  OPTION_NO_UNDEFINED,
-  OPTION_INIT,
-  OPTION_FINI,
-  OPTION_SECTION_START,
-  OPTION_UNIQUE,
-  OPTION_TARGET_HELP,
-  OPTION_ALLOW_SHLIB_UNDEFINED,
-  OPTION_NO_ALLOW_SHLIB_UNDEFINED,
-  OPTION_ALLOW_MULTIPLE_DEFINITION,
-  OPTION_NO_UNDEFINED_VERSION,
-  OPTION_DEFAULT_SYMVER,
-  OPTION_DEFAULT_IMPORTED_SYMVER,
-  OPTION_DISCARD_NONE,
-  OPTION_SPARE_DYNAMIC_TAGS,
-  OPTION_NO_DEFINE_COMMON,
-  OPTION_NOSTDLIB,
-  OPTION_NO_OMAGIC,
-  OPTION_STRIP_DISCARDED,
-  OPTION_NO_STRIP_DISCARDED,
-  OPTION_ACCEPT_UNKNOWN_INPUT_ARCH,
-  OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH,
-  OPTION_PIE,
-  OPTION_UNRESOLVED_SYMBOLS,
-  OPTION_WARN_UNRESOLVED_SYMBOLS,
-  OPTION_ERROR_UNRESOLVED_SYMBOLS,
-  OPTION_WARN_SHARED_TEXTREL,
-  OPTION_WARN_ALTERNATE_EM,
-  OPTION_REDUCE_MEMORY_OVERHEADS,
-#ifdef ENABLE_PLUGINS
-  OPTION_PLUGIN,
-  OPTION_PLUGIN_OPT,
-#endif /* ENABLE_PLUGINS */
-  OPTION_DEFAULT_SCRIPT,
-};
-
 /* The long options.  This structure is used for both the option
    parsing and the help text.  */
 
 enum control_enum {
   /* Use one dash before long option name.  */
-  ONE_DASH,
+  ONE_DASH = 1,
   /* Use two dashes before long option name.  */
-  TWO_DASHES,
+  TWO_DASHES = 2,
   /* Only accept two dashes before the long option name.
      This is an overloading of the use of this enum, since originally it
      was only intended to tell the --help display function how to display
@@ -255,6 +138,9 @@ static const struct ld_option ld_options[] =
   { {"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER},
     'I', N_("PROGRAM"), N_("Set PROGRAM as the dynamic linker to use"),
     TWO_DASHES },
+  { {"no-dynamic-linker", no_argument, NULL, OPTION_NO_DYNAMIC_LINKER},
+    '\0', NULL, N_("Produce an executable with no program interpreter header"),
+    TWO_DASHES },
   { {"library", required_argument, NULL, 'l'},
     'l', N_("LIBNAME"), N_("Search for library LIBNAME"), TWO_DASHES },
   { {"library-path", required_argument, NULL, 'L'},
@@ -278,12 +164,29 @@ static const struct ld_option ld_options[] =
     'o', N_("FILE"), N_("Set output file name"), EXACTLY_TWO_DASHES },
   { {NULL, required_argument, NULL, '\0'},
     'O', NULL, N_("Optimize output file"), ONE_DASH },
+  { {"out-implib", required_argument, NULL, OPTION_OUT_IMPLIB},
+    '\0', N_("FILE"), N_("Generate import library"), TWO_DASHES },
 #ifdef ENABLE_PLUGINS
   { {"plugin", required_argument, NULL, OPTION_PLUGIN},
     '\0', N_("PLUGIN"), N_("Load named plugin"), ONE_DASH },
   { {"plugin-opt", required_argument, NULL, OPTION_PLUGIN_OPT},
     '\0', N_("ARG"), N_("Send arg to last-loaded plugin"), ONE_DASH },
+  { {"flto", optional_argument, NULL, OPTION_IGNORE},
+    '\0', NULL, N_("Ignored for GCC LTO option compatibility"),
+    ONE_DASH },
+  { {"flto-partition=", required_argument, NULL, OPTION_IGNORE},
+    '\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'},
@@ -314,6 +217,9 @@ static const struct ld_option ld_options[] =
   { {"undefined", required_argument, NULL, 'u'},
     'u', N_("SYMBOL"), N_("Start with undefined reference to SYMBOL"),
     TWO_DASHES },
+  { {"require-defined", required_argument, NULL, OPTION_REQUIRE_DEFINED_SYMBOL},
+    '\0', N_("SYMBOL"), N_("Require SYMBOL be defined in the final output"),
+    TWO_DASHES },
   { {"unique", optional_argument, NULL, OPTION_UNIQUE},
     '\0', N_("[=SECTION]"),
     N_("Don't merge input [SECTION | orphan] sections"), TWO_DASHES },
@@ -448,7 +354,7 @@ static const struct ld_option ld_options[] =
     '\0', NULL, N_("Do not allow unresolved references in object files"),
     TWO_DASHES },
   { {"allow-shlib-undefined", no_argument, NULL, OPTION_ALLOW_SHLIB_UNDEFINED},
-    '\0', NULL, N_("Allow unresolved references in shared libaries"),
+    '\0', NULL, N_("Allow unresolved references in shared libraries"),
     TWO_DASHES },
   { {"no-allow-shlib-undefined", no_argument, NULL,
      OPTION_NO_ALLOW_SHLIB_UNDEFINED},
@@ -485,6 +391,10 @@ static const struct ld_option ld_options[] =
   { {"oformat", required_argument, NULL, OPTION_OFORMAT},
     '\0', N_("TARGET"), N_("Specify target of output file"),
     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,
@@ -512,13 +422,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"),
@@ -548,14 +458,19 @@ 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=<method>", required_argument, NULL,
      OPTION_UNRESOLVED_SYMBOLS},
     '\0', NULL, N_("How to handle unresolved symbols.  <method> is:\n"
                   "                                ignore-all, report-all, ignore-in-object-files,\n"
                   "                                ignore-in-shared-libs"),
     TWO_DASHES },
-  { {"verbose", no_argument, NULL, OPTION_VERBOSE},
-    '\0', NULL, N_("Output lots of information during link"), TWO_DASHES },
+  { {"verbose", optional_argument, NULL, OPTION_VERBOSE},
+    '\0', N_("[=NUMBER]"),
+    N_("Output lots of information during link"), TWO_DASHES },
   { {"dll-verbose", no_argument, NULL, OPTION_VERBOSE}, /* Linux.  */
     '\0', NULL, NULL, NO_HELP },
   { {"version-script", required_argument, NULL, OPTION_VERSION_SCRIPT },
@@ -602,6 +517,21 @@ 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 },
+  { {"print-memory-usage", no_argument, NULL, OPTION_PRINT_MEMORY_USAGE},
+    '\0', NULL, N_("Report target memory usage"), TWO_DASHES },
+  { {"orphan-handling", required_argument, NULL, OPTION_ORPHAN_HANDLING},
+    '\0', N_("=MODE"), N_("Control how orphan sections are handled."),
+    TWO_DASHES },
 };
 
 #define OPTION_COUNT ARRAY_SIZE (ld_options)
@@ -719,6 +649,7 @@ parse_args (unsigned argc, char **argv)
     {
       int longind;
       int optc;
+      static unsigned int defsym_count;
 
       /* Using last_optind lets us avoid calling ldemul_parse_args
         multiple times on a single option, which would lead to
@@ -750,7 +681,28 @@ parse_args (unsigned argc, char **argv)
       switch (optc)
        {
        case '?':
-         einfo (_("%P: unrecognized option '%s'\n"), argv[last_optind]);
+         {
+           /* If the last word on the command line is an option that
+              requires an argument, getopt will refuse to recognise it.
+              Try to catch such options here and issue a more helpful
+              error message than just "unrecognized option".  */
+           int opt;
+
+           for (opt = ARRAY_SIZE (ld_options); opt--;)
+             if (ld_options[opt].opt.has_arg == required_argument
+                 /* FIXME: There are a few short options that do not
+                    have long equivalents, but which require arguments.
+                    We should handle them too.  */
+                 && ld_options[opt].opt.name != NULL
+                 && strcmp (argv[last_optind] + ld_options[opt].control, ld_options[opt].opt.name) == 0)
+               {
+                 einfo (_("%P: %s: missing argument\n"), argv[last_optind]);
+                 break;
+               }
+
+           if (opt == -1)
+             einfo (_("%P: unrecognized option '%s'\n"), argv[last_optind]);
+         }
          /* Fall through.  */
 
        default:
@@ -767,10 +719,10 @@ parse_args (unsigned argc, char **argv)
             ``use only shared libraries'' but, then, we don't
             currently support shared libraries on HP/UX anyhow.  */
          if (strcmp (optarg, "archive") == 0)
-           config.dynamic_link = FALSE;
+           input_flags.dynamic = FALSE;
          else if (strcmp (optarg, "shared") == 0
                   || strcmp (optarg, "default") == 0)
-           config.dynamic_link = TRUE;
+           input_flags.dynamic = TRUE;
          else
            einfo (_("%P%F: unrecognized -a option `%s'\n"), optarg);
          break;
@@ -799,10 +751,10 @@ parse_args (unsigned argc, char **argv)
          yyparse ();
          break;
        case OPTION_CALL_SHARED:
-         config.dynamic_link = TRUE;
+         input_flags.dynamic = TRUE;
          break;
        case OPTION_NON_SHARED:
-         config.dynamic_link = FALSE;
+         input_flags.dynamic = FALSE;
          break;
        case OPTION_CREF:
          command_line.cref = TRUE;
@@ -813,11 +765,9 @@ parse_args (unsigned argc, char **argv)
          break;
        case OPTION_DEFSYM:
          lex_string = optarg;
-         lex_redirect (optarg);
+         lex_redirect (optarg, "--defsym", ++defsym_count);
          parser_input = input_defsym;
-         parsing_defsym = 1;
          yyparse ();
-         parsing_defsym = 0;
          lex_string = NULL;
          break;
        case OPTION_DEMANGLE:
@@ -828,7 +778,7 @@ parse_args (unsigned argc, char **argv)
 
              style = cplus_demangle_name_to_style (optarg);
              if (style == unknown_demangling)
-               einfo (_("%F%P: unknown demangling style `%s'"),
+               einfo (_("%F%P: unknown demangling style `%s'\n"),
                       optarg);
 
              cplus_demangle_set_style (style);
@@ -837,6 +787,10 @@ parse_args (unsigned argc, char **argv)
        case 'I':               /* Used on Solaris.  */
        case OPTION_DYNAMIC_LINKER:
          command_line.interpreter = optarg;
+         link_info.nointerp = 0;
+         break;
+       case OPTION_NO_DYNAMIC_LINKER:
+         link_info.nointerp = 1;
          break;
        case OPTION_SYSROOT:
          /* Already handled in ldmain.c.  */
@@ -928,17 +882,17 @@ parse_args (unsigned argc, char **argv)
        case 'N':
          config.text_read_only = FALSE;
          config.magic_demand_paged = FALSE;
-         config.dynamic_link = FALSE;
+         input_flags.dynamic = FALSE;
          break;
        case OPTION_NO_OMAGIC:
          config.text_read_only = TRUE;
          config.magic_demand_paged = TRUE;
-         /* NB/ Does not set dynamic_link to TRUE.
+         /* NB/ Does not set input_flags.dynamic to TRUE.
             Use --call-shared or -Bdynamic for this.  */
          break;
        case 'n':
          config.magic_demand_paged = FALSE;
-         config.dynamic_link = FALSE;
+         input_flags.dynamic = FALSE;
          break;
        case OPTION_NO_DEFINE_COMMON:
          command_line.inhibit_common_definition = TRUE;
@@ -1034,7 +988,7 @@ parse_args (unsigned argc, char **argv)
          config.only_cmd_line_lib_dirs = TRUE;
          break;
        case OPTION_NO_WHOLE_ARCHIVE:
-         whole_archive = FALSE;
+         input_flags.whole_archive = FALSE;
          break;
        case 'O':
          /* FIXME "-O<non-digits> <value>" used to set the address of
@@ -1052,15 +1006,24 @@ parse_args (unsigned argc, char **argv)
        case OPTION_OFORMAT:
          lang_add_output_format (optarg, NULL, NULL, 0);
          break;
+       case OPTION_OUT_IMPLIB:
+         command_line.out_implib_filename = xstrdup (optarg);
+         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))
-           einfo(_("%P%F: bad -plugin-opt option\n"));
+           einfo (_("%P%F: bad -plugin-opt option\n"));
          break;
 #endif /* ENABLE_PLUGINS */
        case 'q':
@@ -1077,13 +1040,17 @@ 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;
+         if (bfd_link_pic (&link_info))
+           einfo (_("%P%F: -r and %s may not be used together\n"),
+                    bfd_link_dll (&link_info) ? "-shared" : "-pie");
+
+         link_info.type = type_relocatable;
          config.build_constructors = FALSE;
          config.magic_demand_paged = FALSE;
          config.text_read_only = FALSE;
-         config.dynamic_link = FALSE;
+         input_flags.dynamic = FALSE;
          break;
        case 'R':
          /* The GNU linker traditionally uses -R to mean to include
@@ -1182,7 +1149,10 @@ parse_args (unsigned argc, char **argv)
        case OPTION_SHARED:
          if (config.has_shared)
            {
-             link_info.shared = TRUE;
+             if (bfd_link_relocatable (&link_info))
+               einfo (_("%P%F: -r and -shared may not be used together\n"));
+
+             link_info.type = type_dll;
              /* When creating a shared library, the default
                 behaviour is to ignore any unresolved references.  */
              if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
@@ -1196,15 +1166,21 @@ parse_args (unsigned argc, char **argv)
        case OPTION_PIE:
          if (config.has_shared)
            {
-             link_info.shared = TRUE;
-             link_info.pie = TRUE;
+             if (bfd_link_relocatable (&link_info))
+               einfo (_("%P%F: -r and -pie may not be used together\n"));
+
+             link_info.type = type_pie;
            }
          else
            einfo (_("%P%F: -pie not supported\n"));
          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
@@ -1293,6 +1269,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;
@@ -1300,15 +1282,22 @@ parse_args (unsigned argc, char **argv)
          link_info.task_link = TRUE;
          /* Fall through - do an implied -r option.  */
        case OPTION_UR:
-         link_info.relocatable = TRUE;
+         if (bfd_link_pic (&link_info))
+           einfo (_("%P%F: -r and %s may not be used together\n"),
+                    bfd_link_dll (&link_info) ? "-shared" : "-pie");
+
+         link_info.type = type_relocatable;
          config.build_constructors = TRUE;
          config.magic_demand_paged = FALSE;
          config.text_read_only = FALSE;
-         config.dynamic_link = FALSE;
+         input_flags.dynamic = FALSE;
          break;
        case 'u':
          ldlang_add_undef (optarg, TRUE);
          break;
+        case OPTION_REQUIRE_DEFINED_SYMBOL:
+          ldlang_add_require_defined (optarg);
+         break;
        case OPTION_UNIQUE:
          if (optarg != NULL)
            lang_add_unique (optarg);
@@ -1318,8 +1307,18 @@ 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)
+           {
+             char *end;
+             int level ATTRIBUTE_UNUSED = strtoul (optarg, &end, 0);
+             if (*end)
+               einfo (_("%P%F: invalid number `%s'\n"), optarg);
+#ifdef ENABLE_PLUGINS
+             report_plugin_symbols = level > 1;
+#endif /* ENABLE_PLUGINS */
+           }
          break;
        case 'v':
          ldversion (0);
@@ -1418,23 +1417,26 @@ parse_args (unsigned argc, char **argv)
          link_info.warn_alternate_em = TRUE;
          break;
        case OPTION_WHOLE_ARCHIVE:
-         whole_archive = TRUE;
+         input_flags.whole_archive = TRUE;
          break;
        case OPTION_ADD_DT_NEEDED_FOR_DYNAMIC:
-         add_DT_NEEDED_for_dynamic = TRUE;
+         input_flags.add_DT_NEEDED_for_dynamic = TRUE;
          break;
        case OPTION_NO_ADD_DT_NEEDED_FOR_DYNAMIC:
-         add_DT_NEEDED_for_dynamic = FALSE;
+         input_flags.add_DT_NEEDED_for_dynamic = FALSE;
          break;
        case OPTION_ADD_DT_NEEDED_FOR_REGULAR:
-         add_DT_NEEDED_for_regular = TRUE;
+         input_flags.add_DT_NEEDED_for_regular = TRUE;
          break;
        case OPTION_NO_ADD_DT_NEEDED_FOR_REGULAR:
-         add_DT_NEEDED_for_regular = FALSE;
+         input_flags.add_DT_NEEDED_for_regular = FALSE;
          break;
        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;
@@ -1518,9 +1520,50 @@ 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;
+
+       case OPTION_PRINT_MEMORY_USAGE:
+         command_line.print_memory_usage = TRUE;
+         break;
+
+       case OPTION_ORPHAN_HANDLING:
+         if (strcasecmp (optarg, "place") == 0)
+           config.orphan_handling = orphan_handling_place;
+         else if (strcasecmp (optarg, "warn") == 0)
+           config.orphan_handling = orphan_handling_warn;
+         else if (strcasecmp (optarg, "error") == 0)
+           config.orphan_handling = orphan_handling_error;
+         else if (strcasecmp (optarg, "discard") == 0)
+           config.orphan_handling = orphan_handling_discard;
+         else
+           einfo (_("%P%F: invalid argument to option"
+                    " \"--orphan-handling\"\n"));
+         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 ();
@@ -1541,11 +1584,63 @@ parse_args (unsigned argc, char **argv)
     /* FIXME: Should we allow emulations a chance to set this ?  */
     link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
 
-#ifdef ENABLE_PLUGINS
-  /* Now all the plugin arguments have been gathered, we can load them.  */
-  if (plugin_load_plugins ())
-    einfo (_("%P%F: %s: error loading plugin\n"), plugin_error_plugin ());
-#endif /* ENABLE_PLUGINS */
+  if (bfd_link_relocatable (&link_info)
+      && 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;
+    }
+
+  switch (command_line.dynamic_list)
+    {
+    case dynamic_list_unset:
+      break;
+    case dynamic_list_data:
+      link_info.dynamic_data = TRUE;
+    case dynamic_list:
+      link_info.dynamic = TRUE;
+      break;
+    }
+
+  if (!bfd_link_dll (&link_info))
+    {
+      if (command_line.filter_shlib)
+       einfo (_("%P%F: -F may not be used without -shared\n"));
+      if (command_line.auxiliary_filters)
+       einfo (_("%P%F: -f may not be used without -shared\n"));
+    }
+
+  /* Treat ld -r -s as ld -r -S -x (i.e., strip all local symbols).  I
+     don't see how else this can be handled, since in this case we
+     must preserve all externally visible symbols.  */
+  if (bfd_link_relocatable (&link_info) && link_info.strip == strip_all)
+    {
+      link_info.strip = strip_debugger;
+      if (link_info.discard == discard_sec_merge)
+       link_info.discard = discard_all;
+    }
 }
 
 /* Add the (colon-separated) elements of DIRLIST_PTR to the
@@ -1596,6 +1691,7 @@ set_segment_start (const char *section, char *valstr)
     if (strcmp (seg->name, name) == 0)
       {
        seg->value = val;
+       lang_section_start (section, exp_intop (val), seg);
        return;
       }
   /* There was no existing value so we must create a new segment
@@ -1614,6 +1710,135 @@ 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, _("\
+  --no-eh-frame-hdr           Do not 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"));
+#if DEFAULT_LD_Z_RELRO
+  fprintf (file, _("\
+  -z relro                    Create RELRO program header (default)\n"));
+  fprintf (file, _("\
+  -z norelro                  Don't create RELRO program header\n"));
+#else
+  fprintf (file, _("\
+  -z relro                    Create RELRO program header\n"));
+  fprintf (file, _("\
+  -z norelro                  Don't create RELRO program header (default)\n"));
+#endif
+  fprintf (file, _("\
+  -z common                   Generate common symbols with STT_COMMON type\n"));
+  fprintf (file, _("\
+  -z nocommon                 Generate common symbols with STT_OBJECT type\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"));
+#ifdef DEFAULT_FLAG_COMPRESS_DEBUG
+  fprintf (file, _("\
+                               Default: zlib-gabi\n"));
+#else
+  fprintf (file, _("\
+                               Default: none\n"));
+#endif
+  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);
+}
+
 \f
 /* Print help messages for the options.  */
 
@@ -1726,6 +1951,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");
 
This page took 0.033129 seconds and 4 git commands to generate.