* ld-srec/srec.exp (run_srec_test): Deal with ProPolice on
[deliverable/binutils-gdb.git] / ld / lexsup.c
index 55ab5ee0da0249320c04352ce3c64b2555760772..cf5f07ba4b8e7238ee2eaea5768b5b5ed261e84d 100644 (file)
@@ -1,6 +1,6 @@
 /* Parse options for the GNU linker.
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2001, 2002, 2003, 2004
+   2001, 2002, 2003, 2004, 2005
    Free Software Foundation, Inc.
 
    This file is part of GLD, the Gnu Linker.
@@ -20,6 +20,7 @@
    Software Foundation, 59 Temple Place - Suite 330, Boston, MA
    02111-1307, USA.  */
 
+#include "config.h"
 #include "bfd.h"
 #include "sysdep.h"
 #include "libiberty.h"
@@ -55,6 +56,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.  */
@@ -70,6 +72,7 @@ enum option_values
   OPTION_DEFSYM,
   OPTION_DEMANGLE,
   OPTION_DYNAMIC_LINKER,
+  OPTION_SYSROOT,
   OPTION_EB,
   OPTION_EL,
   OPTION_EMBEDDED_RELOCS,
@@ -91,6 +94,7 @@ enum option_values
   OPTION_SHARED,
   OPTION_SONAME,
   OPTION_SORT_COMMON,
+  OPTION_SORT_SECTION,
   OPTION_STATS,
   OPTION_SYMBOLIC,
   OPTION_TASK_LINK,
@@ -112,6 +116,8 @@ enum option_values
   OPTION_SPLIT_BY_RELOC,
   OPTION_SPLIT_BY_FILE ,
   OPTION_WHOLE_ARCHIVE,
+  OPTION_ADD_NEEDED,
+  OPTION_NO_ADD_NEEDED,
   OPTION_AS_NEEDED,
   OPTION_NO_AS_NEEDED,
   OPTION_WRAP,
@@ -131,6 +137,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,
@@ -144,6 +152,7 @@ enum option_values
   OPTION_UNRESOLVED_SYMBOLS,
   OPTION_WARN_UNRESOLVED_SYMBOLS,
   OPTION_ERROR_UNRESOLVED_SYMBOLS,
+  OPTION_WARN_SHARED_TEXTREL,
   OPTION_REDUCE_MEMORY_OVERHEADS
 };
 
@@ -226,6 +235,8 @@ static const struct ld_option ld_options[] =
   { {"library-path", required_argument, NULL, 'L'},
     'L', N_("DIRECTORY"), N_("Add DIRECTORY to library search path"),
     TWO_DASHES },
+  { {"sysroot=<DIRECTORY>", required_argument, NULL, OPTION_SYSROOT},
+    '\0', NULL, N_("Override the default sysroot location"), TWO_DASHES },
   { {NULL, required_argument, NULL, '\0'},
     'm', N_("EMULATION"), N_("Set emulation"), ONE_DASH },
   { {"print-map", no_argument, NULL, 'M'},
@@ -301,6 +312,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},
@@ -334,6 +357,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},
@@ -374,6 +400,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},
@@ -417,6 +449,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 },
@@ -470,24 +505,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 },
-  { {"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 },
 };
@@ -722,6 +751,9 @@ parse_args (unsigned argc, char **argv)
        case OPTION_DYNAMIC_LINKER:
          command_line.interpreter = optarg;
          break;
+       case OPTION_SYSROOT:
+         /* Already handled in ldmain.c.  */
+         break;
        case OPTION_EB:
          command_line.endian = ENDIAN_BIG;
          break;
@@ -778,7 +810,7 @@ parse_args (unsigned argc, char **argv)
          /* Ignore.  */
          break;
        case OPTION_GC_SECTIONS:
-         command_line.gc_sections = TRUE;
+         link_info.gc_sections = TRUE;
          break;
        case OPTION_HELP:
          help ();
@@ -821,7 +853,7 @@ parse_args (unsigned argc, char **argv)
          demangling = FALSE;
          break;
        case OPTION_NO_GC_SECTIONS:
-         command_line.gc_sections = FALSE;
+         link_info.gc_sections = FALSE;
          break;
        case OPTION_NO_KEEP_MEMORY:
          link_info.keep_memory = FALSE;
@@ -886,6 +918,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;
@@ -1058,6 +1096,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;
@@ -1107,13 +1154,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;
@@ -1193,9 +1240,18 @@ 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;
+       case OPTION_ADD_NEEDED:
+         add_needed = TRUE;
+         break;
+       case OPTION_NO_ADD_NEEDED:
+         add_needed = FALSE;
+         break;
        case OPTION_AS_NEEDED:
          as_needed = TRUE;
          break;
@@ -1340,8 +1396,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.027107 seconds and 4 git commands to generate.