aboutsummaryrefslogtreecommitdiff
path: root/ld
diff options
context:
space:
mode:
authorSteve Chamberlain <sac@cygnus>1995-06-29 00:21:00 +0000
committerSteve Chamberlain <sac@cygnus>1995-06-29 00:21:00 +0000
commitde71eb7786da1170ae4b4acabeb4c62513c19602 (patch)
treef50c70017dfe024bdec70297d164e8f34c00edcf /ld
parent1a9924d8b3ff8222fd6bb774990455337a70a4af (diff)
downloadgdb-de71eb7786da1170ae4b4acabeb4c62513c19602.zip
gdb-de71eb7786da1170ae4b4acabeb4c62513c19602.tar.gz
gdb-de71eb7786da1170ae4b4acabeb4c62513c19602.tar.bz2
Wed Jun 28 17:11:25 1995 Steve Chamberlain <sac@slash.cygnus.com>
* ldmain.c (main): Always initialize PE info in link_info. * lexsup.c (OPTION_BASE_FILE): New option. (parse_args): Handle new option. * emulparams/armpe.sh: Output pei. * emultempl/i386pe.em: Add newline to end. * scripttempl/armpe.sc: Change output and quote the $s. * scripttempl/i386pe.sc: Change output and quote the $s.
Diffstat (limited to 'ld')
-rw-r--r--ld/ChangeLog21
-rw-r--r--ld/config/.Sanitize1
-rw-r--r--ld/config/i386pe.mh5
-rw-r--r--ld/emultempl/.Sanitize1
-rw-r--r--ld/emultempl/armpe.em230
-rw-r--r--ld/emultempl/i386pe.em3
-rw-r--r--ld/ldmain.c13
-rw-r--r--ld/lexsup.c163
-rw-r--r--ld/scripttempl/armpe.sc50
-rw-r--r--ld/scripttempl/i386pe.sc50
10 files changed, 479 insertions, 58 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog
index c9d9b4a..ae09d76 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,24 @@
+Wed Jun 28 17:11:25 1995 Steve Chamberlain <sac@slash.cygnus.com>
+
+ * ldmain.c (main): Always initialize PE info in link_info.
+ * lexsup.c (OPTION_BASE_FILE): New option.
+ (parse_args): Handle new option.
+ * emulparams/armpe.sh: Output pei.
+ * emultempl/i386pe.em: Add newline to end.
+ * scripttempl/armpe.sc: Change output and quote the $s.
+ * scripttempl/i386pe.sc: Change output and quote the $s.
+
+Thu Jun 22 19:55:41 1995 Ken Raeburn <raeburn@cujo.cygnus.com>
+
+ Sun May 7 11:53:41 MDT 1995 Bryan Ford <baford@cs.utah.edu>
+
+ * configure.in (i386-*-msdos*, i386-*-moss*): New targets.
+ * Makefile.in (ALL_EMULATIONS): Added i386msdos.o.
+ (i386msdos.o): New target.
+ * config/i386-msdos.mt: Created.
+ * emulparams/i386msdos.sh: Created.
+ * scripttempl/i386msdos.sc: Created.
+
Thu Jun 22 15:06:35 1995 Michael Meissner <meissner@tiktok.cygnus.com>
* scripttempl/elfppc.sc (.fixup): Add support for a .fixup section
diff --git a/ld/config/.Sanitize b/ld/config/.Sanitize
index ab50c61..dac6803 100644
--- a/ld/config/.Sanitize
+++ b/ld/config/.Sanitize
@@ -79,6 +79,7 @@ i386-pe.mt
i386bsd.mh
i386linux.mh
i386lynx.mh
+i386pe.mh
i386sco.mh
i386v.mh
i386v.mt
diff --git a/ld/config/i386pe.mh b/ld/config/i386pe.mh
new file mode 100644
index 0000000..216d6a0
--- /dev/null
+++ b/ld/config/i386pe.mh
@@ -0,0 +1,5 @@
+CC_FOR_BUILD=gcc
+CC=i386-newlib-pe-gcc -O2
+
+
+
diff --git a/ld/emultempl/.Sanitize b/ld/emultempl/.Sanitize
index e86e204..c4c059f 100644
--- a/ld/emultempl/.Sanitize
+++ b/ld/emultempl/.Sanitize
@@ -25,6 +25,7 @@ Do-first:
Things-to-keep:
README
+armpe.em
elf32.em
generic.em
gld960.em
diff --git a/ld/emultempl/armpe.em b/ld/emultempl/armpe.em
new file mode 100644
index 0000000..bd9dfaa
--- /dev/null
+++ b/ld/emultempl/armpe.em
@@ -0,0 +1,230 @@
+# This shell script emits a C file. -*- C -*-
+# It does some substitutions.
+cat >e${EMULATION_NAME}.c <<EOF
+/* For WINDOWS_NT */
+/* This file is a copy of ei385coff which was originally generated on a Linux
+ system. It has been modified to provide a decent default script file
+ for the NT PE format. */
+
+/* The original file generated returned different default scripts depending
+ on whether certain switches were set, but these switches pertain to the
+ Linux system and that particular version of coff. In the NT case, we
+ only determine if the subsystem is console or windows in order to select
+ the correct entry point by default. */
+
+
+/* emulate the original gld for the given armpe
+ Copyright (C) 1991, 1993 Free Software Foundation, Inc.
+ Written by Steve Chamberlain steve@cygnus.com
+
+This file is part of GLD, the Gnu Linker.
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#define TARGET_IS_armpe
+
+#include "bfd.h"
+#include "sysdep.h"
+#include "bfdlink.h"
+
+#include "ld.h"
+#include "config.h"
+#include "ldmain.h"
+#include "ldemul.h"
+#include "ldfile.h"
+#include "ldmisc.h"
+
+static void gldarmpe_before_parse PARAMS ((void));
+static char *gldarmpe_get_script PARAMS ((int *isfile));
+
+static void
+gldarmpe_before_parse()
+{
+#ifndef TARGET_ /* I.e., if not generic. */
+ ldfile_output_architecture = bfd_arch_arm;
+#endif /* not TARGET_ */
+}
+
+static char *
+gldarmpe_get_script(isfile)
+ int *isfile;
+{
+ *isfile = 0;
+
+ if (link_info.subsystem == windows)
+ return
+"OUTPUT_FORMAT(\"coff-arm\")\n\
+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/arm-coff/lib);\n\
+ENTRY(_WinMainCRTStartup)\n\
+SECTIONS\n\
+{\n\
+ .text 0x401000 : {\n\
+ *(.text)\n\
+ ;\n\
+ }\n\
+ .bss BLOCK(0x1000) :\n\
+ { \n\
+ *(.bss)\n\
+ *(COMMON)\n\
+ ;\n\
+ }\n\
+ .rdata BLOCK(0x1000) :\n\
+ { \n\
+ *(.rdata)\n\
+ ;\n\
+ }\n\
+ .data BLOCK(0x1000) : {\n\
+ *(.data)\n\
+ *(.data2)\n\
+ ;\n\
+ }\n\
+ .idata BLOCK(0x1000) :\n\
+ { \n\
+ *(.idata\$\2)\n\
+ *(.idata\$\3)\n\
+ *(.idata\$\4)\n\
+ *(.idata\$\5)\n\
+ *(.idata\$\6)\n\
+ *(.idata\$\7)\n\
+ ;\n\
+ }\n\
+ .CRT BLOCK(0x1000) :\n\
+ { \n\
+ *(".CRT\$XCA")\n\
+ *(fucl .CRT\$XCC)\n\
+ *(.CRT\$XCZ)\n\
+ *(.CRT\$XIA)\n\
+ *(.CRT\$XIC)\n\
+ *(.CRT\$XIZ)\n\
+ *(.CRT\$XLA)\n\
+ *(.CRT\$XLZ)\n\
+ *(.CRT\$XPA)\n\
+ *(.CRT\$XPX)\n\
+ *(.CRT\$XPZ)\n\
+ *(.CRT\$XTA)\n\
+ *(.CRT\$XTZ)\n\
+ ;\n\
+ }\n\
+ .rsrc BLOCK(0x1000) :\n\
+ { \n\
+ *(.rsrc\$01)\n\
+ *(.rsrc\$02)\n\
+ ;\n\
+ }\n\
+ .reloc BLOCK(0x1000) :\n\
+ { \n\
+ *(.reloc)\n\
+ ;\n\
+ }\n\
+ .junk BLOCK(0x1000) :\n\
+ { \n\
+ *(.debug\$S)\n\
+ *(.debug\$T)\n\
+ *(.debug\$F)\n\
+ *(.drectve)\n\
+ ;\n\
+ }\n\
+}\n\n"
+ ; else return
+"OUTPUT_FORMAT(\"coff-arm\")\n\
+SEARCH_DIR(/lib); SEARCH_DIR(/usr/lib); SEARCH_DIR(/usr/local/lib); SEARCH_DIR(/usr/local/arm-coff/lib);\n\
+ENTRY(_mainCRTStartup)\n\
+SECTIONS\n\
+{\n\
+ .text 0x401000 : {\n\
+ *(.text)\n\
+ ;\n\
+ }\n\
+ .bss BLOCK(0x1000) :\n\
+ { \n\
+ *(.bss)\n\
+ *(COMMON)\n\
+ ;\n\
+ }\n\
+ .rdata BLOCK(0x1000) :\n\
+ { \n\
+ *(.rdata)\n\
+ ;\n\
+ }\n\
+ .data BLOCK(0x1000) : {\n\
+ *(.data)\n\
+ *(.data2)\n\
+ ;\n\
+ }\n\
+ .idata BLOCK(0x1000) :\n\
+ { \n\
+ *(.idata\$\2)\n\
+ *(.idata\$\3)\n\
+ *(.idata\$\4)\n\
+ *(.idata\$\5)\n\
+ *(.idata\$\6)\n\
+ *(.idata\$\7)\n\
+ ;\n\
+ }\n\
+ .CRT BLOCK(0x1000) :\n\
+ { \n\
+ *(.CRT\$XCA)\n\
+ *(.CRT\$XCC)\n\
+ *(.CRT\$XCZ)\n\
+ *(.CRT\$XIA)\n\
+ *(.CRT\$XIC)\n\
+ *(.CRT\$XIZ)\n\
+ *(.CRT\$XLA)\n\
+ *(.CRT\$XLZ)\n\
+ *(.CRT\$XPA)\n\
+ *(.CRT\$XPX)\n\
+ *(.CRT\$XPZ)\n\
+ *(.CRT\$XTA)\n\
+ *(.CRT\$XTZ)\n\
+ ;\n\
+ }\n\
+ .rsrc BLOCK(0x1000) :\n\
+ { \n\
+ *(.rsrc\$01)\n\
+ *(.rsrc\$02)\n\
+ ;\n\
+ }\n\
+ .reloc BLOCK(0x1000) :\n\
+ { \n\
+ *(.reloc)\n\
+ ;\n\
+ }\n\
+ .junk BLOCK(0x1000) :\n\
+ { \n\
+ *(.debug\$S)\n\
+ *(.debug\$T)\n\
+ *(.debug\$F)\n\
+ *(.drectve)\n\
+ ;\n\
+ }\n\
+}\n\n"
+ ;
+}
+
+struct ld_emulation_xfer_struct ld_armpe_emulation =
+{
+ gldarmpe_before_parse,
+ syslib_default,
+ hll_default,
+ after_parse_default,
+ after_allocation_default,
+ set_output_arch_default,
+ ldemul_default_target,
+ before_allocation_default,
+ gldarmpe_get_script,
+ "armpe",
+ "pei-arm"
+};
+EOF \ No newline at end of file
diff --git a/ld/emultempl/i386pe.em b/ld/emultempl/i386pe.em
index a27ed40..9095ca5 100644
--- a/ld/emultempl/i386pe.em
+++ b/ld/emultempl/i386pe.em
@@ -227,4 +227,5 @@ struct ld_emulation_xfer_struct ld_i386pe_emulation =
"i386pe",
"pe-i386"
};
-EOF \ No newline at end of file
+EOF
+
diff --git a/ld/ldmain.c b/ld/ldmain.c
index e6bf23d..7c0b705 100644
--- a/ld/ldmain.c
+++ b/ld/ldmain.c
@@ -185,6 +185,14 @@ main (argc, argv)
link_info.hash = NULL;
link_info.keep_hash = NULL;
link_info.notice_hash = NULL;
+ link_info.subsystem = console;
+ link_info.stack_heap_parameters.stack_defined = false;
+ link_info.stack_heap_parameters.heap_defined = false;
+ link_info.stack_heap_parameters.stack_reserve = 0;
+ link_info.stack_heap_parameters.stack_commit = 0;
+ link_info.stack_heap_parameters.heap_reserve = 0;
+ link_info.stack_heap_parameters.heap_commit = 0;
+
ldfile_add_arch ("");
@@ -277,6 +285,7 @@ main (argc, argv)
config.map_file = fopen (config.map_filename, FOPEN_WT);
if (config.map_file == (FILE *) NULL)
{
+ bfd_set_error (bfd_error_system_call);
einfo ("%P%F: cannot open map file %s: %E\n",
config.map_filename);
}
@@ -337,13 +346,17 @@ main (argc, argv)
if (config.stats)
{
extern char **environ;
+#ifndef WINDOWS_NT /* no sbrk with NT */
char *lim = (char *) sbrk (0);
+#endif
long run_time = get_run_time () - start_time;
fprintf (stderr, "%s: total time in link: %ld.%06ld\n",
program_name, run_time / 1000000, run_time % 1000000);
+#ifndef WINDOWS_NT
fprintf (stderr, "%s: data size %ld\n", program_name,
(long) (lim - (char *) &environ));
+#endif
}
/* Prevent remove_output from doing anything, after a successful link. */
diff --git a/ld/lexsup.c b/ld/lexsup.c
index 1102efd..291c432 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -46,6 +46,10 @@ unsigned long strtoul ();
static void set_default_dirlist PARAMS ((char *dirlist_ptr));
static void set_section_start PARAMS ((char *sect, char *valstr));
+/* WINDOWS_NT; declare additional functions */
+static void set_subsystem PARAMS ((char *subsystem_type));
+static void set_stack_heap PARAMS ((char *valstr, boolean for_heap));
+
void
parse_args (argc, argv)
int argc;
@@ -59,7 +63,7 @@ parse_args (argc, argv)
as if it were the argument of an option with character code 1. */
const char *shortopts =
- "-A:B::b:cde:F::G:giL:l:Mm:NnO:o:R:rSsT:tu:VvXxY:y:()";
+ "-a:A:B::b:c:de:F::G:giL:l:Mm:NnO:o:R:rSsT:tu:VvXxY:y:()";
/* 150 isn't special; it's just an arbitrary non-ASCII char value. */
@@ -68,7 +72,10 @@ parse_args (argc, argv)
#define OPTION_DYNAMIC_LINKER (OPTION_DEFSYM + 1)
#define OPTION_EB (OPTION_DYNAMIC_LINKER + 1)
#define OPTION_EL (OPTION_EB + 1)
-#define OPTION_HELP (OPTION_EL + 1)
+#define OPTION_HEAP (OPTION_EL + 1)
+#define OPTION_EMBEDDED_RELOCS (OPTION_HEAP + 1)
+#define OPTION_EXPORT_DYNAMIC (OPTION_EMBEDDED_RELOCS + 1)
+#define OPTION_HELP (OPTION_EXPORT_DYNAMIC + 1)
#define OPTION_IGNORE (OPTION_HELP + 1)
#define OPTION_MAP (OPTION_IGNORE + 1)
#define OPTION_NO_KEEP_MEMORY (OPTION_MAP + 1)
@@ -81,16 +88,22 @@ parse_args (argc, argv)
#define OPTION_SHARED (OPTION_RPATH + 1)
#define OPTION_SONAME (OPTION_SHARED + 1)
#define OPTION_SORT_COMMON (OPTION_SONAME + 1)
-#define OPTION_STATS (OPTION_SORT_COMMON + 1)
-#define OPTION_TBSS (OPTION_STATS + 1)
+#define OPTION_STACK (OPTION_SORT_COMMON + 1) /*WINDOWS_NT*/
+#define OPTION_STATS (OPTION_STACK + 1)
+#define OPTION_SUBSYSTEM (OPTION_STATS + 1) /* WINDOWS_NT */
+#define OPTION_TBSS (OPTION_SUBSYSTEM + 1)
#define OPTION_TDATA (OPTION_TBSS + 1)
#define OPTION_TTEXT (OPTION_TDATA + 1)
#define OPTION_TRADITIONAL_FORMAT (OPTION_TTEXT + 1)
#define OPTION_UR (OPTION_TRADITIONAL_FORMAT + 1)
-#define OPTION_VERSION (OPTION_UR + 1)
+#define OPTION_VERBOSE (OPTION_UR + 1)
+#define OPTION_VERSION (OPTION_VERBOSE + 1)
#define OPTION_WARN_COMMON (OPTION_VERSION + 1)
#define OPTION_WARN_ONCE (OPTION_WARN_COMMON + 1)
-
+#define OPTION_SPLIT_BY_RELOC (OPTION_WARN_ONCE + 1)
+#define OPTION_SPLIT_BY_FILE (OPTION_SPLIT_BY_RELOC + 1)
+#define OPTION_WHOLE_ARCHIVE (OPTION_SPLIT_BY_FILE + 1)
+#define OPTION_BASE_FILE (OPTION_WHOLE_ARCHIVE + 1)
static struct option longopts[] = {
{"Bdynamic", no_argument, NULL, OPTION_CALL_SHARED},
{"Bstatic", no_argument, NULL, OPTION_NON_SHARED},
@@ -104,8 +117,11 @@ parse_args (argc, argv)
{"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER},
{"EB", no_argument, NULL, OPTION_EB},
{"EL", no_argument, NULL, OPTION_EL},
+ {"embedded-relocs", no_argument, NULL, OPTION_EMBEDDED_RELOCS},
{"end-group", no_argument, NULL, ')'},
+ {"export-dynamic", no_argument, NULL, OPTION_EXPORT_DYNAMIC},
{"format", required_argument, NULL, 'b'},
+ {"heap", required_argument, NULL, OPTION_HEAP}, /* WINDOWS_NT */
{"help", no_argument, NULL, OPTION_HELP},
{"Map", required_argument, NULL, OPTION_MAP},
{"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY},
@@ -122,17 +138,24 @@ parse_args (argc, argv)
{"soname", required_argument, NULL, OPTION_SONAME},
{"sort-common", no_argument, NULL, OPTION_SORT_COMMON},
{"sort_common", no_argument, NULL, OPTION_SORT_COMMON},
+ {"stack", required_argument, NULL, OPTION_STACK}, /* WINDOWS_NT */
{"start-group", no_argument, NULL, '('},
{"stats", no_argument, NULL, OPTION_STATS},
{"static", no_argument, NULL, OPTION_NON_SHARED},
+ {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM}, /* WINDOWS_NT */
{"Tbss", required_argument, NULL, OPTION_TBSS},
{"Tdata", required_argument, NULL, OPTION_TDATA},
{"Ttext", required_argument, NULL, OPTION_TTEXT},
{"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
{"Ur", no_argument, NULL, OPTION_UR},
+ {"verbose", no_argument, NULL, OPTION_VERBOSE},
{"version", no_argument, NULL, OPTION_VERSION},
{"warn-common", no_argument, NULL, OPTION_WARN_COMMON},
{"warn-once", no_argument, NULL, OPTION_WARN_ONCE},
+ {"split-by-reloc", required_argument, NULL, OPTION_SPLIT_BY_RELOC},
+ {"split-by-file", no_argument, NULL, OPTION_SPLIT_BY_FILE},
+ {"whole-archive", no_argument, NULL, OPTION_WHOLE_ARCHIVE},
+ {"base-file", required_argument, NULL, OPTION_BASE_FILE},
{NULL, no_argument, NULL, 0}
};
@@ -157,6 +180,18 @@ parse_args (argc, argv)
case OPTION_IGNORE:
break;
+ case 'a':
+ /* For HP/UX compatibility. Actually -a shared should mean
+ ``use only shared libraries'' but, then, we don't
+ currently support shared libraries on HP/UX anyhow. */
+ if (strcmp (optarg, "archive") == 0)
+ config.dynamic_link = false;
+ else if (strcmp (optarg, "shared") == 0
+ || strcmp (optarg, "default") == 0)
+ config.dynamic_link = true;
+ else
+ einfo ("%P%F: unrecognized -a option `%s'\n", optarg);
+ break;
case 'A':
ldfile_add_arch (optarg);
break;
@@ -191,6 +226,12 @@ parse_args (argc, argv)
case OPTION_EL:
command_line.endian = ENDIAN_LITTLE;
break;
+ case OPTION_EMBEDDED_RELOCS:
+ command_line.embedded_relocs = true;
+ break;
+ case OPTION_EXPORT_DYNAMIC:
+ command_line.export_dynamic = true;
+ break;
case 'e':
lang_add_entry (optarg, 1);
break;
@@ -208,6 +249,10 @@ parse_args (argc, argv)
case 'g':
/* Ignore. */
break;
+ case OPTION_HEAP: /* WINDOWS_NT */
+ link_info.stack_heap_parameters.heap_defined = true;
+ set_stack_heap (optarg, true);
+ break;
case OPTION_HELP:
help ();
xexit (0);
@@ -320,9 +365,16 @@ parse_args (argc, argv)
case OPTION_SORT_COMMON:
config.sort_common = true;
break;
+ case OPTION_STACK: /* WINDOWS_NT */
+ link_info.stack_heap_parameters.stack_defined = true;
+ set_stack_heap (optarg, false);
+ break;
case OPTION_STATS:
config.stats = true;
break;
+ case OPTION_SUBSYSTEM: /* WINDOWS_NT */
+ set_subsystem (optarg);
+ break;
case 't':
trace_files = true;
break;
@@ -353,7 +405,7 @@ parse_args (argc, argv)
case 'u':
ldlang_add_undef (optarg);
break;
- case 'V':
+ case OPTION_VERBOSE:
ldversion (1);
version_printed = true;
trace_file_tries = true;
@@ -362,6 +414,10 @@ parse_args (argc, argv)
ldversion (0);
version_printed = true;
break;
+ case 'V':
+ ldversion (1);
+ version_printed = true;
+ break;
case OPTION_VERSION:
ldversion (0);
version_printed = true;
@@ -372,6 +428,17 @@ parse_args (argc, argv)
case OPTION_WARN_ONCE:
config.warn_once = true;
break;
+ case OPTION_WHOLE_ARCHIVE:
+ whole_archive = true;
+ break;
+ case OPTION_BASE_FILE:
+ link_info.base_file = fopen (optarg,"w");
+ if (!link_info.base_file) {
+ fprintf (stderr, "%s: Can't open base file %s\n",
+ program_name, optarg);
+ xexit (1);
+ }
+ break;
case 'X':
link_info.discard = discard_l;
break;
@@ -384,6 +451,12 @@ parse_args (argc, argv)
case 'y':
add_ysym (optarg);
break;
+ case OPTION_SPLIT_BY_RELOC:
+ config.split_by_reloc = atoi (optarg);
+ break;
+ case OPTION_SPLIT_BY_FILE:
+ config.split_by_file = true;
+ break;
case '(':
if (ingroup)
{
@@ -446,3 +519,79 @@ set_section_start (sect, valstr)
einfo ("%P%F: invalid hex number `%s'\n", valstr);
lang_section_start (sect, exp_intop (val));
}
+
+/* WINDOWS_NT; added routines to get the subsystem type, heap and/or stack
+ parameters which may be input from the command line */
+static void
+set_subsystem (subsystem_type)
+ char *subsystem_type;
+{
+ if (strcmp (subsystem_type, "native") == 0)
+ {
+ link_info.subsystem = native;
+ }
+ else if (strcmp (subsystem_type, "windows") == 0)
+ {
+ link_info.subsystem = windows;
+ }
+ else if (strcmp (subsystem_type, "console") == 0)
+ {
+ link_info.subsystem = console;
+ }
+ else if (strcmp (subsystem_type, "os2") == 0)
+ {
+ link_info.subsystem = os2;
+ }
+ else if (strcmp (subsystem_type, "posix") == 0)
+ {
+ link_info.subsystem = posix;
+ }
+ else
+ einfo ("%P%F: invalid subsystem type `%s'\n", subsystem_type);
+
+}
+
+static void
+set_stack_heap (valstr, for_heap)
+ char *valstr;
+ boolean for_heap;
+{
+ char *begin_commit, *end;
+ bfd_vma reserve = 0;
+ bfd_vma commit = 0;
+
+ /* There may be two values passed in to the -stack or -heap switches like
+ this:
+ -stack 0x10000,0x100
+ where the first parameter is the stack (or heap) reserve and the second
+ is commit. The second parameter is optional. */
+
+ /* get the reserve value */
+ reserve = strtoul (valstr, &begin_commit, 16);
+
+ if (strcmp (valstr, begin_commit) == 0)
+ /* the reserve value couldn't be read */
+ einfo ("%P%F: invalid hex number for reserve[,commit] '%s'\n", valstr);
+ else if (strcmp (begin_commit, "\0") != 0) /* check for a commit value */
+ {
+ begin_commit += 1; /* increment begin_commit to point past ',' */
+ commit = strtoul (begin_commit, &end, 16);
+ if (strcmp (end, begin_commit) == 0)
+ einfo ("%P%F: invalid hex number for commit '%s'\n", begin_commit);
+ }
+
+ if (for_heap)
+ {
+ link_info.stack_heap_parameters.heap_reserve = reserve;
+ link_info.stack_heap_parameters.heap_commit = commit;
+ }
+ else
+ {
+ link_info.stack_heap_parameters.stack_reserve = reserve;
+ link_info.stack_heap_parameters.stack_commit = commit;
+ }
+
+#if DUMP_INFO
+ printf ("reserve = %8x commit = %8x\n", reserve, commit);
+#endif
+}
diff --git a/ld/scripttempl/armpe.sc b/ld/scripttempl/armpe.sc
index ea4e89c..208ebeb 100644
--- a/ld/scripttempl/armpe.sc
+++ b/ld/scripttempl/armpe.sc
@@ -4,7 +4,7 @@
INIT='.init : { *(.init) }'
FINI='.fini : { *(.fini) }'
cat <<EOF
-OUTPUT_FORMAT("${OUTPUT_FORMAT}")
+OUTPUT_FORMAT($OUTPUT_FORMAT)
${LIB_SEARCH_DIRS}
ENTRY(_mainCRTStartup)
@@ -34,36 +34,36 @@ SECTIONS
}
.idata BLOCK(0x1000) :
{
- *(.idata$2)
- *(.idata$3)
- *(.idata$4)
- *(.idata$5)
- *(.idata$6)
- *(.idata$7)
+ *(.idata\$2)
+ *(.idata\$3)
+ *(.idata\$4)
+ *(.idata\$5)
+ *(.idata\$6)
+ *(.idata\$7)
;
}
.CRT BLOCK(0x1000) :
{
- *(.CRT$XCA)
- *(.CRT$XCC)
- *(.CRT$XCZ)
- *(.CRT$XIA)
- *(.CRT$XIC)
- *(.CRT$XIZ)
- *(.CRT$XLA)
- *(.CRT$XLZ)
- *(.CRT$XPA)
- *(.CRT$XPX)
- *(.CRT$XPZ)
- *(.CRT$XTA)
- *(.CRT$XTZ)
+ *(.CRT\$XCA)
+ *(.CRT\$XCC)
+ *(.CRT\$XCZ)
+ *(.CRT\$XIA)
+ *(.CRT\$XIC)
+ *(.CRT\$XIZ)
+ *(.CRT\$XLA)
+ *(.CRT\$XLZ)
+ *(.CRT\$XPA)
+ *(.CRT\$XPX)
+ *(.CRT\$XPZ)
+ *(.CRT\$XTA)
+ *(.CRT\$XTZ)
;
}
.rsrc BLOCK(0x1000) :
{
- *(.rsrc$01)
- *(.rsrc$02)
+ *(.rsrc\$01)
+ *(.rsrc\$02)
;
}
.reloc BLOCK(0x1000) :
@@ -73,9 +73,9 @@ SECTIONS
}
.junk BLOCK(0x1000) :
{
- *(.debug$S)
- *(.debug$T)
- *(.debug$F)
+ *(.debug\$S)
+ *(.debug\$T)
+ *(.debug\$F)
*(.drectve)
;
}
diff --git a/ld/scripttempl/i386pe.sc b/ld/scripttempl/i386pe.sc
index d23506d..8923ad7 100644
--- a/ld/scripttempl/i386pe.sc
+++ b/ld/scripttempl/i386pe.sc
@@ -4,7 +4,7 @@
INIT='.init : { *(.init) }'
FINI='.fini : { *(.fini) }'
cat <<EOF
-OUTPUT_FORMAT("${OUTPUT_FORMAT}")
+OUTPUT_FORMAT(pei-i386)
${LIB_SEARCH_DIRS}
ENTRY(_mainCRTStartup)
@@ -38,35 +38,35 @@ SECTIONS
}
.idata BLOCK(0x1000) :
{
- *(.idata$2)
- *(.idata$3)
- *(.idata$4)
- *(.idata$5)
- *(.idata$6)
- *(.idata$7)
+ *(.idata\$2)
+ *(.idata\$3)
+ *(.idata\$4)
+ *(.idata\$5)
+ *(.idata\$6)
+ *(.idata\$7)
;
}
.CRT BLOCK(0x1000) :
{
- *(.CRT$XCA)
- *(.CRT$XCC)
- *(.CRT$XCZ)
- *(.CRT$XIA)
- *(.CRT$XIC)
- *(.CRT$XIZ)
- *(.CRT$XLA)
- *(.CRT$XLZ)
- *(.CRT$XPA)
- *(.CRT$XPX)
- *(.CRT$XPZ)
- *(.CRT$XTA)
- *(.CRT$XTZ)
+ *(.CRT\$XCA)
+ *(.CRT\$XCC)
+ *(.CRT\$XCZ)
+ *(.CRT\$XIA)
+ *(.CRT\$XIC)
+ *(.CRT\$XIZ)
+ *(.CRT\$XLA)
+ *(.CRT\$XLZ)
+ *(.CRT\$XPA)
+ *(.CRT\$XPX)
+ *(.CRT\$XPZ)
+ *(.CRT\$XTA)
+ *(.CRT\$XTZ)
;
}
.rsrc BLOCK(0x1000) :
{
- *(.rsrc$01)
- *(.rsrc$02)
+ *(.rsrc\$01)
+ *(.rsrc\$02)
;
}
.reloc BLOCK(0x1000) :
@@ -76,9 +76,9 @@ SECTIONS
}
.junk BLOCK(0x1000) :
{
- *(.debug$S)
- *(.debug$T)
- *(.debug$F)
+ *(.debug\$S)
+ *(.debug\$T)
+ *(.debug\$F)
*(.drectve)
;
}