2009-11-04 Kai Tietz <kai.tietz@onevision.com>
authorKai Tietz <kai.tietz@onevision.com>
Wed, 4 Nov 2009 18:13:05 +0000 (18:13 +0000)
committerKai Tietz <kai.tietz@onevision.com>
Wed, 4 Nov 2009 18:13:05 +0000 (18:13 +0000)
        * 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.

13 files changed:
ld/ChangeLog
ld/emulparams/arm_epoc_pe.sh
ld/emulparams/arm_wince_pe.sh
ld/emulparams/armpe.sh
ld/emulparams/i386pe.sh
ld/emulparams/i386pe_posix.sh
ld/emulparams/i386pep.sh
ld/emulparams/mcorepe.sh
ld/emulparams/mipspe.sh
ld/emulparams/ppcpe.sh
ld/emulparams/shpe.sh
ld/emultempl/pe.em
ld/emultempl/pep.em

index 90fa742..c901357 100644 (file)
@@ -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 ...
index 7cc4b22..51a3f76 100644 (file)
@@ -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
index 2d0019f..133a51c 100644 (file)
@@ -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
index 5db5faf..0c711a5 100644 (file)
@@ -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=\"_\"
 
index ecafd69..38191ec 100644 (file)
@@ -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
index 9348e64..cde0349 100644 (file)
@@ -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=\"_\"
index 7145f35..76a9802 100644 (file)
@@ -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
index 8326c2e..95d84e7 100644 (file)
@@ -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
index a5cfc2e..95c4adb 100644 (file)
@@ -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
index 2e1e102..ed7df88 100644 (file)
@@ -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
index d50861f..89fa461 100644 (file)
@@ -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
index d233bd1..f926502 100644 (file)
@@ -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
 }
 \f
@@ -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 ();
 }
 
index 656ff48..a7ea8e1 100644 (file)
@@ -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
 }
 \f
@@ -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 ();
 }