Add support for --subsystem:xbox as well as --subsystem:<number>.
authorNick Clifton <nickc@redhat.com>
Fri, 26 Nov 2004 09:42:04 +0000 (09:42 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 26 Nov 2004 09:42:04 +0000 (09:42 +0000)
ld/ChangeLog
ld/emultempl/pe.em
ld/ld.texinfo

index a0fc07ba35d102618c0a6023662ccea05575b61d..0a30bb11e82aba5d6d853941b09410d2ddb47dc5 100644 (file)
@@ -1,3 +1,10 @@
+2004-11-26  Melissa Mears  <asterisk@graces.dricas.com>
+
+       * emultempl/pe.em: Add --subsystem:xbox as well as
+       --subsystem:%d.
+       * ld.texinfo: (ld_options): Document acceptance of subsystem xbox
+       and numeric subsystems.
+
 2004-11-24  Alan Modra  <amodra@bigpond.net.au>
 
        * ldexp.c (fold_name): Correct PR 338 fix.
index 64516587fac74a9be8b1854ef73169d5a0ce2d1d..7152055024e14fea8be4b122e4d92c648a829286 100644 (file)
@@ -372,8 +372,13 @@ static void
 set_pe_subsystem (void)
 {
   const char *sver;
+  const char *entry;
+  const char *initial_symbol_char;
+  char *end;
   int len;
   int i;
+  int subsystem;
+  unsigned long temp_subsystem;
   static const struct
     {
       const char *name;
@@ -382,29 +387,23 @@ set_pe_subsystem (void)
     }
   v[] =
     {
-      { "native", 1, "NtProcessStartup" },
-#if defined TARGET_IS_mipspe || defined TARGET_IS_armpe
-      { "windows", 2, "WinMainCRTStartup" },
-#else
+      { "native",  1, "NtProcessStartup" },
       { "windows", 2, "WinMainCRTStartup" },
-#endif
       { "console", 3, "mainCRTStartup" },
-#if 0
-      /* The Microsoft linker does not recognize this.  */
-      { "os2", 5, "" },
-#endif
-      { "posix", 7, "__PosixProcessStartup"},
-      { "wince", 9, "_WinMainCRTStartup" },
-      { 0, 0, 0 }
+      { "posix",   7, "__PosixProcessStartup"},
+      { "wince",   9, "_WinMainCRTStartup" },
+      { "xbox",   14, "mainCRTStartup" },
+      { NULL, 0, NULL }
     };
+  /* Entry point name for arbitrary subsystem numbers.  */
+  static const char default_entry[] = "mainCRTStartup";
 
+  /* Check for the presence of a version number.  */
   sver = strchr (optarg, ':');
   if (sver == NULL)
     len = strlen (optarg);
   else
     {
-      char *end;
-
       len = sver - optarg;
       set_pe_name ("__major_subsystem_version__",
                   strtoul (sver + 1, &end, 0));
@@ -415,40 +414,62 @@ set_pe_subsystem (void)
        einfo (_("%P: warning: bad version number in -subsystem option\n"));
     }
 
-  for (i = 0; v[i].name; i++)
+  /* Check for numeric subsystem.  */
+  temp_subsystem = strtoul (optarg, & end, 0);
+  if ((*end == ':' || *end == '\0') && (temp_subsystem < 65536))
     {
-      if (strncmp (optarg, v[i].name, len) == 0
-         && v[i].name[len] == '\0')
-       {
-         const char *initial_symbol_char;
-         const char *entry;
-
-         set_pe_name ("__subsystem__", v[i].value);
+      /* Search list for a numeric match to use its entry point.  */
+      for (i = 0; v[i].name; i++)
+       if (v[i].value == (int) temp_subsystem)
+         break;
 
-         initial_symbol_char = ${INITIAL_SYMBOL_CHAR};
-         if (*initial_symbol_char == '\0')
-           entry = v[i].entry;
-         else
-           {
-             char *alc_entry;
-
-             /* lang_add_entry expects its argument to be permanently
-                allocated, so we don't free this string.  */
-             alc_entry = xmalloc (strlen (initial_symbol_char)
-                                  + strlen (v[i].entry)
-                                  + 1);
-             strcpy (alc_entry, initial_symbol_char);
-             strcat (alc_entry, v[i].entry);
-             entry = alc_entry;
-           }
+      /* If no match, use the default.  */
+      if (v[i].name != NULL)
+       entry = v[i].entry;
+      else
+       entry = default_entry;
 
-         lang_add_entry (entry, TRUE);
+      /* Use this subsystem.  */
+      subsystem = (int) temp_subsystem;
+    }
+  else
+    {
+      /* Search for subsystem by name.  */
+      for (i = 0; v[i].name; i++)
+       if (strncmp (optarg, v[i].name, len) == 0
+           && v[i].name[len] == '\0')
+         break;
 
+      if (v[i].name == NULL)
+       {
+         einfo (_("%P%F: invalid subsystem type %s\n"), optarg);
          return;
        }
+
+      entry = v[i].entry;
+      subsystem = v[i].value;
+    }
+
+  set_pe_name ("__subsystem__", subsystem);
+
+  initial_symbol_char = ${INITIAL_SYMBOL_CHAR};
+  if (*initial_symbol_char != '\0')
+    {
+      char *alc_entry;
+
+      /* lang_add_entry expects its argument to be permanently
+        allocated, so we don't free this string.  */
+      alc_entry = xmalloc (strlen (initial_symbol_char)
+                          + strlen (entry)
+                          + 1);
+      strcpy (alc_entry, initial_symbol_char);
+      strcat (alc_entry, entry);
+      entry = alc_entry;
     }
 
-  einfo (_("%P%F: invalid subsystem type %s\n"), optarg);
+  lang_add_entry (entry, TRUE);
+
+  return;
 }
 
 
index b21313a6b2b7ee812a379ff7948673bebfd1e05c..3e80ac3636f0966243d8e9dd798512a9239a4a8f 100644 (file)
@@ -2197,8 +2197,9 @@ committed.
 @itemx --subsystem @var{which}:@var{major}.@var{minor}
 Specifies the subsystem under which your program will execute.  The
 legal values for @var{which} are @code{native}, @code{windows},
-@code{console}, and @code{posix}.  You may optionally set the
-subsystem version also.
+@code{console}, @code{posix}, and @code{xbox}.  You may optionally set
+the subsystem version also.  Numeric values are also accepted for
+@var{which}.
 [This option is specific to the i386 PE targeted port of the linker]
 
 @end table