Wed Jun 28 17:11:25 1995 Steve Chamberlain <sac@slash.cygnus.com>
authorSteve Chamberlain <sac@cygnus>
Thu, 29 Jun 1995 00:21:00 +0000 (00:21 +0000)
committerSteve Chamberlain <sac@cygnus>
Thu, 29 Jun 1995 00:21:00 +0000 (00:21 +0000)
* 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.

ld/ChangeLog
ld/config/.Sanitize
ld/config/i386pe.mh [new file with mode: 0644]
ld/emultempl/.Sanitize
ld/emultempl/armpe.em [new file with mode: 0644]
ld/emultempl/i386pe.em
ld/ldmain.c
ld/lexsup.c
ld/scripttempl/armpe.sc
ld/scripttempl/i386pe.sc

index c9d9b4a..ae09d76 100644 (file)
@@ -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
index ab50c61..dac6803 100644 (file)
@@ -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 (file)
index 0000000..216d6a0
--- /dev/null
@@ -0,0 +1,5 @@
+CC_FOR_BUILD=gcc
+CC=i386-newlib-pe-gcc -O2 
+
+
+
index e86e204..c4c059f 100644 (file)
@@ -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 (file)
index 0000000..bd9dfaa
--- /dev/null
@@ -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
index a27ed40..9095ca5 100644 (file)
@@ -227,4 +227,5 @@ struct ld_emulation_xfer_struct ld_i386pe_emulation =
   "i386pe",
   "pe-i386"
 };
-EOF
\ No newline at end of file
+EOF
+
index e6bf23d..7c0b705 100644 (file)
@@ -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.  */
index 1102efd..291c432 100644 (file)
@@ -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
+}
index ea4e89c..208ebeb 100644 (file)
@@ -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)
     ;
   }
index d23506d..8923ad7 100644 (file)
@@ -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)
     ;
   }