* ldemul.c (ldemul_add_options, ldemul_handle_option): New functions.

(ldemul_parse_args): Return bfd_boolean.  Formatting.
	* ldemul.h (ldemul_add_options, ldemul_handle_option): Declare.
	(ldemul_parse_args): Adjust.
	(struct ld_emulation_xfer_struct): Add add_options and handle_option.
	Return bfd_boolean from parse_args.
	* lexsup.c (parse_args): Malloc shortopts, longopts and
	really_longopts.  Call ldemul_add_options and ldemul_handle_option.
	* emultempl/aix.em (gld${EMULATION_NAME}_add_options): Split out from
	gld${EMULATION_NAME}_parse_args.
	(gld${EMULATION_NAME}_handle_option): Likewise.
	(ld_${EMULATION_NAME}_emulation): Adjust initializer.
	* emultempl/armcoff.em: As for aix.em, but remove parse_args.
	* emultempl/beos.em: Likewise.
	* emultempl/pe.em: Likewise.
	* emultempl/ticoff.em: Likewise.
	* emultempl/elf32.em: Likewise.  Don't duplicate long options either.
	(gld${EMULATION_NAME}_add_sysroot): Prototype.
	* emultempl/armelf.em (PARSE_AND_LIST_LONGOPTS): Don't duplicate
	options.
	* emultempl/hppaelf.em (PARSE_AND_LIST_LONGOPTS): Likewise.
	* emultempl/ppc32elf.em (PARSE_AND_LIST_LONGOPTS): Likewise.
	* emultempl/ppc64elf.em (PARSE_AND_LIST_LONGOPTS): Likewise.
	* emultempl/armelf_oabi.em (ld_${EMULATION_NAME}_emulation): Adjust
	initializer.
	* emultempl/generic.em: Likewise.
	* emultempl/gld960.em: Likewise.
	* emultempl/gld960c.em: Likewise.
	* emultempl/linux.em: Likewise.
	* emultempl/lnk960.em: Likewise.
	* emultempl/m68kcoff.em: Likewise.
	* emultempl/mipsecoff.em: Likewise.
	* emultempl/sunos.em: Likewise.
	* emultempl/vanilla.em: Likewise.
	* emultempl/netbsd.em (gldnetbsd_before_parse): Prototype.
This commit is contained in:
Alan Modra 2003-02-28 01:32:31 +00:00
parent 2c4c2bc0a5
commit 3bcf55573d
25 changed files with 377 additions and 292 deletions

View file

@ -1,3 +1,41 @@
2003-02-28 Alan Modra <amodra@bigpond.net.au>
* ldemul.c (ldemul_add_options, ldemul_handle_option): New functions.
(ldemul_parse_args): Return bfd_boolean. Formatting.
* ldemul.h (ldemul_add_options, ldemul_handle_option): Declare.
(ldemul_parse_args): Adjust.
(struct ld_emulation_xfer_struct): Add add_options and handle_option.
Return bfd_boolean from parse_args.
* lexsup.c (parse_args): Malloc shortopts, longopts and
really_longopts. Call ldemul_add_options and ldemul_handle_option.
* emultempl/aix.em (gld${EMULATION_NAME}_add_options): Split out from
gld${EMULATION_NAME}_parse_args.
(gld${EMULATION_NAME}_handle_option): Likewise.
(ld_${EMULATION_NAME}_emulation): Adjust initializer.
* emultempl/armcoff.em: As for aix.em, but remove parse_args.
* emultempl/beos.em: Likewise.
* emultempl/pe.em: Likewise.
* emultempl/ticoff.em: Likewise.
* emultempl/elf32.em: Likewise. Don't duplicate long options either.
(gld${EMULATION_NAME}_add_sysroot): Prototype.
* emultempl/armelf.em (PARSE_AND_LIST_LONGOPTS): Don't duplicate
options.
* emultempl/hppaelf.em (PARSE_AND_LIST_LONGOPTS): Likewise.
* emultempl/ppc32elf.em (PARSE_AND_LIST_LONGOPTS): Likewise.
* emultempl/ppc64elf.em (PARSE_AND_LIST_LONGOPTS): Likewise.
* emultempl/armelf_oabi.em (ld_${EMULATION_NAME}_emulation): Adjust
initializer.
* emultempl/generic.em: Likewise.
* emultempl/gld960.em: Likewise.
* emultempl/gld960c.em: Likewise.
* emultempl/linux.em: Likewise.
* emultempl/lnk960.em: Likewise.
* emultempl/m68kcoff.em: Likewise.
* emultempl/mipsecoff.em: Likewise.
* emultempl/sunos.em: Likewise.
* emultempl/vanilla.em: Likewise.
* emultempl/netbsd.em (gldnetbsd_before_parse): Prototype.
2003-02-25 Alexandre Oliva <aoliva@redhat.com>
* emultempl/elf32.em (gld${EMULATION_NAME}_add_sysroot): Fix

View file

@ -9,7 +9,7 @@ cat >e${EMULATION_NAME}.c <<EOF
/* This file is is generated by a shell script. DO NOT EDIT! */
/* AIX emulation code for ${EMULATION_NAME}
Copyright 1991, 1993, 1995, 1996, 1997, 1998, 2000, 2001, 2002
Copyright 1991, 1993, 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
Written by Steve Chamberlain <sac@cygnus.com>
AIX support by Ian Lance Taylor <ian@cygnus.com>
@ -58,8 +58,12 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
static void gld${EMULATION_NAME}_before_parse
PARAMS ((void));
static int gld${EMULATION_NAME}_parse_args
static bfd_boolean gld${EMULATION_NAME}_parse_args
PARAMS ((int, char **));
static void gld${EMULATION_NAME}_add_options
PARAMS ((int, char **, int, struct option **, int, struct option **));
static bfd_boolean gld${EMULATION_NAME}_handle_option
PARAMS ((int));
static void gld${EMULATION_NAME}_after_open
PARAMS ((void));
static char *gld${EMULATION_NAME}_choose_target
@ -180,20 +184,7 @@ gld${EMULATION_NAME}_before_parse ()
/* Handle AIX specific options. */
static int
gld${EMULATION_NAME}_parse_args (argc, argv)
int argc;
char **argv;
{
int prevoptind = optind;
int prevopterr = opterr;
int indx;
int longind;
int optc;
bfd_signed_vma val;
const char *end;
enum
enum
{
OPTION_IGNORE = 300,
OPTION_AUTOIMP,
@ -218,6 +209,17 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
OPTION_NOLIBPATH,
};
static void
gld${EMULATION_NAME}_add_options (ns, shortopts, nl, longopts, nrl, really_longopts)
int ns;
char **shortopts;
int nl;
struct option **longopts;
int nrl ATTRIBUTE_UNUSED;
struct option **really_longopts ATTRIBUTE_UNUSED;
{
static const char xtra_short[] = "D:H:KT:z";
static const struct option xtra_long[] = {
/* -binitfini has special handling in the linker backend. The native linker
uses the arguemnts to generate a table of init and fini functions for
the executable. The important use for this option is to support aix 4.2+
@ -227,7 +229,6 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
the first symbol in the loader symbol table is __rtinit. The gnu linker
generates this symbol and makes it the first loader symbol. */
static const struct option longopts[] = {
{"basis", no_argument, NULL, OPTION_IGNORE},
{"bautoimp", no_argument, NULL, OPTION_AUTOIMP},
{"bcomprld", no_argument, NULL, OPTION_IGNORE},
@ -288,6 +289,20 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
-bnotypchk, -bnox, -bquiet, -bR, -brename, -breorder, -btypchk,
-bx, -bX, -bxref. */
*shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
*longopts = (struct option *)
xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
}
static bfd_boolean
gld${EMULATION_NAME}_parse_args (argc, argv)
int argc;
char **argv;
{
int indx;
/* If the current option starts with -b, change the first : to an =.
The AIX linker uses : to separate the option from the argument;
changing it to = lets us treat it as a getopt option. */
@ -308,22 +323,20 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
}
}
}
return FALSE;
}
/* We add s and u so to the short options list so that -s and -u on
the command line do not match -static and -unix. */
opterr = 0;
optc = getopt_long_only (argc, argv, "-D:H:KT:zsu", longopts, &longind);
opterr = prevopterr;
static bfd_boolean
gld${EMULATION_NAME}_handle_option (optc)
int optc;
{
bfd_signed_vma val;
const char *end;
switch (optc)
{
case 's':
case 'u':
default:
optind = prevoptind;
return 0;
return FALSE;
case 0:
/* Long option which just sets a flag. */
@ -358,10 +371,7 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
ignore the AIX option, because gcc passes it to the linker. */
val = bfd_scan_vma (optarg, &end, 0);
if (*end != '\0')
{
optind = prevoptind;
return 0;
}
return FALSE;
lang_section_start (".text", exp_intop (val));
break;
@ -552,7 +562,7 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
}
return 1;
return TRUE;
}
/* This is called when an input file can not be recognized as a BFD
@ -945,7 +955,7 @@ is_syscall (input, flag)
/* Read an import or export file. For an import file, this is called
by the before_allocation emulation routine. For an export file,
this is called by the parse_args emulation routine. */
this is called by the handle_option emulation routine. */
static void
gld${EMULATION_NAME}_read_file (filename, import)
@ -1391,6 +1401,8 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation = {
0, /* place_orphan */
0, /* set_symbols */
gld${EMULATION_NAME}_parse_args,
gld${EMULATION_NAME}_add_options,
gld${EMULATION_NAME}_handle_option,
gld${EMULATION_NAME}_unrecognized_file,
NULL, /* list_options */
NULL, /* recognized_file */

View file

@ -4,7 +4,7 @@ cat >e${EMULATION_NAME}.c <<EOF
/* This file is is generated by a shell script. DO NOT EDIT! */
/* emulate the original gld for the given ${EMULATION_NAME}
Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002
Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
Written by Steve Chamberlain steve@cygnus.com
@ -43,8 +43,10 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
static void gld${EMULATION_NAME}_before_parse PARAMS ((void));
static void gld${EMULATION_NAME}_before_allocation PARAMS ((void));
static char *gld${EMULATION_NAME}_get_script PARAMS ((int *isfile));
static int gld${EMULATION_NAME}_parse_args PARAMS((int, char **));
static void gld${EMULATION_NAME}_add_options
PARAMS ((int, char **, int, struct option **, int, struct option **));
static void gld${EMULATION_NAME}_list_options PARAMS ((FILE *));
static bfd_boolean gld${EMULATION_NAME}_handle_option PARAMS ((int));
static void gld${EMULATION_NAME}_finish PARAMS ((void));
static void gld${EMULATION_NAME}_after_open PARAMS ((void));
@ -57,12 +59,25 @@ static char * thumb_entry_symbol = NULL;
#define OPTION_SUPPORT_OLD_CODE 300
#define OPTION_THUMB_ENTRY 301
static struct option longopts[] =
static void
gld${EMULATION_NAME}_add_options (ns, shortopts, nl, longopts, nrl, really_longopts)
int ns ATTRIBUTE_UNUSED;
char **shortopts ATTRIBUTE_UNUSED;
int nl;
struct option **longopts;
int nrl ATTRIBUTE_UNUSED;
struct option **really_longopts ATTRIBUTE_UNUSED;
{
{"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE},
{"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
{NULL, no_argument, NULL, 0}
};
static const struct option xtra_long[] = {
{"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE},
{"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
{NULL, no_argument, NULL, 0}
};
*longopts = (struct option *)
xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
}
static void
gld${EMULATION_NAME}_list_options (file)
@ -72,34 +87,14 @@ gld${EMULATION_NAME}_list_options (file)
fprintf (file, _(" --thumb-entry=<sym> Set the entry point to be Thumb symbol <sym>\n"));
}
static int
gld${EMULATION_NAME}_parse_args (argc, argv)
int argc;
char ** argv;
static bfd_boolean
gld${EMULATION_NAME}_handle_option (optc)
int optc;
{
int longind;
int optc;
int prevoptind = optind;
int prevopterr = opterr;
int wanterror;
static int lastoptind = -1;
if (lastoptind != optind)
opterr = 0;
wanterror = opterr;
lastoptind = optind;
optc = getopt_long_only (argc, argv, "-", longopts, & longind);
opterr = prevopterr;
switch (optc)
{
default:
if (wanterror)
xexit (1);
optind = prevoptind;
return 0;
return FALSE;
case OPTION_SUPPORT_OLD_CODE:
support_old_code = 1;
@ -110,7 +105,7 @@ gld${EMULATION_NAME}_parse_args (argc, argv)
break;
}
return 1;
return TRUE;
}
static void
@ -286,7 +281,9 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* open dynamic archive */
NULL, /* place orphan */
NULL, /* set symbols */
gld${EMULATION_NAME}_parse_args,
NULL, /* parse_args */
gld${EMULATION_NAME}_add_options,
gld${EMULATION_NAME}_handle_option,
NULL, /* unrecognised file */
gld${EMULATION_NAME}_list_options,
NULL, /* recognized file */

View file

@ -1,5 +1,5 @@
# This shell script emits a C file. -*- C -*-
# Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2002
# Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2002, 2003
# Free Software Foundation, Inc.
#
# This file is part of GLD, the Gnu Linker.
@ -195,11 +195,7 @@ PARSE_AND_LIST_PROLOGUE='
PARSE_AND_LIST_SHORTOPTS=p
# Note we have duplicate entries for no-pipeline-knowledge in order
# to prevent getopt_long_only from thinking that -n is a unique
# abbreviation for --no-pipeline-knowledge.
PARSE_AND_LIST_LONGOPTS='
{ "no-pipeline-knowledge", no_argument, NULL, '\'p\''},
{ "no-pipeline-knowledge", no_argument, NULL, '\'p\''},
{ "thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
'

View file

@ -4,7 +4,7 @@ cat >e${EMULATION_NAME}.c <<EOF
/* This file is is generated by a shell script. DO NOT EDIT! */
/* emulate the original gld for the given ${EMULATION_NAME}
Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002
Copyright 1991, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
Written by Steve Chamberlain steve@cygnus.com
@ -171,6 +171,8 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* place orphan */
NULL, /* set symbols */
NULL, /* parse args */
NULL, /* add_options */
NULL, /* handle_option */
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */

View file

@ -7,7 +7,7 @@ else
fi
cat >e${EMULATION_NAME}.c <<EOF
/* This file is part of GLD, the Gnu Linker.
Copyright 1995, 1996, 1997, 1998, 2000, 2001, 2002
Copyright 1995, 1996, 1997, 1998, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
@ -58,7 +58,6 @@ static void gld_${EMULATION_NAME}_before_allocation PARAMS ((void));
static bfd_boolean gld${EMULATION_NAME}_place_orphan
PARAMS ((lang_input_statement_type *, asection *));
static char *gld_${EMULATION_NAME}_get_script PARAMS ((int *));
static int gld_${EMULATION_NAME}_parse_args PARAMS ((int, char **));
static int sort_by_file_name PARAMS ((const PTR, const PTR));
static int sort_by_section_name PARAMS ((const PTR, const PTR));
@ -110,8 +109,20 @@ gld_${EMULATION_NAME}_before_parse()
#define OPTION_SUBSYSTEM (OPTION_STACK + 1)
#define OPTION_HEAP (OPTION_SUBSYSTEM + 1)
static struct option longopts[] = {
/* PE options */
static void gld${EMULATION_NAME}_add_options
PARAMS ((int, char **, int, struct option **, int, struct option **));
static void
gld${EMULATION_NAME}_add_options (ns, shortopts, nl, longopts, nrl, really_longopts)
int ns ATTRIBUTE_UNUSED;
char **shortopts ATTRIBUTE_UNUSED;
int nl;
struct option **longopts;
int nrl ATTRIBUTE_UNUSED;
struct option **really_longopts ATTRIBUTE_UNUSED;
{
static const struct option xtra_long[] = {
/* PE options */
{"base-file", required_argument, NULL, OPTION_BASE_FILE},
{"dll", no_argument, NULL, OPTION_DLL},
{"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
@ -126,9 +137,14 @@ static struct option longopts[] = {
{"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
{"stack", required_argument, NULL, OPTION_STACK},
{"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
{NULL, no_argument, NULL, 0}
{NULL, no_argument, NULL, 0}
};
*longopts = (struct option *)
xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
}
/* PE/WIN32; added routines to get the subsystem type, heap and/or stack
parameters which may be input from the command line */
@ -299,35 +315,17 @@ set_pe_stack_heap (resname, comname)
}
static bfd_boolean gld${EMULATION_NAME}_handle_option
PARAMS ((int));
static int
gld_${EMULATION_NAME}_parse_args(argc, argv)
int argc;
char **argv;
static bfd_boolean
gld${EMULATION_NAME}_handle_option (optc)
int optc;
{
int longind;
int optc;
int prevoptind = optind;
int prevopterr = opterr;
int wanterror;
static int lastoptind = -1;
if (lastoptind != optind)
opterr = 0;
wanterror = opterr;
lastoptind = optind;
optc = getopt_long_only (argc, argv, "-", longopts, &longind);
opterr = prevopterr;
switch (optc)
{
default:
if (wanterror)
xexit (1);
optind = prevoptind;
return 0;
return FALSE;
case OPTION_BASE_FILE:
link_info.base_file = (PTR) fopen (optarg, FOPEN_WB);
@ -380,7 +378,7 @@ gld_${EMULATION_NAME}_parse_args(argc, argv)
set_pe_value ("__image_base__");
break;
}
return 1;
return TRUE;
}
/* Assign values to the special symbols before the linker script is
@ -870,7 +868,9 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* open dynamic archive */
gld${EMULATION_NAME}_place_orphan,
gld_${EMULATION_NAME}_set_symbols,
gld_${EMULATION_NAME}_parse_args,
NULL, /* parse_args */
gld${EMULATION_NAME}_add_options,
gld${EMULATION_NAME}_handle_option,
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */

View file

@ -51,6 +51,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
#include "ldemul.h"
#include <ldgram.h>
#include "elf/common.h"
#include "getopt.h"
static void gld${EMULATION_NAME}_before_parse
PARAMS ((void));
@ -444,6 +445,8 @@ if [ "x${USE_LIBPATH}" = xyes ] ; then
/* Add the sysroot to every entry in a colon-separated path. */
static char * gld${EMULATION_NAME}_add_sysroot PARAMS ((const char *));
static char *
gld${EMULATION_NAME}_add_sysroot (path)
const char *path;
@ -1514,8 +1517,6 @@ fi
if test -n "$PARSE_AND_LIST_ARGS_CASES" -o x"$GENERATE_SHLIB_SCRIPT" = xyes; then
if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
if test -n "$PARSE_AND_LIST_PROLOGUE" ; then
cat >>e${EMULATION_NAME}.c <<EOF
$PARSE_AND_LIST_PROLOGUE
@ -1524,73 +1525,64 @@ fi
cat >>e${EMULATION_NAME}.c <<EOF
#include "getopt.h"
#define OPTION_DISABLE_NEW_DTAGS (400)
#define OPTION_ENABLE_NEW_DTAGS (OPTION_DISABLE_NEW_DTAGS + 1)
#define OPTION_GROUP (OPTION_ENABLE_NEW_DTAGS + 1)
#define OPTION_EH_FRAME_HDR (OPTION_GROUP + 1)
static struct option longopts[] =
static void gld${EMULATION_NAME}_add_options
PARAMS ((int, char **, int, struct option **, int, struct option **));
static void
gld${EMULATION_NAME}_add_options (ns, shortopts, nl, longopts, nrl, really_longopts)
int ns;
char **shortopts;
int nl;
struct option **longopts;
int nrl ATTRIBUTE_UNUSED;
struct option **really_longopts ATTRIBUTE_UNUSED;
{
static const char xtra_short[] = "${PARSE_AND_LIST_SHORTOPTS}z:";
static const struct option xtra_long[] = {
EOF
if test x"$GENERATE_SHLIB_SCRIPT" = xyes; then
cat >>e${EMULATION_NAME}.c <<EOF
/* getopt allows abbreviations, so we do this to stop it from
treating -d/-e as abbreviations for these options. */
{"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
{"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
{"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
{"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
{"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
{"Bgroup", no_argument, NULL, OPTION_GROUP},
{"Bgroup", no_argument, NULL, OPTION_GROUP},
{"disable-new-dtags", no_argument, NULL, OPTION_DISABLE_NEW_DTAGS},
{"enable-new-dtags", no_argument, NULL, OPTION_ENABLE_NEW_DTAGS},
{"eh-frame-hdr", no_argument, NULL, OPTION_EH_FRAME_HDR},
{"Bgroup", no_argument, NULL, OPTION_GROUP},
EOF
fi
if test -n "$PARSE_AND_LIST_LONGOPTS" ; then
cat >>e${EMULATION_NAME}.c <<EOF
$PARSE_AND_LIST_LONGOPTS
$PARSE_AND_LIST_LONGOPTS
EOF
fi
cat >>e${EMULATION_NAME}.c <<EOF
{NULL, no_argument, NULL, 0}
};
{NULL, no_argument, NULL, 0}
};
*shortopts = (char *) xrealloc (*shortopts, ns + sizeof (xtra_short));
memcpy (*shortopts + ns, &xtra_short, sizeof (xtra_short));
*longopts = (struct option *)
xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
}
static int gld${EMULATION_NAME}_parse_args PARAMS ((int, char **));
static bfd_boolean gld${EMULATION_NAME}_handle_option
PARAMS ((int));
static int
gld${EMULATION_NAME}_parse_args (argc, argv)
int argc;
char ** argv;
static bfd_boolean
gld${EMULATION_NAME}_handle_option (optc)
int optc;
{
int longind;
int optc;
static int prevoptind = -1;
int prevopterr = opterr;
int wanterror;
if (prevoptind != optind)
opterr = 0;
wanterror = opterr;
prevoptind = optind;
optc = getopt_long_only (argc, argv,
"-${PARSE_AND_LIST_SHORTOPTS}z:", longopts,
&longind);
opterr = prevopterr;
switch (optc)
{
default:
if (wanterror)
xexit (1);
optind = prevoptind;
return 0;
return FALSE;
EOF
@ -1663,11 +1655,10 @@ fi
cat >>e${EMULATION_NAME}.c <<EOF
}
return 1;
return TRUE;
}
EOF
fi
if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
cat >>e${EMULATION_NAME}.c <<EOF
@ -1721,11 +1712,10 @@ EOF
fi
fi
else
if test x"$LDEMUL_PARSE_ARGS" != xgld"$EMULATION_NAME"_parse_args; then
cat >>e${EMULATION_NAME}.c <<EOF
#define gld${EMULATION_NAME}_parse_args NULL
#define gld${EMULATION_NAME}_add_options NULL
#define gld${EMULATION_NAME}_handle_option NULL
EOF
fi
if test x"$LDEMUL_LIST_OPTIONS" != xgld"$EMULATION_NAME"_list_options; then
cat >>e${EMULATION_NAME}.c <<EOF
#define gld${EMULATION_NAME}_list_options NULL
@ -1754,7 +1744,9 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
${LDEMUL_OPEN_DYNAMIC_ARCHIVE-gld${EMULATION_NAME}_open_dynamic_archive},
${LDEMUL_PLACE_ORPHAN-gld${EMULATION_NAME}_place_orphan},
${LDEMUL_SET_SYMBOLS-NULL},
${LDEMUL_PARSE_ARGS-gld${EMULATION_NAME}_parse_args},
${LDEMUL_PARSE_ARGS-NULL},
gld${EMULATION_NAME}_add_options,
gld${EMULATION_NAME}_handle_option,
${LDEMUL_UNRECOGNIZED_FILE-NULL},
${LDEMUL_LIST_OPTIONS-gld${EMULATION_NAME}_list_options},
${LDEMUL_RECOGNIZED_FILE-NULL},

View file

@ -141,6 +141,8 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
${LDEMUL_PLACE_ORPHAN-NULL},
${LDEMUL_SET_SYMBOLS-NULL},
${LDEMUL_PARSE_ARGS-NULL},
NULL, /* add_options */
NULL, /* handle_option */
${LDEMUL_UNRECOGNIZED_FILE-NULL},
${LDEMUL_LIST_OPTIONS-NULL},
${LDEMUL_RECOGNIZED_FILE-NULL},

View file

@ -1,7 +1,7 @@
# This shell script emits a C file. -*- C -*-
# It does some substitutions.
cat >e${EMULATION_NAME}.c <<EOF
/* Copyright 1991, 1992, 1994, 1999, 2000, 2001, 2002
/* Copyright 1991, 1992, 1994, 1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
This file is part of GLD, the Gnu Linker.
@ -186,6 +186,8 @@ struct ld_emulation_xfer_struct ld_gld960_emulation =
NULL, /* place orphan */
NULL, /* set symbols */
NULL, /* parse args */
NULL, /* add_options */
NULL, /* handle_option */
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */

View file

@ -1,7 +1,7 @@
# This shell script emits a C file. -*- C -*-
# It does some substitutions.
cat >e${EMULATION_NAME}.c <<EOF
/* Copyright 1991, 1993, 1994, 1996, 1999, 2000, 2001, 2002
/* Copyright 1991, 1993, 1994, 1996, 1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
This file is part of GLD, the Gnu Linker.
@ -201,6 +201,8 @@ struct ld_emulation_xfer_struct ld_gld960coff_emulation =
NULL, /* place orphan */
NULL, /* set symbols */
NULL, /* parse args */
NULL, /* add_options */
NULL, /* handle_option */
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */

View file

@ -360,12 +360,8 @@ PARSE_AND_LIST_PROLOGUE='
#define OPTION_STUBGROUP_SIZE (OPTION_MULTI_SUBSPACE + 1)
'
# The options are repeated below so that no abbreviations are allowed.
# Otherwise -s matches stub-group-size
PARSE_AND_LIST_LONGOPTS='
{ "multi-subspace", no_argument, NULL, OPTION_MULTI_SUBSPACE },
{ "multi-subspace", no_argument, NULL, OPTION_MULTI_SUBSPACE },
{ "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
{ "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
'

View file

@ -9,7 +9,7 @@ cat >e${EMULATION_NAME}.c <<EOF
/* This file is is generated by a shell script. DO NOT EDIT! */
/* Linux a.out emulation code for ${EMULATION_NAME}
Copyright 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2002
Copyright 1991, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2002, 2003
Free Software Foundation, Inc.
Written by Steve Chamberlain <sac@cygnus.com>
Linux support by Eric Youngdale <ericy@cais.cais.com>
@ -218,6 +218,8 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* place orphan */
NULL, /* set symbols */
NULL, /* parse args */
NULL, /* add_options */
NULL, /* handle_option */
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */

View file

@ -2,7 +2,7 @@
# It does some substitutions.
cat >e${EMULATION_NAME}.c <<EOF
/* intel coff loader emulation specific stuff
Copyright 1991, 1992, 1994, 1995, 1996, 1999, 2000, 2001, 2002
Copyright 1991, 1992, 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
Written by Steve Chamberlain steve@cygnus.com
@ -341,6 +341,8 @@ struct ld_emulation_xfer_struct ld_lnk960_emulation =
NULL, /* place orphan */
NULL, /* set symbols */
NULL, /* parse args */
NULL, /* add_options */
NULL, /* handle_option */
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */

View file

@ -4,7 +4,7 @@ cat >e${EMULATION_NAME}.c <<EOF
/* This file is is generated by a shell script. DO NOT EDIT! */
/* Handle embedded relocs for m68k.
Copyright 2000, 2002 Free Software Foundation, Inc.
Copyright 2000, 2002, 2003 Free Software Foundation, Inc.
Written by Michael Sokolov <msokolov@ivan.Harhan.ORG>, based on generic.em
by Steve Chamberlain <steve@cygnus.com>, embedded relocs code based on
mipsecoff.em by Ian Lance Taylor <ian@cygnus.com>.
@ -237,6 +237,8 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* place orphan */
NULL, /* set symbols */
NULL, /* parse args */
NULL, /* add_options */
NULL, /* handle_option */
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */

View file

@ -9,7 +9,8 @@ cat >e${EMULATION_NAME}.c <<EOF
/* This file is is generated by a shell script. DO NOT EDIT! */
/* Handle embedded relocs for MIPS.
Copyright 1994, 1995, 1997, 2000, 2002 Free Software Foundation, Inc.
Copyright 1994, 1995, 1997, 2000, 2002, 2003
Free Software Foundation, Inc.
Written by Ian Lance Taylor <ian@cygnus.com> based on generic.em.
This file is part of GLD, the Gnu Linker.
@ -252,6 +253,8 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* place orphan */
NULL, /* set symbols */
NULL, /* parse args */
NULL, /* add_options */
NULL, /* handle_option */
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */

View file

@ -1,5 +1,7 @@
LDEMUL_BEFORE_PARSE=gldnetbsd_before_parse
cat >>e${EMULATION_NAME}.c <<EOF
static void gldnetbsd_before_parse PARAMS ((void));
static void
gldnetbsd_before_parse ()
{

View file

@ -114,10 +114,12 @@ static asection *output_prev_sec_find
static bfd_boolean gld_${EMULATION_NAME}_place_orphan
PARAMS ((lang_input_statement_type *, asection *));
static char *gld_${EMULATION_NAME}_get_script PARAMS ((int *));
static int gld_${EMULATION_NAME}_parse_args PARAMS ((int, char **));
static void gld_${EMULATION_NAME}_finish PARAMS ((void));
static bfd_boolean gld_${EMULATION_NAME}_open_dynamic_archive
PARAMS ((const char *, search_dirs_type *, lang_input_statement_type *));
static void gld${EMULATION_NAME}_add_options
PARAMS ((int, char **, int, struct option **, int, struct option **));
static bfd_boolean gld${EMULATION_NAME}_handle_option PARAMS ((int));
static void gld_${EMULATION_NAME}_list_options PARAMS ((FILE *));
static void set_pe_name PARAMS ((char *, long));
static void set_pe_subsystem PARAMS ((void));
@ -228,55 +230,68 @@ gld_${EMULATION_NAME}_before_parse()
#define OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC \
(OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC + 1)
static struct option longopts[] = {
/* PE options */
{"base-file", required_argument, NULL, OPTION_BASE_FILE},
{"dll", no_argument, NULL, OPTION_DLL},
{"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
{"heap", required_argument, NULL, OPTION_HEAP},
{"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
{"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION},
{"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION},
{"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION},
{"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION},
{"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION},
{"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION},
{"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
{"stack", required_argument, NULL, OPTION_STACK},
{"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
{"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE},
{"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
static void
gld${EMULATION_NAME}_add_options (ns, shortopts, nl, longopts, nrl, really_longopts)
int ns ATTRIBUTE_UNUSED;
char **shortopts ATTRIBUTE_UNUSED;
int nl;
struct option **longopts;
int nrl ATTRIBUTE_UNUSED;
struct option **really_longopts ATTRIBUTE_UNUSED;
{
static const struct option xtra_long[] = {
/* PE options */
{"base-file", required_argument, NULL, OPTION_BASE_FILE},
{"dll", no_argument, NULL, OPTION_DLL},
{"file-alignment", required_argument, NULL, OPTION_FILE_ALIGNMENT},
{"heap", required_argument, NULL, OPTION_HEAP},
{"image-base", required_argument, NULL, OPTION_IMAGE_BASE},
{"major-image-version", required_argument, NULL, OPTION_MAJOR_IMAGE_VERSION},
{"major-os-version", required_argument, NULL, OPTION_MAJOR_OS_VERSION},
{"major-subsystem-version", required_argument, NULL, OPTION_MAJOR_SUBSYSTEM_VERSION},
{"minor-image-version", required_argument, NULL, OPTION_MINOR_IMAGE_VERSION},
{"minor-os-version", required_argument, NULL, OPTION_MINOR_OS_VERSION},
{"minor-subsystem-version", required_argument, NULL, OPTION_MINOR_SUBSYSTEM_VERSION},
{"section-alignment", required_argument, NULL, OPTION_SECTION_ALIGNMENT},
{"stack", required_argument, NULL, OPTION_STACK},
{"subsystem", required_argument, NULL, OPTION_SUBSYSTEM},
{"support-old-code", no_argument, NULL, OPTION_SUPPORT_OLD_CODE},
{"thumb-entry", required_argument, NULL, OPTION_THUMB_ENTRY},
#ifdef DLL_SUPPORT
/* getopt allows abbreviations, so we do this to stop it from treating -o
as an abbreviation for this option */
{"output-def", required_argument, NULL, OPTION_OUT_DEF},
{"output-def", required_argument, NULL, OPTION_OUT_DEF},
{"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL},
{"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS},
{"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
{"kill-at", no_argument, NULL, OPTION_KILL_ATS},
{"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
{"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
{"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_STDCALL_FIXUP},
{"out-implib", required_argument, NULL, OPTION_IMPLIB_FILENAME},
{"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS},
/* getopt() allows abbreviations, so we do this to stop it from
treating -c as an abbreviation for these --compat-implib. */
{"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
{"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
{"enable-auto-image-base", no_argument, NULL, OPTION_ENABLE_AUTO_IMAGE_BASE},
{"disable-auto-image-base", no_argument, NULL, OPTION_DISABLE_AUTO_IMAGE_BASE},
{"dll-search-prefix", required_argument, NULL, OPTION_DLL_SEARCH_PREFIX},
{"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES},
{"enable-auto-import", no_argument, NULL, OPTION_DLL_ENABLE_AUTO_IMPORT},
{"disable-auto-import", no_argument, NULL, OPTION_DLL_DISABLE_AUTO_IMPORT},
{"enable-extra-pe-debug", no_argument, NULL, OPTION_ENABLE_EXTRA_PE_DEBUG},
{"enable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC},
{"disable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC},
/* getopt allows abbreviations, so we do this to stop it from treating -o
as an abbreviation for this option */
{"output-def", required_argument, NULL, OPTION_OUT_DEF},
{"output-def", required_argument, NULL, OPTION_OUT_DEF},
{"export-all-symbols", no_argument, NULL, OPTION_EXPORT_ALL},
{"exclude-symbols", required_argument, NULL, OPTION_EXCLUDE_SYMBOLS},
{"exclude-libs", required_argument, NULL, OPTION_EXCLUDE_LIBS},
{"kill-at", no_argument, NULL, OPTION_KILL_ATS},
{"add-stdcall-alias", no_argument, NULL, OPTION_STDCALL_ALIASES},
{"enable-stdcall-fixup", no_argument, NULL, OPTION_ENABLE_STDCALL_FIXUP},
{"disable-stdcall-fixup", no_argument, NULL, OPTION_DISABLE_STDCALL_FIXUP},
{"out-implib", required_argument, NULL, OPTION_IMPLIB_FILENAME},
{"warn-duplicate-exports", no_argument, NULL, OPTION_WARN_DUPLICATE_EXPORTS},
/* getopt() allows abbreviations, so we do this to stop it from
treating -c as an abbreviation for these --compat-implib. */
{"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
{"compat-implib", no_argument, NULL, OPTION_IMP_COMPAT},
{"enable-auto-image-base", no_argument, NULL, OPTION_ENABLE_AUTO_IMAGE_BASE},
{"disable-auto-image-base", no_argument, NULL, OPTION_DISABLE_AUTO_IMAGE_BASE},
{"dll-search-prefix", required_argument, NULL, OPTION_DLL_SEARCH_PREFIX},
{"no-default-excludes", no_argument, NULL, OPTION_NO_DEFAULT_EXCLUDES},
{"enable-auto-import", no_argument, NULL, OPTION_DLL_ENABLE_AUTO_IMPORT},
{"disable-auto-import", no_argument, NULL, OPTION_DLL_DISABLE_AUTO_IMPORT},
{"enable-extra-pe-debug", no_argument, NULL, OPTION_ENABLE_EXTRA_PE_DEBUG},
{"enable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_ENABLE_RUNTIME_PSEUDO_RELOC},
{"disable-runtime-pseudo-reloc", no_argument, NULL, OPTION_DLL_DISABLE_RUNTIME_PSEUDO_RELOC},
#endif
{NULL, no_argument, NULL, 0}
};
{NULL, no_argument, NULL, 0}
};
*longopts = (struct option *)
xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
}
/* PE/WIN32; added routines to get the subsystem type, heap and/or stack
parameters which may be input from the command line. */
@ -512,34 +527,14 @@ set_pe_stack_heap (resname, comname)
}
static int
gld_${EMULATION_NAME}_parse_args (argc, argv)
int argc;
char **argv;
static bfd_boolean
gld${EMULATION_NAME}_handle_option (optc)
int optc;
{
int longind;
int optc;
int prevoptind = optind;
int prevopterr = opterr;
int wanterror;
static int lastoptind = -1;
if (lastoptind != optind)
opterr = 0;
wanterror = opterr;
lastoptind = optind;
optc = getopt_long_only (argc, argv, "-", longopts, &longind);
opterr = prevopterr;
switch (optc)
{
default:
if (wanterror)
xexit (1);
optind = prevoptind;
return 0;
return FALSE;
case OPTION_BASE_FILE:
link_info.base_file = (PTR) fopen (optarg, FOPEN_WB);
@ -661,7 +656,7 @@ gld_${EMULATION_NAME}_parse_args (argc, argv)
break;
#endif
}
return 1;
return TRUE;
}
@ -1968,7 +1963,9 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
gld_${EMULATION_NAME}_open_dynamic_archive,
gld_${EMULATION_NAME}_place_orphan,
gld_${EMULATION_NAME}_set_symbols,
gld_${EMULATION_NAME}_parse_args,
NULL, /* parse_args */
gld${EMULATION_NAME}_add_options,
gld${EMULATION_NAME}_handle_option,
gld_${EMULATION_NAME}_unrecognized_file,
gld_${EMULATION_NAME}_list_options,
gld_${EMULATION_NAME}_recognized_file,

View file

@ -61,10 +61,8 @@ PARSE_AND_LIST_PROLOGUE='
#define OPTION_NO_TLS_OPT 301
'
# The options are repeated below so that no abbreviations are allowed.
PARSE_AND_LIST_LONGOPTS='
{ "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
{ "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
'
PARSE_AND_LIST_OPTIONS='

View file

@ -476,16 +476,10 @@ PARSE_AND_LIST_PROLOGUE='
#define OPTION_NO_TLS_OPT (OPTION_NO_DOTSYMS + 1)
'
# The options are repeated below so that no abbreviations are allowed.
# Otherwise -s matches stub-group-size
PARSE_AND_LIST_LONGOPTS='
{ "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
{ "stub-group-size", required_argument, NULL, OPTION_STUBGROUP_SIZE },
{ "dotsyms", no_argument, NULL, OPTION_DOTSYMS },
{ "dotsyms", no_argument, NULL, OPTION_DOTSYMS },
{ "no-dotsyms", no_argument, NULL, OPTION_NO_DOTSYMS },
{ "no-dotsyms", no_argument, NULL, OPTION_NO_DOTSYMS },
{ "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
{ "no-tls-optimize", no_argument, NULL, OPTION_NO_TLS_OPT },
'

View file

@ -9,7 +9,7 @@ cat >e${EMULATION_NAME}.c <<EOF
/* This file is is generated by a shell script. DO NOT EDIT! */
/* SunOS emulation code for ${EMULATION_NAME}
Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002
Copyright 1991, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003
Free Software Foundation, Inc.
Written by Steve Chamberlain <sac@cygnus.com>
SunOS shared library support by Ian Lance Taylor <ian@cygnus.com>
@ -1047,6 +1047,8 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* place orphan */
gld${EMULATION_NAME}_set_symbols,
NULL, /* parse args */
NULL, /* add_options */
NULL, /* handle_option */
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */

View file

@ -3,7 +3,7 @@
(echo;echo;echo;echo)>e${EMULATION_NAME}.c # there, now line numbers match ;-)
cat >>e${EMULATION_NAME}.c <<EOF
/* This file is part of GLD, the Gnu Linker.
Copyright 1999, 2000, 2002 Free Software Foundation, Inc.
Copyright 1999, 2000, 2002, 2003 Free Software Foundation, Inc.
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
@ -43,18 +43,33 @@ static int coff_version;
static void gld_${EMULATION_NAME}_before_parse PARAMS ((void));
static char *gld_${EMULATION_NAME}_get_script PARAMS ((int *));
static int gld_${EMULATION_NAME}_parse_args PARAMS ((int, char **));
static void gld${EMULATION_NAME}_add_options
PARAMS ((int, char **, int, struct option **, int, struct option **));
static bfd_boolean gld${EMULATION_NAME}_handle_option PARAMS ((int));
static void gld_${EMULATION_NAME}_list_options PARAMS ((FILE *));
/* TI COFF extra command line options */
#define OPTION_COFF_FORMAT (300 + 1)
static struct option longopts[] =
static void
gld${EMULATION_NAME}_add_options (ns, shortopts, nl, longopts, nrl, really_longopts)
int ns ATTRIBUTE_UNUSED;
char **shortopts ATTRIBUTE_UNUSED;
int nl;
struct option **longopts;
int nrl ATTRIBUTE_UNUSED;
struct option **really_longopts ATTRIBUTE_UNUSED;
{
/* TI COFF options */
{"format", required_argument, NULL, OPTION_COFF_FORMAT },
{NULL, no_argument, NULL, 0}
};
static const struct option xtra_long[] = {
/* TI COFF options */
{"format", required_argument, NULL, OPTION_COFF_FORMAT },
{NULL, no_argument, NULL, 0}
};
*longopts = (struct option *)
xrealloc (*longopts, nl * sizeof (struct option) + sizeof (xtra_long));
memcpy (*longopts + nl, &xtra_long, sizeof (xtra_long));
}
static void
gld_${EMULATION_NAME}_list_options (file)
@ -63,34 +78,14 @@ gld_${EMULATION_NAME}_list_options (file)
fprintf (file, _(" --format 0|1|2 Specify which COFF version to use"));
}
static int
gld_${EMULATION_NAME}_parse_args(argc, argv)
int argc;
char **argv;
static bfd_boolean
gld${EMULATION_NAME}_handle_option (optc)
int optc;
{
int longind;
int optc;
int prevoptind = optind;
int prevopterr = opterr;
int wanterror;
static int lastoptind = -1;
if (lastoptind != optind)
opterr = 0;
wanterror = opterr;
lastoptind = optind;
optc = getopt_long_only (argc, argv, "-", longopts, &longind);
opterr = prevopterr;
switch (optc)
{
default:
if (wanterror)
xexit (1);
optind = prevoptind;
return 0;
return FALSE;
case OPTION_COFF_FORMAT:
if ((*optarg == '0' || *optarg == '1' || *optarg == '2')
@ -106,11 +101,10 @@ gld_${EMULATION_NAME}_parse_args(argc, argv)
else
{
einfo (_("%P%F: invalid COFF format version %s\n"), optarg);
}
break;
}
return 1;
return FALSE;
}
static void
@ -193,7 +187,9 @@ struct ld_emulation_xfer_struct ld_${EMULATION_NAME}_emulation =
NULL, /* open dynamic archive */
NULL, /* place orphan */
NULL, /* set_symbols */
gld_${EMULATION_NAME}_parse_args,
NULL, /* parse_args */
gld${EMULATION_NAME}_add_options,
gld${EMULATION_NAME}_handle_option,
NULL, /* unrecognized_file */
gld_${EMULATION_NAME}_list_options,
NULL, /* recognized file */

View file

@ -2,7 +2,8 @@
# It does some substitutions.
cat >e${EMULATION_NAME}.c <<EOF
/* A vanilla emulation with no defaults
Copyright 1991, 1992, 1994, 2000, 2001 Free Software Foundation, Inc.
Copyright 1991, 1992, 1994, 2000, 2001, 2002, 2003
Free Software Foundation, Inc.
Written by Steve Chamberlain steve@cygnus.com
This file is part of GLD, the Gnu Linker.
@ -79,6 +80,8 @@ struct ld_emulation_xfer_struct ld_vanilla_emulation =
NULL, /* place orphan */
NULL, /* set symbols */
NULL, /* parse args */
NULL, /* add_options */
NULL, /* handle_option */
NULL, /* unrecognized file */
NULL, /* list options */
NULL, /* recognized file */

View file

@ -133,17 +133,38 @@ ldemul_place_orphan (file, s)
return FALSE;
}
int
void
ldemul_add_options (ns, shortopts, nl, longopts, nrl, really_longopts)
int ns;
char **shortopts;
int nl;
struct option **longopts;
int nrl;
struct option **really_longopts;
{
if (ld_emulation->add_options)
(*ld_emulation->add_options) (ns, shortopts, nl, longopts,
nrl, really_longopts);
}
bfd_boolean
ldemul_handle_option (optc)
int optc;
{
if (ld_emulation->handle_option)
return (*ld_emulation->handle_option) (optc);
return FALSE;
}
bfd_boolean
ldemul_parse_args (argc, argv)
int argc;
char **argv;
{
/* Try and use the emulation parser if there is one. */
if (ld_emulation->parse_args)
{
return ld_emulation->parse_args (argc, argv);
}
return 0;
return (*ld_emulation->parse_args) (argc, argv);
return TRUE;
}
/* Let the emulation code handle an unrecognized file. */

View file

@ -51,8 +51,12 @@ extern void ldemul_create_output_section_statements
PARAMS ((void));
extern bfd_boolean ldemul_place_orphan
PARAMS ((struct lang_input_statement_struct *, asection *));
extern int ldemul_parse_args
extern bfd_boolean ldemul_parse_args
PARAMS ((int, char **));
extern void ldemul_add_options
PARAMS ((int, char **, int, struct option **, int, struct option **));
extern bfd_boolean ldemul_handle_option
PARAMS ((int));
extern bfd_boolean ldemul_unrecognized_file
PARAMS ((struct lang_input_statement_struct *));
extern bfd_boolean ldemul_recognized_file
@ -142,9 +146,18 @@ typedef struct ld_emulation_xfer_struct {
reading the script. Used to initialize symbols used in the script. */
void (*set_symbols) PARAMS ((void));
/* Run to parse args which the base linker doesn't
understand. Return non zero on sucess. */
int (*parse_args) PARAMS ((int, char **));
/* Parse args which the base linker doesn't understand.
Return TRUE on success. */
bfd_boolean (*parse_args) PARAMS ((int, char **));
/* Hook to add options to parameters passed by the base linker to
getopt_long and getopt_long_only calls. */
void (*add_options)
PARAMS ((int, char **, int, struct option **, int, struct option **));
/* Companion to the above to handle an option. Returns TRUE if it is
one of our options. */
bfd_boolean (*handle_option) PARAMS ((int));
/* Run to handle files which are not recognized as object files or
archives. Return TRUE if the file was handled. */

View file

@ -467,11 +467,17 @@ parse_args (argc, argv)
int is, il, irl;
int ingroup = 0;
char *default_dirlist = NULL;
char shortopts[OPTION_COUNT * 3 + 2];
struct option longopts[OPTION_COUNT + 1];
struct option really_longopts[OPTION_COUNT + 1];
char *shortopts;
struct option *longopts;
struct option *really_longopts;
int last_optind;
shortopts = (char *) xmalloc (OPTION_COUNT * 3 + 2);
longopts = (struct option *) xmalloc (sizeof (*longopts)
* (OPTION_COUNT + 1));
really_longopts = (struct option *) xmalloc (sizeof (*really_longopts)
* (OPTION_COUNT + 1));
/* Starting the short option string with '-' is for programs that
expect options and other ARGV-elements in any order and that care about
the ordering of the two. We describe each non-option ARGV-element
@ -516,6 +522,8 @@ parse_args (argc, argv)
longopts[il].name = NULL;
really_longopts[irl].name = NULL;
ldemul_add_options (is, &shortopts, il, &longopts, irl, &really_longopts);
/* The -G option is ambiguous on different platforms. Sometimes it
specifies the largest data size to put into the small data
section. Sometimes it is equivalent to --shared. Unfortunately,
@ -586,6 +594,9 @@ parse_args (argc, argv)
optc = getopt_long (argc, argv, "-", really_longopts, &longind);
}
if (ldemul_handle_option (optc))
continue;
if (optc == -1)
break;