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>
|
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
|
||||||
|
|
|
@ -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
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:
|
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
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
|
|
@ -227,4 +227,5 @@ struct ld_emulation_xfer_struct ld_i386pe_emulation =
|
||||||
"i386pe",
|
"i386pe",
|
||||||
"pe-i386"
|
"pe-i386"
|
||||||
};
|
};
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
|
13
ld/ldmain.c
13
ld/ldmain.c
|
@ -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. */
|
||||||
|
|
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_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
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
;
|
;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue