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.
This commit is contained in:
Steve Chamberlain 1995-06-29 00:21:00 +00:00
parent 1a9924d8b3
commit de71eb7786
10 changed files with 479 additions and 58 deletions

View 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> Thu Jun 22 15:06:35 1995 Michael Meissner <meissner@tiktok.cygnus.com>
* scripttempl/elfppc.sc (.fixup): Add support for a .fixup section * scripttempl/elfppc.sc (.fixup): Add support for a .fixup section

View file

@ -79,6 +79,7 @@ i386-pe.mt
i386bsd.mh i386bsd.mh
i386linux.mh i386linux.mh
i386lynx.mh i386lynx.mh
i386pe.mh
i386sco.mh i386sco.mh
i386v.mh i386v.mh
i386v.mt i386v.mt

5
ld/config/i386pe.mh Normal file
View file

@ -0,0 +1,5 @@
CC_FOR_BUILD=gcc
CC=i386-newlib-pe-gcc -O2

View file

@ -25,6 +25,7 @@ Do-first:
Things-to-keep: Things-to-keep:
README README
armpe.em
elf32.em elf32.em
generic.em generic.em
gld960.em gld960.em

230
ld/emultempl/armpe.em Normal file
View file

@ -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

View file

@ -227,4 +227,5 @@ struct ld_emulation_xfer_struct ld_i386pe_emulation =
"i386pe", "i386pe",
"pe-i386" "pe-i386"
}; };
EOF EOF

View file

@ -185,6 +185,14 @@ main (argc, argv)
link_info.hash = NULL; link_info.hash = NULL;
link_info.keep_hash = NULL; link_info.keep_hash = NULL;
link_info.notice_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 (""); ldfile_add_arch ("");
@ -277,6 +285,7 @@ main (argc, argv)
config.map_file = fopen (config.map_filename, FOPEN_WT); config.map_file = fopen (config.map_filename, FOPEN_WT);
if (config.map_file == (FILE *) NULL) if (config.map_file == (FILE *) NULL)
{ {
bfd_set_error (bfd_error_system_call);
einfo ("%P%F: cannot open map file %s: %E\n", einfo ("%P%F: cannot open map file %s: %E\n",
config.map_filename); config.map_filename);
} }
@ -337,13 +346,17 @@ main (argc, argv)
if (config.stats) if (config.stats)
{ {
extern char **environ; extern char **environ;
#ifndef WINDOWS_NT /* no sbrk with NT */
char *lim = (char *) sbrk (0); char *lim = (char *) sbrk (0);
#endif
long run_time = get_run_time () - start_time; long run_time = get_run_time () - start_time;
fprintf (stderr, "%s: total time in link: %ld.%06ld\n", fprintf (stderr, "%s: total time in link: %ld.%06ld\n",
program_name, run_time / 1000000, run_time % 1000000); program_name, run_time / 1000000, run_time % 1000000);
#ifndef WINDOWS_NT
fprintf (stderr, "%s: data size %ld\n", program_name, fprintf (stderr, "%s: data size %ld\n", program_name,
(long) (lim - (char *) &environ)); (long) (lim - (char *) &environ));
#endif
} }
/* Prevent remove_output from doing anything, after a successful link. */ /* Prevent remove_output from doing anything, after a successful link. */

View file

@ -46,6 +46,10 @@ unsigned long strtoul ();
static void set_default_dirlist PARAMS ((char *dirlist_ptr)); static void set_default_dirlist PARAMS ((char *dirlist_ptr));
static void set_section_start PARAMS ((char *sect, char *valstr)); 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 void
parse_args (argc, argv) parse_args (argc, argv)
int argc; int argc;
@ -59,7 +63,7 @@ parse_args (argc, argv)
as if it were the argument of an option with character code 1. */ as if it were the argument of an option with character code 1. */
const char *shortopts = 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. */ /* 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_DYNAMIC_LINKER (OPTION_DEFSYM + 1)
#define OPTION_EB (OPTION_DYNAMIC_LINKER + 1) #define OPTION_EB (OPTION_DYNAMIC_LINKER + 1)
#define OPTION_EL (OPTION_EB + 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_IGNORE (OPTION_HELP + 1)
#define OPTION_MAP (OPTION_IGNORE + 1) #define OPTION_MAP (OPTION_IGNORE + 1)
#define OPTION_NO_KEEP_MEMORY (OPTION_MAP + 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_SHARED (OPTION_RPATH + 1)
#define OPTION_SONAME (OPTION_SHARED + 1) #define OPTION_SONAME (OPTION_SHARED + 1)
#define OPTION_SORT_COMMON (OPTION_SONAME + 1) #define OPTION_SORT_COMMON (OPTION_SONAME + 1)
#define OPTION_STATS (OPTION_SORT_COMMON + 1) #define OPTION_STACK (OPTION_SORT_COMMON + 1) /*WINDOWS_NT*/
#define OPTION_TBSS (OPTION_STATS + 1) #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_TDATA (OPTION_TBSS + 1)
#define OPTION_TTEXT (OPTION_TDATA + 1) #define OPTION_TTEXT (OPTION_TDATA + 1)
#define OPTION_TRADITIONAL_FORMAT (OPTION_TTEXT + 1) #define OPTION_TRADITIONAL_FORMAT (OPTION_TTEXT + 1)
#define OPTION_UR (OPTION_TRADITIONAL_FORMAT + 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_COMMON (OPTION_VERSION + 1)
#define OPTION_WARN_ONCE (OPTION_WARN_COMMON + 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[] = { static struct option longopts[] = {
{"Bdynamic", no_argument, NULL, OPTION_CALL_SHARED}, {"Bdynamic", no_argument, NULL, OPTION_CALL_SHARED},
{"Bstatic", no_argument, NULL, OPTION_NON_SHARED}, {"Bstatic", no_argument, NULL, OPTION_NON_SHARED},
@ -104,8 +117,11 @@ parse_args (argc, argv)
{"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER}, {"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER},
{"EB", no_argument, NULL, OPTION_EB}, {"EB", no_argument, NULL, OPTION_EB},
{"EL", no_argument, NULL, OPTION_EL}, {"EL", no_argument, NULL, OPTION_EL},
{"embedded-relocs", no_argument, NULL, OPTION_EMBEDDED_RELOCS},
{"end-group", no_argument, NULL, ')'}, {"end-group", no_argument, NULL, ')'},
{"export-dynamic", no_argument, NULL, OPTION_EXPORT_DYNAMIC},
{"format", required_argument, NULL, 'b'}, {"format", required_argument, NULL, 'b'},
{"heap", required_argument, NULL, OPTION_HEAP}, /* WINDOWS_NT */
{"help", no_argument, NULL, OPTION_HELP}, {"help", no_argument, NULL, OPTION_HELP},
{"Map", required_argument, NULL, OPTION_MAP}, {"Map", required_argument, NULL, OPTION_MAP},
{"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY}, {"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY},
@ -122,17 +138,24 @@ parse_args (argc, argv)
{"soname", required_argument, NULL, OPTION_SONAME}, {"soname", required_argument, NULL, OPTION_SONAME},
{"sort-common", no_argument, NULL, OPTION_SORT_COMMON}, {"sort-common", no_argument, NULL, OPTION_SORT_COMMON},
{"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, '('}, {"start-group", no_argument, NULL, '('},
{"stats", no_argument, NULL, OPTION_STATS}, {"stats", no_argument, NULL, OPTION_STATS},
{"static", no_argument, NULL, OPTION_NON_SHARED}, {"static", no_argument, NULL, OPTION_NON_SHARED},
{"subsystem", required_argument, NULL, OPTION_SUBSYSTEM}, /* WINDOWS_NT */
{"Tbss", required_argument, NULL, OPTION_TBSS}, {"Tbss", required_argument, NULL, OPTION_TBSS},
{"Tdata", required_argument, NULL, OPTION_TDATA}, {"Tdata", required_argument, NULL, OPTION_TDATA},
{"Ttext", required_argument, NULL, OPTION_TTEXT}, {"Ttext", required_argument, NULL, OPTION_TTEXT},
{"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT}, {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
{"Ur", no_argument, NULL, OPTION_UR}, {"Ur", no_argument, NULL, OPTION_UR},
{"verbose", no_argument, NULL, OPTION_VERBOSE},
{"version", no_argument, NULL, OPTION_VERSION}, {"version", no_argument, NULL, OPTION_VERSION},
{"warn-common", no_argument, NULL, OPTION_WARN_COMMON}, {"warn-common", no_argument, NULL, OPTION_WARN_COMMON},
{"warn-once", no_argument, NULL, OPTION_WARN_ONCE}, {"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} {NULL, no_argument, NULL, 0}
}; };
@ -157,6 +180,18 @@ parse_args (argc, argv)
case OPTION_IGNORE: case OPTION_IGNORE:
break; 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': case 'A':
ldfile_add_arch (optarg); ldfile_add_arch (optarg);
break; break;
@ -191,6 +226,12 @@ parse_args (argc, argv)
case OPTION_EL: case OPTION_EL:
command_line.endian = ENDIAN_LITTLE; command_line.endian = ENDIAN_LITTLE;
break; break;
case OPTION_EMBEDDED_RELOCS:
command_line.embedded_relocs = true;
break;
case OPTION_EXPORT_DYNAMIC:
command_line.export_dynamic = true;
break;
case 'e': case 'e':
lang_add_entry (optarg, 1); lang_add_entry (optarg, 1);
break; break;
@ -208,6 +249,10 @@ parse_args (argc, argv)
case 'g': case 'g':
/* Ignore. */ /* Ignore. */
break; break;
case OPTION_HEAP: /* WINDOWS_NT */
link_info.stack_heap_parameters.heap_defined = true;
set_stack_heap (optarg, true);
break;
case OPTION_HELP: case OPTION_HELP:
help (); help ();
xexit (0); xexit (0);
@ -320,9 +365,16 @@ parse_args (argc, argv)
case OPTION_SORT_COMMON: case OPTION_SORT_COMMON:
config.sort_common = true; config.sort_common = true;
break; break;
case OPTION_STACK: /* WINDOWS_NT */
link_info.stack_heap_parameters.stack_defined = true;
set_stack_heap (optarg, false);
break;
case OPTION_STATS: case OPTION_STATS:
config.stats = true; config.stats = true;
break; break;
case OPTION_SUBSYSTEM: /* WINDOWS_NT */
set_subsystem (optarg);
break;
case 't': case 't':
trace_files = true; trace_files = true;
break; break;
@ -353,7 +405,7 @@ parse_args (argc, argv)
case 'u': case 'u':
ldlang_add_undef (optarg); ldlang_add_undef (optarg);
break; break;
case 'V': case OPTION_VERBOSE:
ldversion (1); ldversion (1);
version_printed = true; version_printed = true;
trace_file_tries = true; trace_file_tries = true;
@ -362,6 +414,10 @@ parse_args (argc, argv)
ldversion (0); ldversion (0);
version_printed = true; version_printed = true;
break; break;
case 'V':
ldversion (1);
version_printed = true;
break;
case OPTION_VERSION: case OPTION_VERSION:
ldversion (0); ldversion (0);
version_printed = true; version_printed = true;
@ -372,6 +428,17 @@ parse_args (argc, argv)
case OPTION_WARN_ONCE: case OPTION_WARN_ONCE:
config.warn_once = true; config.warn_once = true;
break; 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': case 'X':
link_info.discard = discard_l; link_info.discard = discard_l;
break; break;
@ -384,6 +451,12 @@ parse_args (argc, argv)
case 'y': case 'y':
add_ysym (optarg); add_ysym (optarg);
break; 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 '(': case '(':
if (ingroup) if (ingroup)
{ {
@ -446,3 +519,79 @@ set_section_start (sect, valstr)
einfo ("%P%F: invalid hex number `%s'\n", valstr); einfo ("%P%F: invalid hex number `%s'\n", valstr);
lang_section_start (sect, exp_intop (val)); 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
}

View file

@ -4,7 +4,7 @@
INIT='.init : { *(.init) }' INIT='.init : { *(.init) }'
FINI='.fini : { *(.fini) }' FINI='.fini : { *(.fini) }'
cat <<EOF cat <<EOF
OUTPUT_FORMAT("${OUTPUT_FORMAT}") OUTPUT_FORMAT($OUTPUT_FORMAT)
${LIB_SEARCH_DIRS} ${LIB_SEARCH_DIRS}
ENTRY(_mainCRTStartup) ENTRY(_mainCRTStartup)
@ -34,36 +34,36 @@ SECTIONS
} }
.idata BLOCK(0x1000) : .idata BLOCK(0x1000) :
{ {
*(.idata$2) *(.idata\$2)
*(.idata$3) *(.idata\$3)
*(.idata$4) *(.idata\$4)
*(.idata$5) *(.idata\$5)
*(.idata$6) *(.idata\$6)
*(.idata$7) *(.idata\$7)
; ;
} }
.CRT BLOCK(0x1000) : .CRT BLOCK(0x1000) :
{ {
*(.CRT$XCA) *(.CRT\$XCA)
*(.CRT$XCC) *(.CRT\$XCC)
*(.CRT$XCZ) *(.CRT\$XCZ)
*(.CRT$XIA) *(.CRT\$XIA)
*(.CRT$XIC) *(.CRT\$XIC)
*(.CRT$XIZ) *(.CRT\$XIZ)
*(.CRT$XLA) *(.CRT\$XLA)
*(.CRT$XLZ) *(.CRT\$XLZ)
*(.CRT$XPA) *(.CRT\$XPA)
*(.CRT$XPX) *(.CRT\$XPX)
*(.CRT$XPZ) *(.CRT\$XPZ)
*(.CRT$XTA) *(.CRT\$XTA)
*(.CRT$XTZ) *(.CRT\$XTZ)
; ;
} }
.rsrc BLOCK(0x1000) : .rsrc BLOCK(0x1000) :
{ {
*(.rsrc$01) *(.rsrc\$01)
*(.rsrc$02) *(.rsrc\$02)
; ;
} }
.reloc BLOCK(0x1000) : .reloc BLOCK(0x1000) :
@ -73,9 +73,9 @@ SECTIONS
} }
.junk BLOCK(0x1000) : .junk BLOCK(0x1000) :
{ {
*(.debug$S) *(.debug\$S)
*(.debug$T) *(.debug\$T)
*(.debug$F) *(.debug\$F)
*(.drectve) *(.drectve)
; ;
} }

View file

@ -4,7 +4,7 @@
INIT='.init : { *(.init) }' INIT='.init : { *(.init) }'
FINI='.fini : { *(.fini) }' FINI='.fini : { *(.fini) }'
cat <<EOF cat <<EOF
OUTPUT_FORMAT("${OUTPUT_FORMAT}") OUTPUT_FORMAT(pei-i386)
${LIB_SEARCH_DIRS} ${LIB_SEARCH_DIRS}
ENTRY(_mainCRTStartup) ENTRY(_mainCRTStartup)
@ -38,35 +38,35 @@ SECTIONS
} }
.idata BLOCK(0x1000) : .idata BLOCK(0x1000) :
{ {
*(.idata$2) *(.idata\$2)
*(.idata$3) *(.idata\$3)
*(.idata$4) *(.idata\$4)
*(.idata$5) *(.idata\$5)
*(.idata$6) *(.idata\$6)
*(.idata$7) *(.idata\$7)
; ;
} }
.CRT BLOCK(0x1000) : .CRT BLOCK(0x1000) :
{ {
*(.CRT$XCA) *(.CRT\$XCA)
*(.CRT$XCC) *(.CRT\$XCC)
*(.CRT$XCZ) *(.CRT\$XCZ)
*(.CRT$XIA) *(.CRT\$XIA)
*(.CRT$XIC) *(.CRT\$XIC)
*(.CRT$XIZ) *(.CRT\$XIZ)
*(.CRT$XLA) *(.CRT\$XLA)
*(.CRT$XLZ) *(.CRT\$XLZ)
*(.CRT$XPA) *(.CRT\$XPA)
*(.CRT$XPX) *(.CRT\$XPX)
*(.CRT$XPZ) *(.CRT\$XPZ)
*(.CRT$XTA) *(.CRT\$XTA)
*(.CRT$XTZ) *(.CRT\$XTZ)
; ;
} }
.rsrc BLOCK(0x1000) : .rsrc BLOCK(0x1000) :
{ {
*(.rsrc$01) *(.rsrc\$01)
*(.rsrc$02) *(.rsrc\$02)
; ;
} }
.reloc BLOCK(0x1000) : .reloc BLOCK(0x1000) :
@ -76,9 +76,9 @@ SECTIONS
} }
.junk BLOCK(0x1000) : .junk BLOCK(0x1000) :
{ {
*(.debug$S) *(.debug\$S)
*(.debug$T) *(.debug\$T)
*(.debug$F) *(.debug\$F)
*(.drectve) *(.drectve)
; ;
} }