summaryrefslogtreecommitdiffstats
path: root/ld
diff options
context:
space:
mode:
authorKai Tietz <kai.tietz@onevision.com>2009-11-04 18:13:05 +0000
committerKai Tietz <kai.tietz@onevision.com>2009-11-04 18:13:05 +0000
commitdecfa41eace0c91b6245c236c5286a6bc984d153 (patch)
treec0855844f43072e938fa4451d310796be29a1f58 /ld
parent22b127cceb64a4a8dc7e62591746eb4c178eff9f (diff)
downloadppe42-binutils-decfa41eace0c91b6245c236c5286a6bc984d153.tar.gz
ppe42-binutils-decfa41eace0c91b6245c236c5286a6bc984d153.zip
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.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog24
-rw-r--r--ld/emulparams/arm_epoc_pe.sh1
-rw-r--r--ld/emulparams/arm_wince_pe.sh1
-rw-r--r--ld/emulparams/armpe.sh1
-rw-r--r--ld/emulparams/i386pe.sh1
-rw-r--r--ld/emulparams/i386pe_posix.sh1
-rw-r--r--ld/emulparams/i386pep.sh1
-rw-r--r--ld/emulparams/mcorepe.sh1
-rw-r--r--ld/emulparams/mipspe.sh1
-rw-r--r--ld/emulparams/ppcpe.sh1
-rw-r--r--ld/emulparams/shpe.sh3
-rw-r--r--ld/emultempl/pe.em133
-rw-r--r--ld/emultempl/pep.em120
13 files changed, 177 insertions, 112 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index 90fa7423c2..c901357888 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 7cc4b220fa..51a3f764c7 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 2d0019fc47..133a51c2f9 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 5db5faf346..0c711a5975 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 ecafd698e0..38191ecb24 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 9348e648c7..cde0349765 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 7145f35539..76a980287c 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 8326c2e514..95d84e7f04 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 a5cfc2ef60..95c4adb71a 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 2e1e10207c..ed7df88dcd 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 d50861f55d..89fa461efd 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 d233bd1f9b..f926502bb5 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 656ff48205..a7ea8e110a 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 ();
}
OpenPOWER on IntegriCloud