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:
parent
1a9924d8b3
commit
de71eb7786
10 changed files with 479 additions and 58 deletions
21
ld/ChangeLog
21
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
|
||||
|
|
|
@ -79,6 +79,7 @@ i386-pe.mt
|
|||
i386bsd.mh
|
||||
i386linux.mh
|
||||
i386lynx.mh
|
||||
i386pe.mh
|
||||
i386sco.mh
|
||||
i386v.mh
|
||||
i386v.mt
|
||||
|
|
5
ld/config/i386pe.mh
Normal file
5
ld/config/i386pe.mh
Normal file
|
@ -0,0 +1,5 @@
|
|||
CC_FOR_BUILD=gcc
|
||||
CC=i386-newlib-pe-gcc -O2
|
||||
|
||||
|
||||
|
|
@ -25,6 +25,7 @@ Do-first:
|
|||
Things-to-keep:
|
||||
|
||||
README
|
||||
armpe.em
|
||||
elf32.em
|
||||
generic.em
|
||||
gld960.em
|
||||
|
|
230
ld/emultempl/armpe.em
Normal file
230
ld/emultempl/armpe.em
Normal 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
|
|
@ -228,3 +228,4 @@ struct ld_emulation_xfer_struct ld_i386pe_emulation =
|
|||
"pe-i386"
|
||||
};
|
||||
EOF
|
||||
|
||||
|
|
13
ld/ldmain.c
13
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. */
|
||||
|
|
163
ld/lexsup.c
163
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
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
;
|
||||
}
|
||||
|
|
|
@ -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)
|
||||
;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue