aboutsummaryrefslogtreecommitdiff
path: root/ld/lexsup.c
diff options
context:
space:
mode:
authorSteve Chamberlain <sac@cygnus>1995-06-29 00:21:00 +0000
committerSteve Chamberlain <sac@cygnus>1995-06-29 00:21:00 +0000
commitde71eb7786da1170ae4b4acabeb4c62513c19602 (patch)
treef50c70017dfe024bdec70297d164e8f34c00edcf /ld/lexsup.c
parent1a9924d8b3ff8222fd6bb774990455337a70a4af (diff)
downloadgdb-de71eb7786da1170ae4b4acabeb4c62513c19602.zip
gdb-de71eb7786da1170ae4b4acabeb4c62513c19602.tar.gz
gdb-de71eb7786da1170ae4b4acabeb4c62513c19602.tar.bz2
Wed Jun 28 17:11:25 1995 Steve Chamberlain <sac@slash.cygnus.com>
* ldmain.c (main): Always initialize PE info in link_info. * lexsup.c (OPTION_BASE_FILE): New option. (parse_args): Handle new option. * emulparams/armpe.sh: Output pei. * emultempl/i386pe.em: Add newline to end. * scripttempl/armpe.sc: Change output and quote the $s. * scripttempl/i386pe.sc: Change output and quote the $s.
Diffstat (limited to 'ld/lexsup.c')
-rw-r--r--ld/lexsup.c163
1 files changed, 156 insertions, 7 deletions
diff --git a/ld/lexsup.c b/ld/lexsup.c
index 1102efd..291c432 100644
--- a/ld/lexsup.c
+++ b/ld/lexsup.c
@@ -46,6 +46,10 @@ unsigned long strtoul ();
static void set_default_dirlist PARAMS ((char *dirlist_ptr));
static void set_section_start PARAMS ((char *sect, char *valstr));
+/* WINDOWS_NT; declare additional functions */
+static void set_subsystem PARAMS ((char *subsystem_type));
+static void set_stack_heap PARAMS ((char *valstr, boolean for_heap));
+
void
parse_args (argc, argv)
int argc;
@@ -59,7 +63,7 @@ parse_args (argc, argv)
as if it were the argument of an option with character code 1. */
const char *shortopts =
- "-A:B::b:cde:F::G:giL:l:Mm:NnO:o:R:rSsT:tu:VvXxY:y:()";
+ "-a:A:B::b:c:de:F::G:giL:l:Mm:NnO:o:R:rSsT:tu:VvXxY:y:()";
/* 150 isn't special; it's just an arbitrary non-ASCII char value. */
@@ -68,7 +72,10 @@ parse_args (argc, argv)
#define OPTION_DYNAMIC_LINKER (OPTION_DEFSYM + 1)
#define OPTION_EB (OPTION_DYNAMIC_LINKER + 1)
#define OPTION_EL (OPTION_EB + 1)
-#define OPTION_HELP (OPTION_EL + 1)
+#define OPTION_HEAP (OPTION_EL + 1)
+#define OPTION_EMBEDDED_RELOCS (OPTION_HEAP + 1)
+#define OPTION_EXPORT_DYNAMIC (OPTION_EMBEDDED_RELOCS + 1)
+#define OPTION_HELP (OPTION_EXPORT_DYNAMIC + 1)
#define OPTION_IGNORE (OPTION_HELP + 1)
#define OPTION_MAP (OPTION_IGNORE + 1)
#define OPTION_NO_KEEP_MEMORY (OPTION_MAP + 1)
@@ -81,16 +88,22 @@ parse_args (argc, argv)
#define OPTION_SHARED (OPTION_RPATH + 1)
#define OPTION_SONAME (OPTION_SHARED + 1)
#define OPTION_SORT_COMMON (OPTION_SONAME + 1)
-#define OPTION_STATS (OPTION_SORT_COMMON + 1)
-#define OPTION_TBSS (OPTION_STATS + 1)
+#define OPTION_STACK (OPTION_SORT_COMMON + 1) /*WINDOWS_NT*/
+#define OPTION_STATS (OPTION_STACK + 1)
+#define OPTION_SUBSYSTEM (OPTION_STATS + 1) /* WINDOWS_NT */
+#define OPTION_TBSS (OPTION_SUBSYSTEM + 1)
#define OPTION_TDATA (OPTION_TBSS + 1)
#define OPTION_TTEXT (OPTION_TDATA + 1)
#define OPTION_TRADITIONAL_FORMAT (OPTION_TTEXT + 1)
#define OPTION_UR (OPTION_TRADITIONAL_FORMAT + 1)
-#define OPTION_VERSION (OPTION_UR + 1)
+#define OPTION_VERBOSE (OPTION_UR + 1)
+#define OPTION_VERSION (OPTION_VERBOSE + 1)
#define OPTION_WARN_COMMON (OPTION_VERSION + 1)
#define OPTION_WARN_ONCE (OPTION_WARN_COMMON + 1)
-
+#define OPTION_SPLIT_BY_RELOC (OPTION_WARN_ONCE + 1)
+#define OPTION_SPLIT_BY_FILE (OPTION_SPLIT_BY_RELOC + 1)
+#define OPTION_WHOLE_ARCHIVE (OPTION_SPLIT_BY_FILE + 1)
+#define OPTION_BASE_FILE (OPTION_WHOLE_ARCHIVE + 1)
static struct option longopts[] = {
{"Bdynamic", no_argument, NULL, OPTION_CALL_SHARED},
{"Bstatic", no_argument, NULL, OPTION_NON_SHARED},
@@ -104,8 +117,11 @@ parse_args (argc, argv)
{"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER},
{"EB", no_argument, NULL, OPTION_EB},
{"EL", no_argument, NULL, OPTION_EL},
+ {"embedded-relocs", no_argument, NULL, OPTION_EMBEDDED_RELOCS},
{"end-group", no_argument, NULL, ')'},
+ {"export-dynamic", no_argument, NULL, OPTION_EXPORT_DYNAMIC},
{"format", required_argument, NULL, 'b'},
+ {"heap", required_argument, NULL, OPTION_HEAP}, /* WINDOWS_NT */
{"help", no_argument, NULL, OPTION_HELP},
{"Map", required_argument, NULL, OPTION_MAP},
{"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY},
@@ -122,17 +138,24 @@ parse_args (argc, argv)
{"soname", required_argument, NULL, OPTION_SONAME},
{"sort-common", no_argument, NULL, OPTION_SORT_COMMON},
{"sort_common", no_argument, NULL, OPTION_SORT_COMMON},
+ {"stack", required_argument, NULL, OPTION_STACK}, /* WINDOWS_NT */
{"start-group", no_argument, NULL, '('},
{"stats", no_argument, NULL, OPTION_STATS},
{"static", no_argument, NULL, OPTION_NON_SHARED},
+ {"subsystem", required_argument, NULL, OPTION_SUBSYSTEM}, /* WINDOWS_NT */
{"Tbss", required_argument, NULL, OPTION_TBSS},
{"Tdata", required_argument, NULL, OPTION_TDATA},
{"Ttext", required_argument, NULL, OPTION_TTEXT},
{"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
{"Ur", no_argument, NULL, OPTION_UR},
+ {"verbose", no_argument, NULL, OPTION_VERBOSE},
{"version", no_argument, NULL, OPTION_VERSION},
{"warn-common", no_argument, NULL, OPTION_WARN_COMMON},
{"warn-once", no_argument, NULL, OPTION_WARN_ONCE},
+ {"split-by-reloc", required_argument, NULL, OPTION_SPLIT_BY_RELOC},
+ {"split-by-file", no_argument, NULL, OPTION_SPLIT_BY_FILE},
+ {"whole-archive", no_argument, NULL, OPTION_WHOLE_ARCHIVE},
+ {"base-file", required_argument, NULL, OPTION_BASE_FILE},
{NULL, no_argument, NULL, 0}
};
@@ -157,6 +180,18 @@ parse_args (argc, argv)
case OPTION_IGNORE:
break;
+ case 'a':
+ /* For HP/UX compatibility. Actually -a shared should mean
+ ``use only shared libraries'' but, then, we don't
+ currently support shared libraries on HP/UX anyhow. */
+ if (strcmp (optarg, "archive") == 0)
+ config.dynamic_link = false;
+ else if (strcmp (optarg, "shared") == 0
+ || strcmp (optarg, "default") == 0)
+ config.dynamic_link = true;
+ else
+ einfo ("%P%F: unrecognized -a option `%s'\n", optarg);
+ break;
case 'A':
ldfile_add_arch (optarg);
break;
@@ -191,6 +226,12 @@ parse_args (argc, argv)
case OPTION_EL:
command_line.endian = ENDIAN_LITTLE;
break;
+ case OPTION_EMBEDDED_RELOCS:
+ command_line.embedded_relocs = true;
+ break;
+ case OPTION_EXPORT_DYNAMIC:
+ command_line.export_dynamic = true;
+ break;
case 'e':
lang_add_entry (optarg, 1);
break;
@@ -208,6 +249,10 @@ parse_args (argc, argv)
case 'g':
/* Ignore. */
break;
+ case OPTION_HEAP: /* WINDOWS_NT */
+ link_info.stack_heap_parameters.heap_defined = true;
+ set_stack_heap (optarg, true);
+ break;
case OPTION_HELP:
help ();
xexit (0);
@@ -320,9 +365,16 @@ parse_args (argc, argv)
case OPTION_SORT_COMMON:
config.sort_common = true;
break;
+ case OPTION_STACK: /* WINDOWS_NT */
+ link_info.stack_heap_parameters.stack_defined = true;
+ set_stack_heap (optarg, false);
+ break;
case OPTION_STATS:
config.stats = true;
break;
+ case OPTION_SUBSYSTEM: /* WINDOWS_NT */
+ set_subsystem (optarg);
+ break;
case 't':
trace_files = true;
break;
@@ -353,7 +405,7 @@ parse_args (argc, argv)
case 'u':
ldlang_add_undef (optarg);
break;
- case 'V':
+ case OPTION_VERBOSE:
ldversion (1);
version_printed = true;
trace_file_tries = true;
@@ -362,6 +414,10 @@ parse_args (argc, argv)
ldversion (0);
version_printed = true;
break;
+ case 'V':
+ ldversion (1);
+ version_printed = true;
+ break;
case OPTION_VERSION:
ldversion (0);
version_printed = true;
@@ -372,6 +428,17 @@ parse_args (argc, argv)
case OPTION_WARN_ONCE:
config.warn_once = true;
break;
+ case OPTION_WHOLE_ARCHIVE:
+ whole_archive = true;
+ break;
+ case OPTION_BASE_FILE:
+ link_info.base_file = fopen (optarg,"w");
+ if (!link_info.base_file) {
+ fprintf (stderr, "%s: Can't open base file %s\n",
+ program_name, optarg);
+ xexit (1);
+ }
+ break;
case 'X':
link_info.discard = discard_l;
break;
@@ -384,6 +451,12 @@ parse_args (argc, argv)
case 'y':
add_ysym (optarg);
break;
+ case OPTION_SPLIT_BY_RELOC:
+ config.split_by_reloc = atoi (optarg);
+ break;
+ case OPTION_SPLIT_BY_FILE:
+ config.split_by_file = true;
+ break;
case '(':
if (ingroup)
{
@@ -446,3 +519,79 @@ set_section_start (sect, valstr)
einfo ("%P%F: invalid hex number `%s'\n", valstr);
lang_section_start (sect, exp_intop (val));
}
+
+/* WINDOWS_NT; added routines to get the subsystem type, heap and/or stack
+ parameters which may be input from the command line */
+static void
+set_subsystem (subsystem_type)
+ char *subsystem_type;
+{
+ if (strcmp (subsystem_type, "native") == 0)
+ {
+ link_info.subsystem = native;
+ }
+ else if (strcmp (subsystem_type, "windows") == 0)
+ {
+ link_info.subsystem = windows;
+ }
+ else if (strcmp (subsystem_type, "console") == 0)
+ {
+ link_info.subsystem = console;
+ }
+ else if (strcmp (subsystem_type, "os2") == 0)
+ {
+ link_info.subsystem = os2;
+ }
+ else if (strcmp (subsystem_type, "posix") == 0)
+ {
+ link_info.subsystem = posix;
+ }
+ else
+ einfo ("%P%F: invalid subsystem type `%s'\n", subsystem_type);
+
+}
+
+static void
+set_stack_heap (valstr, for_heap)
+ char *valstr;
+ boolean for_heap;
+{
+ char *begin_commit, *end;
+ bfd_vma reserve = 0;
+ bfd_vma commit = 0;
+
+ /* There may be two values passed in to the -stack or -heap switches like
+ this:
+ -stack 0x10000,0x100
+ where the first parameter is the stack (or heap) reserve and the second
+ is commit. The second parameter is optional. */
+
+ /* get the reserve value */
+ reserve = strtoul (valstr, &begin_commit, 16);
+
+ if (strcmp (valstr, begin_commit) == 0)
+ /* the reserve value couldn't be read */
+ einfo ("%P%F: invalid hex number for reserve[,commit] '%s'\n", valstr);
+ else if (strcmp (begin_commit, "\0") != 0) /* check for a commit value */
+ {
+ begin_commit += 1; /* increment begin_commit to point past ',' */
+ commit = strtoul (begin_commit, &end, 16);
+ if (strcmp (end, begin_commit) == 0)
+ einfo ("%P%F: invalid hex number for commit '%s'\n", begin_commit);
+ }
+
+ if (for_heap)
+ {
+ link_info.stack_heap_parameters.heap_reserve = reserve;
+ link_info.stack_heap_parameters.heap_commit = commit;
+ }
+ else
+ {
+ link_info.stack_heap_parameters.stack_reserve = reserve;
+ link_info.stack_heap_parameters.stack_commit = commit;
+ }
+
+#if DUMP_INFO
+ printf ("reserve = %8x commit = %8x\n", reserve, commit);
+#endif
+}