* elf32-xtensa.c (ebb_propose_action): Fix argument order.
[deliverable/binutils-gdb.git] / ld / lexsup.c
index 9a599a3d5c4920d563589d5fa6aecf52552b3eec..d85d912b2ebd602ca4fbf69c244a11e292b1433d 100644 (file)
@@ -55,6 +55,7 @@
 
 static void set_default_dirlist (char *);
 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.  */
@@ -91,6 +92,7 @@ enum option_values
   OPTION_SHARED,
   OPTION_SONAME,
   OPTION_SORT_COMMON,
+  OPTION_SORT_SECTION,
   OPTION_STATS,
   OPTION_SYMBOLIC,
   OPTION_TASK_LINK,
@@ -133,6 +135,8 @@ enum option_values
   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,
@@ -146,6 +150,7 @@ enum option_values
   OPTION_UNRESOLVED_SYMBOLS,
   OPTION_WARN_UNRESOLVED_SYMBOLS,
   OPTION_ERROR_UNRESOLVED_SYMBOLS,
+  OPTION_WARN_SHARED_TEXTREL,
   OPTION_REDUCE_MEMORY_OVERHEADS
 };
 
@@ -303,6 +308,18 @@ static const struct ld_option ld_options[] =
      OPTION_NO_ACCEPT_UNKNOWN_INPUT_ARCH},
     '\0', NULL, N_("Reject input files whose architecture is unknown"),
     TWO_DASHES },
+  { {"add-needed", no_argument, NULL, OPTION_ADD_NEEDED},
+    '\0', NULL, N_("Set DT_NEEDED tags for DT_NEEDED entries in\n"
+                  "\t\t\t\tfollowing dynamic libs"), TWO_DASHES },
+  { {"no-add-needed", no_argument, NULL, OPTION_NO_ADD_NEEDED},
+    '\0', NULL, N_("Do not set DT_NEEDED tags for DT_NEEDED entries\n"
+                  "\t\t\t\tin following dynamic libs"), TWO_DASHES },
+  { {"as-needed", no_argument, NULL, OPTION_AS_NEEDED},
+    '\0', NULL, N_("Only set DT_NEEDED for following dynamic libs if used"),
+    TWO_DASHES },
+  { {"no-as-needed", no_argument, NULL, OPTION_NO_AS_NEEDED},
+    '\0', NULL, N_("Always set DT_NEEDED for following dynamic libs"),
+    TWO_DASHES },
   { {"assert", required_argument, NULL, OPTION_ASSERT},
     '\0', N_("KEYWORD"), N_("Ignored for SunOS compatibility"), ONE_DASH },
   { {"Bdynamic", no_argument, NULL, OPTION_CALL_SHARED},
@@ -336,6 +353,9 @@ static const struct ld_option ld_options[] =
     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},
+    '\0', NULL, N_("Treat warnings as errors"),
+    TWO_DASHES },
   { {"fini", required_argument, NULL, OPTION_FINI},
     '\0', N_("SYMBOL"), N_("Call SYMBOL at unload-time"), ONE_DASH },
   { {"force-exe-suffix", no_argument, NULL, OPTION_FORCE_EXE_SUFFIX},
@@ -376,6 +396,12 @@ static const struct ld_option ld_options[] =
     '\0', NULL, N_("Allow multiple definitions"), TWO_DASHES },
   { {"no-undefined-version", no_argument, NULL, OPTION_NO_UNDEFINED_VERSION},
     '\0', NULL, N_("Disallow undefined version"), TWO_DASHES },
+  { {"default-symver", no_argument, NULL, OPTION_DEFAULT_SYMVER},
+    '\0', NULL, N_("Create default symbol version"), TWO_DASHES },
+  { {"default-imported-symver", no_argument, NULL,
+      OPTION_DEFAULT_IMPORTED_SYMVER},
+    '\0', NULL, N_("Create default symbol version for imported symbols"),
+    TWO_DASHES },
   { {"no-warn-mismatch", no_argument, NULL, OPTION_NO_WARN_MISMATCH},
     '\0', NULL, N_("Don't warn about mismatched input files"), TWO_DASHES},
   { {"no-whole-archive", no_argument, NULL, OPTION_NO_WHOLE_ARCHIVE},
@@ -419,6 +445,9 @@ static const struct ld_option ld_options[] =
     '\0', NULL, N_("Sort common symbols by size"), 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"), 
+    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"),
     TWO_DASHES },
@@ -472,30 +501,18 @@ static const struct ld_option ld_options[] =
   { {"warn-section-align", no_argument, NULL, OPTION_WARN_SECTION_ALIGN},
     '\0', NULL, N_("Warn if start of section changes due to alignment"),
     TWO_DASHES },
+  { {"warn-shared-textrel", no_argument, NULL, OPTION_WARN_SHARED_TEXTREL},
+    '\0', NULL, N_("Warn if shared object has DT_TEXTREL"),
+    TWO_DASHES },
   { {"warn-unresolved-symbols", no_argument, NULL,
      OPTION_WARN_UNRESOLVED_SYMBOLS},
     '\0', NULL, N_("Report unresolved symbols as warnings"), TWO_DASHES },
   { {"error-unresolved-symbols", no_argument, NULL,
      OPTION_ERROR_UNRESOLVED_SYMBOLS},
     '\0', NULL, N_("Report unresolved symbols as errors"), TWO_DASHES },
-  { {"fatal-warnings", no_argument, NULL, OPTION_WARN_FATAL},
-    '\0', NULL, N_("Treat warnings as errors"),
-    TWO_DASHES },
   { {"whole-archive", no_argument, NULL, OPTION_WHOLE_ARCHIVE},
     '\0', NULL, N_("Include all objects from following archives"),
     TWO_DASHES },
-  { {"add-needed", no_argument, NULL, OPTION_ADD_NEEDED},
-    '\0', NULL, N_("Set DT_NEEDED tags for DT_NEEDED entries in\n"
-                  "\t\t\t\tfollowing dynamic libs"), TWO_DASHES },
-  { {"no-add-needed", no_argument, NULL, OPTION_NO_ADD_NEEDED},
-    '\0', NULL, N_("Do not set DT_NEEDED tags for DT_NEEDED entries\n"
-                  "\t\t\t\tin following dynamic libs"), TWO_DASHES },
-  { {"as-needed", no_argument, NULL, OPTION_AS_NEEDED},
-    '\0', NULL, N_("Only set DT_NEEDED for following dynamic libs if used"),
-    TWO_DASHES },
-  { {"no-as-needed", no_argument, NULL, OPTION_NO_AS_NEEDED},
-    '\0', NULL, N_("Always set DT_NEEDED for following dynamic libs"),
-    TWO_DASHES },
   { {"wrap", required_argument, NULL, OPTION_WRAP},
     '\0', N_("SYMBOL"), N_("Use wrapper functions for SYMBOL"), TWO_DASHES },
 };
@@ -894,6 +911,12 @@ parse_args (unsigned argc, char **argv)
        case OPTION_NO_UNDEFINED_VERSION:
          link_info.allow_undefined_version = FALSE;
          break;
+       case OPTION_DEFAULT_SYMVER:
+         link_info.create_default_symver = TRUE;
+         break;
+       case OPTION_DEFAULT_IMPORTED_SYMVER:
+         link_info.default_imported_symver = TRUE;
+         break;
        case OPTION_NO_WARN_MISMATCH:
          command_line.warn_mismatch = FALSE;
          break;
@@ -1066,6 +1089,15 @@ parse_args (unsigned argc, char **argv)
        case OPTION_SORT_COMMON:
          config.sort_common = TRUE;
          break;
+       case OPTION_SORT_SECTION:
+         if (strcmp (optarg, N_("name")) == 0)
+           sort_section = by_name;
+         else if (strcmp (optarg, N_("alignment")) == 0)
+           sort_section = by_alignment;
+         else
+           einfo (_("%P%F: invalid section sorting option: %s\n"),
+                  optarg);
+         break;
        case OPTION_STATS:
          config.stats = TRUE;
          break;
@@ -1115,13 +1147,13 @@ parse_args (unsigned argc, char **argv)
          ldemul_list_emulation_options (stdout);
          exit (0);
        case OPTION_TBSS:
-         set_section_start (".bss", optarg);
+         set_segment_start (".bss", optarg);
          break;
        case OPTION_TDATA:
-         set_section_start (".data", optarg);
+         set_segment_start (".data", optarg);
          break;
        case OPTION_TTEXT:
-         set_section_start (".text", optarg);
+         set_segment_start (".text", optarg);
          break;
        case OPTION_TRADITIONAL_FORMAT:
          link_info.traditional_format = TRUE;
@@ -1201,6 +1233,9 @@ parse_args (unsigned argc, char **argv)
        case OPTION_WARN_SECTION_ALIGN:
          config.warn_section_align = TRUE;
          break;
+       case OPTION_WARN_SHARED_TEXTREL:
+         link_info.warn_shared_textrel = TRUE;
+         break;
        case OPTION_WHOLE_ARCHIVE:
          whole_archive = TRUE;
          break;
@@ -1354,8 +1389,44 @@ set_section_start (char *sect, char *valstr)
   bfd_vma val = bfd_scan_vma (valstr, &end, 16);
   if (*end)
     einfo (_("%P%F: invalid hex number `%s'\n"), valstr);
-  lang_section_start (sect, exp_intop (val));
+  lang_section_start (sect, exp_intop (val), NULL);
 }
+
+static void
+set_segment_start (const char *section, char *valstr)
+{
+  const char *name;
+  const char *end;
+  segment_type *seg;
+
+  bfd_vma val = bfd_scan_vma (valstr, &end, 16);
+  if (*end)
+    einfo (_("%P%F: invalid hex number `%s'\n"), valstr);
+  /* If we already have an entry for this segment, update the existing
+     value.  */
+  name = section + 1;
+  for (seg = segments; seg; seg = seg->next)
+    if (strcmp (seg->name, name) == 0)
+      {
+       seg->value = val;
+       return;
+      }
+  /* There was no existing value so we must create a new segment
+     entry.  */
+  seg = stat_alloc (sizeof (*seg));
+  seg->name = name;
+  seg->value = val;
+  seg->used = FALSE;
+  /* Add it to the linked list of segments.  */
+  seg->next = segments;
+  segments = seg;
+  /* Historically, -Ttext and friends set the base address of a
+     particular section.  For backwards compatibility, we still do
+     that.  If a SEGMENT_START directive is seen, the section address
+     assignment will be disabled.  */
+  lang_section_start (section, exp_intop (val), seg);
+}
+
 \f
 /* Print help messages for the options.  */
 
This page took 0.025342 seconds and 4 git commands to generate.