ld-x86-64: Pass -z notext to linker for tests with DT_TEXTREL
[deliverable/binutils-gdb.git] / ld / lexsup.c
index 636ce17bab1377bc8f1e2384c8a34278a782054b..04db2f129f872891b5d97ccb223e023a6cf21140 100644 (file)
@@ -1,5 +1,5 @@
 /* Parse options for the GNU linker.
-   Copyright (C) 1991-2018 Free Software Foundation, Inc.
+   Copyright (C) 1991-2020 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"
@@ -121,6 +122,10 @@ static const struct ld_option ld_options[] =
     'E', NULL, N_("Export all dynamic symbols"), TWO_DASHES },
   { {"no-export-dynamic", no_argument, NULL, OPTION_NO_EXPORT_DYNAMIC},
     '\0', NULL, N_("Undo the effect of --export-dynamic"), TWO_DASHES },
+  { {"enable-non-contiguous-regions", no_argument, NULL, OPTION_NON_CONTIGUOUS_REGIONS},
+    '\0', NULL, N_("Enable support of non-contiguous memory regions"), TWO_DASHES },
+  { {"enable-non-contiguous-regions-warnings", no_argument, NULL, OPTION_NON_CONTIGUOUS_REGIONS_WARNINGS},
+    '\0', NULL, N_("Enable warnings when --enable-non-contiguous-regions may cause unexpected behaviour"), TWO_DASHES },
   { {"EB", no_argument, NULL, OPTION_EB},
     '\0', NULL, N_("Link big-endian objects"), ONE_DASH },
   { {"EL", no_argument, NULL, OPTION_EL},
@@ -314,6 +319,11 @@ static const struct ld_option ld_options[] =
   { {"demangle", optional_argument, NULL, OPTION_DEMANGLE},
     '\0', N_("[=STYLE]"), N_("Demangle symbol names [using STYLE]"),
     TWO_DASHES },
+  { {"disable-multiple-abs-defs", no_argument, NULL,
+     OPTION_DISABLE_MULTIPLE_DEFS_ABS},
+    '\0', NULL, N_("Do not allow multiple definitions with symbols included\n"
+                  "           in filename invoked by -R or --just-symbols"),
+    TWO_DASHES},
   { {"embedded-relocs", no_argument, NULL, OPTION_EMBEDDED_RELOCS},
     '\0', NULL, N_("Generate embedded relocs"), TWO_DASHES},
   { {"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL},
@@ -538,6 +548,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)
@@ -553,7 +569,18 @@ parse_args (unsigned argc, char **argv)
   struct option *longopts;
   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 *)
@@ -821,6 +848,12 @@ parse_args (unsigned argc, char **argv)
        case OPTION_NO_EXPORT_DYNAMIC:
          link_info.export_dynamic = FALSE;
          break;
+       case OPTION_NON_CONTIGUOUS_REGIONS:
+         link_info.non_contiguous_regions = TRUE;
+         break;
+       case OPTION_NON_CONTIGUOUS_REGIONS_WARNINGS:
+         link_info.non_contiguous_regions_warnings = TRUE;
+         break;
        case 'e':
          lang_add_entry (optarg, TRUE);
          break;
@@ -904,6 +937,7 @@ parse_args (unsigned argc, char **argv)
             Use --call-shared or -Bdynamic for this.  */
          break;
        case 'n':
+         config.text_read_only = TRUE;
          config.magic_demand_paged = FALSE;
          input_flags.dynamic = FALSE;
          break;
@@ -923,15 +957,13 @@ parse_args (unsigned argc, char **argv)
          link_info.keep_memory = FALSE;
          break;
        case OPTION_NO_UNDEFINED:
-         link_info.unresolved_syms_in_objects
-           = how_to_report_unresolved_symbols;
+         link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
          break;
        case OPTION_ALLOW_SHLIB_UNDEFINED:
          link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
          break;
        case OPTION_NO_ALLOW_SHLIB_UNDEFINED:
-         link_info.unresolved_syms_in_shared_libs
-           = how_to_report_unresolved_symbols;
+         link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
          break;
        case OPTION_UNRESOLVED_SYMBOLS:
          if (strcmp (optarg, "ignore-all") == 0)
@@ -941,40 +973,27 @@ parse_args (unsigned argc, char **argv)
            }
          else if (strcmp (optarg, "report-all") == 0)
            {
-             link_info.unresolved_syms_in_objects
-               = how_to_report_unresolved_symbols;
-             link_info.unresolved_syms_in_shared_libs
-               = how_to_report_unresolved_symbols;
+             link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
+             link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
            }
          else if (strcmp (optarg, "ignore-in-object-files") == 0)
            {
              link_info.unresolved_syms_in_objects = RM_IGNORE;
-             link_info.unresolved_syms_in_shared_libs
-               = how_to_report_unresolved_symbols;
+             link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
            }
          else if (strcmp (optarg, "ignore-in-shared-libs") == 0)
            {
-             link_info.unresolved_syms_in_objects
-               = how_to_report_unresolved_symbols;
+             link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
              link_info.unresolved_syms_in_shared_libs = RM_IGNORE;
            }
          else
            einfo (_("%F%P: bad --unresolved-symbols option: %s\n"), optarg);
          break;
        case OPTION_WARN_UNRESOLVED_SYMBOLS:
-         how_to_report_unresolved_symbols = RM_GENERATE_WARNING;
-         if (link_info.unresolved_syms_in_objects == RM_GENERATE_ERROR)
-           link_info.unresolved_syms_in_objects = RM_GENERATE_WARNING;
-         if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_ERROR)
-           link_info.unresolved_syms_in_shared_libs = RM_GENERATE_WARNING;
+         link_info.warn_unresolved_syms = TRUE;
          break;
-
        case OPTION_ERROR_UNRESOLVED_SYMBOLS:
-         how_to_report_unresolved_symbols = RM_GENERATE_ERROR;
-         if (link_info.unresolved_syms_in_objects == RM_GENERATE_WARNING)
-           link_info.unresolved_syms_in_objects = RM_GENERATE_ERROR;
-         if (link_info.unresolved_syms_in_shared_libs == RM_GENERATE_WARNING)
-           link_info.unresolved_syms_in_shared_libs = RM_GENERATE_ERROR;
+         link_info.warn_unresolved_syms = FALSE;
          break;
        case OPTION_ALLOW_MULTIPLE_DEFINITION:
          link_info.allow_multiple_definition = TRUE;
@@ -1159,6 +1178,9 @@ parse_args (unsigned argc, char **argv)
        case OPTION_NO_STRIP_DISCARDED:
          link_info.strip_discarded = FALSE;
          break;
+       case OPTION_DISABLE_MULTIPLE_DEFS_ABS:
+         link_info.prohibit_multiple_definition_absolute = TRUE;
+         break;
        case OPTION_SHARED:
          if (config.has_shared)
            {
@@ -1219,17 +1241,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;
@@ -1367,23 +1389,17 @@ 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;
          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;
          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;
          break;
        case OPTION_DYNAMIC_LIST:
          /* This option indicates a small script that only specifies
@@ -1398,10 +1414,8 @@ 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;
          break;
        case OPTION_WARN_COMMON:
          config.warn_common = TRUE;
@@ -1463,8 +1477,7 @@ parse_args (unsigned argc, char **argv)
        case 'Y':
          if (CONST_STRNEQ (optarg, "P,"))
            optarg += 2;
-         if (default_dirlist != NULL)
-           free (default_dirlist);
+         free (default_dirlist);
          default_dirlist = xstrdup (optarg);
          break;
        case 'y':
@@ -1569,6 +1582,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;
        }
     }
 
@@ -1580,6 +1601,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--;
     }
@@ -1592,42 +1614,17 @@ parse_args (unsigned argc, char **argv)
 
   if (link_info.unresolved_syms_in_objects == RM_NOT_YET_SET)
     /* FIXME: Should we allow emulations a chance to set this ?  */
-    link_info.unresolved_syms_in_objects = how_to_report_unresolved_symbols;
+    link_info.unresolved_syms_in_objects = RM_DIAGNOSE;
 
   if (link_info.unresolved_syms_in_shared_libs == RM_NOT_YET_SET)
     /* FIXME: Should we allow emulations a chance to set this ?  */
-    link_info.unresolved_syms_in_shared_libs = how_to_report_unresolved_symbols;
+    link_info.unresolved_syms_in_shared_libs = RM_DIAGNOSE;
 
   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)
+  switch (opt_dynamic_list)
     {
     case dynamic_list_unset:
       break;
@@ -1636,9 +1633,36 @@ parse_args (unsigned argc, char **argv)
       /* Fall through.  */
     case dynamic_list:
       link_info.dynamic = TRUE;
+      opt_symbolic = symbolic_unset;
       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;
+         }
+       break;
+      case symbolic_functions:
+       link_info.dynamic = TRUE;
+       link_info.dynamic_data = TRUE;
+       break;
+      }
+
   if (!bfd_link_dll (&link_info))
     {
       if (command_line.filter_shlib)
@@ -1711,7 +1735,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;
@@ -1743,7 +1767,24 @@ elf_shlib_list_options (FILE *file)
   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"));
+  --hash-style=STYLE          Set hash style to sysv/gnu/both.  Default: "));
+  if (DEFAULT_EMIT_SYSV_HASH)
+    {
+      /* Note - these strings are not translated as
+        they are keywords not descriptive text.  */
+      if (DEFAULT_EMIT_GNU_HASH)
+       fprintf (file, "both\n");
+      else
+       fprintf (file, "sysv\n");
+    }
+  else
+    {
+      if (DEFAULT_EMIT_GNU_HASH)
+       fprintf (file, "gnu\n");
+      else
+       /* FIXME: Can this happen ?  */
+       fprintf (file, "none\n");
+    }
   fprintf (file, _("\
   -P AUDITLIB, --depaudit=AUDITLIB\n" "\
                               Specify a library to use for auditing dependencies\n"));
@@ -1788,10 +1829,17 @@ elf_shlib_list_options (FILE *file)
   fprintf (file, _("\
   -z norelro                  Don't create RELRO program header (default)\n"));
 #endif
+#if DEFAULT_LD_Z_SEPARATE_CODE
+  fprintf (file, _("\
+  -z separate-code            Create separate code program header (default)\n"));
+  fprintf (file, _("\
+  -z noseparate-code          Don't create separate code program header\n"));
+#else
   fprintf (file, _("\
   -z separate-code            Create separate code program header\n"));
   fprintf (file, _("\
   -z noseparate-code          Don't create separate code program header (default)\n"));
+#endif
   fprintf (file, _("\
   -z common                   Generate common symbols with STT_COMMON type\n"));
   fprintf (file, _("\
This page took 0.027937 seconds and 4 git commands to generate.