diff options
-rw-r--r-- | ld/ChangeLog | 24 | ||||
-rw-r--r-- | ld/emulparams/arm_epoc_pe.sh | 1 | ||||
-rw-r--r-- | ld/emulparams/arm_wince_pe.sh | 1 | ||||
-rw-r--r-- | ld/emulparams/armpe.sh | 1 | ||||
-rw-r--r-- | ld/emulparams/i386pe.sh | 1 | ||||
-rw-r--r-- | ld/emulparams/i386pe_posix.sh | 1 | ||||
-rw-r--r-- | ld/emulparams/i386pep.sh | 1 | ||||
-rw-r--r-- | ld/emulparams/mcorepe.sh | 1 | ||||
-rw-r--r-- | ld/emulparams/mipspe.sh | 1 | ||||
-rw-r--r-- | ld/emulparams/ppcpe.sh | 1 | ||||
-rw-r--r-- | ld/emulparams/shpe.sh | 3 | ||||
-rw-r--r-- | ld/emultempl/pe.em | 133 | ||||
-rw-r--r-- | ld/emultempl/pep.em | 120 |
13 files changed, 177 insertions, 112 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 90fa742..c901357 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,27 @@ +2009-11-04 Kai Tietz <kai.tietz@onevision.com> + + * emulparams/arm_epoc_pe.sh: Remove ENTRY. + * emulparams/arm_wince_pe.sh: Likewise. + * emulparams/i386pe.sh: Likewise. + * emulparams/i386pe_posix.sh: Likewise. + * emulparams/mcorepe.sh: Likewise. + * emulparams/mipspe.sh: Likewise. + * emulparams/ppcpe.sh: Likewise. + * emulparams/armpe.sh: Likewise. + * emulparams/i386pep.sh: Likewise. + * emulparams/shpe.sh: Likewise. + Additionally cleaned up double-defined + variables SUBSYSTEM and INITIAL_SYMBOL_CHAR. + * emultempl/pe.em: Remove use of ENTRY. + (pe_subsystem): New local variable. + (gld_XXX_before_parse): Don't set default + entry point here. + (set_entry_point): New function to set entry + point. + (set_pe_subsystem): Remove code for entry point. + (gld_XXX_after_parse): Use set_entry_point here. + * emultempl/pep.em: Likewise. + 2009-10-29 Nathan Sidwell <nathan@codesourcery.com> * emulparams/vxworks.sh (OTHER_READONLY_SECTIONS): Move into ... diff --git a/ld/emulparams/arm_epoc_pe.sh b/ld/emulparams/arm_epoc_pe.sh index 7cc4b22..51a3f76 100644 --- a/ld/emulparams/arm_epoc_pe.sh +++ b/ld/emulparams/arm_epoc_pe.sh @@ -4,7 +4,6 @@ OUTPUT_FORMAT="epoc-pei-arm-little" LITTLE_OUTPUT_FORMAT="epoc-pei-arm-little" BIG_OUTPUT_FORMAT="epoc-pei-arm-big" TEMPLATE_NAME=pe -ENTRY="_mainCRTStartup" SUBSYSTEM=PE_DEF_SUBSYSTEM INITIAL_SYMBOL_CHAR=\"_\" TARGET_PAGE_SIZE=0x1000 diff --git a/ld/emulparams/arm_wince_pe.sh b/ld/emulparams/arm_wince_pe.sh index 2d0019f..133a51c 100644 --- a/ld/emulparams/arm_wince_pe.sh +++ b/ld/emulparams/arm_wince_pe.sh @@ -8,7 +8,6 @@ BIG_OUTPUT_FORMAT="pei-arm-wince-big" RELOCATEABLE_OUTPUT_FORMAT="pe-arm-wince-little" TEMPLATE_NAME=pe -ENTRY="WinMainCRTStartup" SUBSYSTEM=PE_DEF_SUBSYSTEM INITIAL_SYMBOL_CHAR=\"\" TARGET_PAGE_SIZE=0x1000 diff --git a/ld/emulparams/armpe.sh b/ld/emulparams/armpe.sh index 5db5faf..0c711a5 100644 --- a/ld/emulparams/armpe.sh +++ b/ld/emulparams/armpe.sh @@ -8,7 +8,6 @@ BIG_OUTPUT_FORMAT="pei-arm-big" RELOCATEABLE_OUTPUT_FORMAT="pe-arm-little" TEMPLATE_NAME=pe -ENTRY="_mainCRTStartup" SUBSYSTEM=PE_DEF_SUBSYSTEM INITIAL_SYMBOL_CHAR=\"_\" diff --git a/ld/emulparams/i386pe.sh b/ld/emulparams/i386pe.sh index ecafd69..38191ec 100644 --- a/ld/emulparams/i386pe.sh +++ b/ld/emulparams/i386pe.sh @@ -3,7 +3,6 @@ SCRIPT_NAME=pe OUTPUT_FORMAT="pei-i386" RELOCATEABLE_OUTPUT_FORMAT="pe-i386" TEMPLATE_NAME=pe -ENTRY="_mainCRTStartup" SUBSYSTEM=PE_DEF_SUBSYSTEM INITIAL_SYMBOL_CHAR=\"_\" TARGET_PAGE_SIZE=0x1000 diff --git a/ld/emulparams/i386pe_posix.sh b/ld/emulparams/i386pe_posix.sh index 9348e64..cde0349 100644 --- a/ld/emulparams/i386pe_posix.sh +++ b/ld/emulparams/i386pe_posix.sh @@ -3,7 +3,6 @@ SCRIPT_NAME=pe OUTPUT_FORMAT="pei-i386" RELOCATEABLE_OUTPUT_FORMAT="pe-i386" TEMPLATE_NAME=pe -ENTRY="___PosixProcessStartup" SUBSYSTEM=7 EXECUTABLE_NAME=a.out INITIAL_SYMBOL_CHAR=\"_\" diff --git a/ld/emulparams/i386pep.sh b/ld/emulparams/i386pep.sh index 7145f35..76a9802 100644 --- a/ld/emulparams/i386pep.sh +++ b/ld/emulparams/i386pep.sh @@ -3,7 +3,6 @@ SCRIPT_NAME=pep OUTPUT_FORMAT="pei-x86-64" RELOCATEABLE_OUTPUT_FORMAT="pe-x86-64" TEMPLATE_NAME=pep -ENTRY="_mainCRTStartup" SUBSYSTEM=PE_DEF_SUBSYSTEM INITIAL_SYMBOL_CHAR=\"_\" TARGET_PAGE_SIZE=0x1000 diff --git a/ld/emulparams/mcorepe.sh b/ld/emulparams/mcorepe.sh index 8326c2e..95d84e7 100644 --- a/ld/emulparams/mcorepe.sh +++ b/ld/emulparams/mcorepe.sh @@ -4,7 +4,6 @@ OUTPUT_FORMAT="pei-mcore-little" LITTLE_OUTPUT_FORMAT="pei-mcore-little" BIG_OUTPUT_FORMAT="pei-mcore-big" TEMPLATE_NAME=pe -ENTRY="_mainCRTStartup" SUBSYSTEM=PE_DEF_SUBSYSTEM INITIAL_SYMBOL_CHAR=\"_\" TARGET_PAGE_SIZE=0x1000 diff --git a/ld/emulparams/mipspe.sh b/ld/emulparams/mipspe.sh index a5cfc2e..95c4adb 100644 --- a/ld/emulparams/mipspe.sh +++ b/ld/emulparams/mipspe.sh @@ -6,5 +6,4 @@ RELOCATEABLE_OUTPUT_FORMAT="ecoff-littlemips" TEMPLATE_NAME=pe SUBSYSTEM=PE_DEF_SUBSYSTEM INITIAL_SYMBOL_CHAR=\"_\" -ENTRY="_mainCRTStartup" TARGET_PAGE_SIZE=0x1000 diff --git a/ld/emulparams/ppcpe.sh b/ld/emulparams/ppcpe.sh index 2e1e102..ed7df88 100644 --- a/ld/emulparams/ppcpe.sh +++ b/ld/emulparams/ppcpe.sh @@ -2,7 +2,6 @@ ARCH=powerpc SCRIPT_NAME=ppcpe OUTPUT_FORMAT="pei-powerpcle" TEMPLATE_NAME=pe -ENTRY="_mainCRTStartup" SUBSYSTEM=PE_DEF_SUBSYSTEM INITIAL_SYMBOL_CHAR=\"_\" TARGET_PAGE_SIZE=0x1000 diff --git a/ld/emulparams/shpe.sh b/ld/emulparams/shpe.sh index d50861f..89fa461 100644 --- a/ld/emulparams/shpe.sh +++ b/ld/emulparams/shpe.sh @@ -4,7 +4,4 @@ OUTPUT_FORMAT="pei-shl" TEMPLATE_NAME=pe SUBSYSTEM=PE_DEF_SUBSYSTEM INITIAL_SYMBOL_CHAR=\"_\" -ENTRY="_mainCRTStartup" -SUBSYSTEM=PE_DEF_SUBSYSTEM -INITIAL_SYMBOL_CHAR=\"_\" TARGET_PAGE_SIZE=0x1000 diff --git a/ld/emultempl/pe.em b/ld/emultempl/pe.em index d233bd1..f926502 100644 --- a/ld/emultempl/pe.em +++ b/ld/emultempl/pe.em @@ -1,6 +1,5 @@ # This shell script emits a C file. -*- C -*- # It does some substitutions. -test -z "${ENTRY}" && ENTRY="_mainCRTStartup" if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH} else @@ -122,6 +121,7 @@ fragment <<EOF static struct internal_extra_pe_aouthdr pe; static int dll; +static int pe_subsystem = ${SUBSYSTEM}; static flagword real_flags = 0; static int support_old_code = 0; static char * thumb_entry_symbol = NULL; @@ -162,16 +162,6 @@ esac fragment <<EOF link_info.pei386_auto_import = ${default_auto_import}; link_info.pei386_runtime_pseudo_reloc = 1; /* Use by default version 1. */ - -#if (PE_DEF_SUBSYSTEM == 9) || (PE_DEF_SUBSYSTEM == 2) -#if defined TARGET_IS_mipspe || defined TARGET_IS_armpe || defined TARGET_IS_arm_wince_pe - lang_default_entry ("WinMainCRTStartup"); -#else - lang_default_entry ("_WinMainCRTStartup"); -#endif -#else - lang_default_entry ("${ENTRY}"); -#endif #endif } @@ -459,36 +449,95 @@ set_pe_name (char *name, long val) abort (); } +static void +set_entry_point (void) +{ + const char *entry; + const char *initial_symbol_char; + int i; + + static const struct + { + const int value; + const char *entry; + } + v[] = + { + { 1, "NtProcessStartup" }, + { 2, "WinMainCRTStartup" }, + { 3, "mainCRTStartup" }, + { 7, "__PosixProcessStartup"}, + { 9, "WinMainCRTStartup" }, + {14, "mainCRTStartup" }, + { 0, NULL } + }; + + /* Entry point name for arbitrary subsystem numbers. */ + static const char default_entry[] = "mainCRTStartup"; + + if (link_info.shared || dll) + { +#if defined (TARGET_IS_i386pe) + entry = "DllMainCRTStartup@12"; +#else + entry = "DllMainCRTStartup"; +#endif + } + else + { + + for (i = 0; v[i].entry; i++) + if (v[i].value == pe_subsystem) + break; + + /* If no match, use the default. */ + if (v[i].entry != NULL) + entry = v[i].entry; + else + entry = default_entry; + } + + initial_symbol_char = ${INITIAL_SYMBOL_CHAR}; + if (*initial_symbol_char != '\0') + { + char *alc_entry; + + /* lang_default_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; + } + + lang_default_entry (entry); +} 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; const int value; - const char *entry; } v[] = { - { "native", 1, "NtProcessStartup" }, - { "windows", 2, "WinMainCRTStartup" }, - { "console", 3, "mainCRTStartup" }, - { "posix", 7, "__PosixProcessStartup"}, - { "wince", 9, "WinMainCRTStartup" }, - { "xbox", 14, "mainCRTStartup" }, - { NULL, 0, NULL } + { "native", 1}, + { "windows", 2}, + { "console", 3}, + { "posix", 7}, + { "wince", 9}, + { "xbox", 14}, + { NULL, 0 } }; - /* Entry point name for arbitrary subsystem numbers. */ - static const char default_entry[] = "mainCRTStartup"; /* Check for the presence of a version number. */ sver = strchr (optarg, ':'); @@ -498,10 +547,10 @@ set_pe_subsystem (void) { len = sver - optarg; set_pe_name ("__major_subsystem_version__", - strtoul (sver + 1, &end, 0)); + strtoul (sver + 1, &end, 0)); if (*end == '.') set_pe_name ("__minor_subsystem_version__", - strtoul (end + 1, &end, 0)); + strtoul (end + 1, &end, 0)); if (*end != '\0') einfo (_("%P: warning: bad version number in -subsystem option\n")); } @@ -515,14 +564,8 @@ set_pe_subsystem (void) if (v[i].value == (int) temp_subsystem) break; - /* If no match, use the default. */ - if (v[i].name != NULL) - entry = v[i].entry; - else - entry = default_entry; - /* Use this subsystem. */ - subsystem = (int) temp_subsystem; + pe_subsystem = (int) temp_subsystem; } else { @@ -538,28 +581,10 @@ set_pe_subsystem (void) return; } - entry = v[i].entry; - subsystem = v[i].value; + pe_subsystem = v[i].value; } - set_pe_name ("__subsystem__", subsystem); - - initial_symbol_char = ${INITIAL_SYMBOL_CHAR}; - if (*initial_symbol_char != '\0') - { - char *alc_entry; - - /* lang_default_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; - } - - lang_default_entry (entry); + set_pe_name ("__subsystem__", pe_subsystem); return; } @@ -889,6 +914,8 @@ gld_${EMULATION_NAME}_after_parse (void) einfo (_("%P: warning: --export-dynamic is not supported for PE " "targets, did you mean --export-all-symbols?\n")); + set_entry_point (); + after_parse_default (); } diff --git a/ld/emultempl/pep.em b/ld/emultempl/pep.em index 656ff48..a7ea8e1 100644 --- a/ld/emultempl/pep.em +++ b/ld/emultempl/pep.em @@ -1,6 +1,5 @@ # This shell script emits a C file. -*- C -*- # It does some substitutions. -test -z "${ENTRY}" && ENTRY="_mainCRTStartup" if [ -z "$MACHINE" ]; then OUTPUT_ARCH=${ARCH} else @@ -102,6 +101,7 @@ fragment <<EOF static struct internal_extra_pe_aouthdr pep; static int dll; +static int pep_subsystem = ${SUBSYSTEM}; static flagword real_flags = IMAGE_FILE_LARGE_ADDRESS_AWARE; static int support_old_code = 0; static lang_assignment_statement_type *image_base_statement = 0; @@ -127,12 +127,6 @@ gld_${EMULATION_NAME}_before_parse (void) config.has_shared = 1; link_info.pei386_auto_import = -1; link_info.pei386_runtime_pseudo_reloc = 2; /* Use by default version 2. */ - -#if (PE_DEF_SUBSYSTEM == 9) || (PE_DEF_SUBSYSTEM == 2) - lang_default_entry ("_WinMainCRTStartup"); -#else - lang_default_entry ("${ENTRY}"); -#endif #endif } @@ -403,36 +397,90 @@ set_pep_name (char *name, bfd_vma val) abort (); } +static void +set_entry_point (void) +{ + const char *entry; + const char *initial_symbol_char; + int i; + + static const struct + { + const int value; + const char *entry; + } + v[] = + { + { 1, "NtProcessStartup" }, + { 2, "WinMainCRTStartup" }, + { 3, "mainCRTStartup" }, + { 7, "__PosixProcessStartup" }, + { 9, "WinMainCRTStartup" }, + {14, "mainCRTStartup" }, + { 0, NULL } + }; + + /* Entry point name for arbitrary subsystem numbers. */ + static const char default_entry[] = "mainCRTStartup"; + + if (link_info.shared || dll) + { + entry = "DllMainCRTStartup"; + } + else + { + for (i = 0; v[i].entry; i++) + if (v[i].value == pep_subsystem) + break; + + /* If no match, use the default. */ + if (v[i].entry != NULL) + entry = v[i].entry; + else + entry = default_entry; + } + + initial_symbol_char = ${INITIAL_SYMBOL_CHAR}; + if (*initial_symbol_char != '\0') + { + char *alc_entry; + + /* lang_default_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; + } + + lang_default_entry (entry); +} static void set_pep_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; const int value; - const char *entry; } v[] = { - { "native", 1, "NtProcessStartup" }, - { "windows", 2, "WinMainCRTStartup" }, - { "console", 3, "mainCRTStartup" }, - { "posix", 7, "__PosixProcessStartup"}, - { "wince", 9, "_WinMainCRTStartup" }, - { "xbox", 14, "mainCRTStartup" }, - { NULL, 0, NULL } + { "native", 1 }, + { "windows", 2 }, + { "console", 3 }, + { "posix", 7 }, + { "wince", 9 }, + { "xbox", 14 }, + { NULL, 0 } }; - /* Entry point name for arbitrary subsystem numbers. */ - static const char default_entry[] = "mainCRTStartup"; /* Check for the presence of a version number. */ sver = strchr (optarg, ':'); @@ -459,14 +507,8 @@ set_pep_subsystem (void) if (v[i].value == (int) temp_subsystem) break; - /* If no match, use the default. */ - if (v[i].name != NULL) - entry = v[i].entry; - else - entry = default_entry; - /* Use this subsystem. */ - subsystem = (int) temp_subsystem; + pep_subsystem = (int) temp_subsystem; } else { @@ -482,28 +524,10 @@ set_pep_subsystem (void) return; } - entry = v[i].entry; - subsystem = v[i].value; - } - - set_pep_name ("__subsystem__", subsystem); - - initial_symbol_char = ${INITIAL_SYMBOL_CHAR}; - if (*initial_symbol_char != '\0') - { - char *alc_entry; - - /* lang_default_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; + pep_subsystem = v[i].value; } - lang_default_entry (entry); + set_pep_name ("__subsystem__", pep_subsystem); return; } @@ -827,6 +851,8 @@ gld_${EMULATION_NAME}_after_parse (void) einfo (_("%P: warning: --export-dynamic is not supported for PE+ " "targets, did you mean --export-all-symbols?\n")); + set_entry_point (); + after_parse_default (); } |