From f5054860dbeeae60eed9aba4190a327cf47f3427 Mon Sep 17 00:00:00 2001 From: nickc Date: Fri, 26 Nov 2004 09:42:02 +0000 Subject: [PATCH] Add support for --subsystem:xbox as well as --subsystem:. --- ld/ChangeLog | 7 ++++ ld/emultempl/pe.em | 101 ++++++++++++++++++++++++++++++++--------------------- ld/ld.texinfo | 5 +-- 3 files changed, 71 insertions(+), 42 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index a0fc07ba35..0a30bb11e8 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,10 @@ +2004-11-26 Melissa Mears + + * 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 * ldexp.c (fold_name): Correct PR 338 fix. diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index 64516587fa..7152055024 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -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; } diff --git a/ld/ld.texinfo b/ld/ld.texinfo index b21313a6b2..3e80ac3636 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -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 -- 2.11.0