* Many files: Added gettext invocations around user-visible

strings.
	* ld.h: Added gettext-related includes and defines.
	* ldmain.c: Call setlocale, bindtextdomain, textdomain.
	* acconfig.h (ENABLE_NLS, HAVE_CATGETS, HAVE_GETTEXT, HAVE_STPCPY,
	HAVE_LC_MESSAGES): Define.
	* configure.in: Call CY_GNU_GETTEXT.  Create po/Makefile.in and
	po/Makefile.  Use AM_PROG_LEX.
	(TDIRS): AC_SUBST early on, to avoid having value split when it
	happens to cross line 90 of the generated sed script.
	* Makefile.am (SUBDIRS): New macro.
	(POTFILES): Likewise.
	(po/POTFILES.in): New target.
	(ld_new_LDADD): Added INTLLIBS.
	(ld_new_DEPENDENCIES): Added INTLDEPS.
	* po/Make-in, po/POTFILES.in, po/gas.pot: New files.
This commit is contained in:
Tom Tromey
1998-04-22 06:58:37 +00:00
parent b65c61635f
commit 8bc8f4bc00
13 changed files with 2852 additions and 448 deletions

View File

@@ -1,5 +1,6 @@
/* Parse options for the GNU linker.
Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 1998
Free Software Foundation, Inc.
This file is part of GLD, the Gnu Linker.
@@ -14,8 +15,9 @@ 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 GLD; see the file COPYING. If not, write to
the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
along with GLD; see the file COPYING. If not, write to the Free
Software Foundation, 59 Temple Place - Suite 330, Boston, MA
02111-1307, USA. */
#include "bfd.h"
#include "sysdep.h"
@@ -36,6 +38,14 @@ the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307
#include "ldver.h"
#include "ldemul.h"
#ifndef PATH_SEPARATOR
#if defined (__MSDOS__) || (defined (_WIN32) && ! defined (__CYGWIN32__))
#define PATH_SEPARATOR ';'
#else
#define PATH_SEPARATOR ':'
#endif
#endif
/* Somewhere above, sys/stat.h got included . . . . */
#if !defined(S_ISDIR) && defined(S_IFDIR)
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
@@ -68,7 +78,8 @@ int parsing_defsym = 0;
#define OPTION_IGNORE (OPTION_HELP + 1)
#define OPTION_MAP (OPTION_IGNORE + 1)
#define OPTION_NO_KEEP_MEMORY (OPTION_MAP + 1)
#define OPTION_NOINHIBIT_EXEC (OPTION_NO_KEEP_MEMORY + 1)
#define OPTION_NO_WARN_MISMATCH (OPTION_NO_KEEP_MEMORY + 1)
#define OPTION_NOINHIBIT_EXEC (OPTION_NO_WARN_MISMATCH + 1)
#define OPTION_NON_SHARED (OPTION_NOINHIBIT_EXEC + 1)
#define OPTION_NO_WHOLE_ARCHIVE (OPTION_NON_SHARED + 1)
#define OPTION_OFORMAT (OPTION_NO_WHOLE_ARCHIVE + 1)
@@ -81,18 +92,21 @@ int parsing_defsym = 0;
#define OPTION_SORT_COMMON (OPTION_SONAME + 1)
#define OPTION_STATS (OPTION_SORT_COMMON + 1)
#define OPTION_SYMBOLIC (OPTION_STATS + 1)
#define OPTION_TBSS (OPTION_SYMBOLIC + 1)
#define OPTION_TASK_LINK (OPTION_SYMBOLIC + 1)
#define OPTION_TBSS (OPTION_TASK_LINK + 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_VERBOSE (OPTION_UR + 1)
#define OPTION_VERSION (OPTION_VERBOSE + 1)
#define OPTION_WARN_COMMON (OPTION_VERSION + 1)
#define OPTION_VERSION_SCRIPT (OPTION_VERSION + 1)
#define OPTION_WARN_COMMON (OPTION_VERSION_SCRIPT + 1)
#define OPTION_WARN_CONSTRUCTORS (OPTION_WARN_COMMON + 1)
#define OPTION_WARN_MULTIPLE_GP (OPTION_WARN_CONSTRUCTORS + 1)
#define OPTION_WARN_ONCE (OPTION_WARN_MULTIPLE_GP + 1)
#define OPTION_SPLIT_BY_RELOC (OPTION_WARN_ONCE + 1)
#define OPTION_WARN_SECTION_ALIGN (OPTION_WARN_ONCE + 1)
#define OPTION_SPLIT_BY_RELOC (OPTION_WARN_SECTION_ALIGN + 1)
#define OPTION_SPLIT_BY_FILE (OPTION_SPLIT_BY_RELOC + 1)
#define OPTION_WHOLE_ARCHIVE (OPTION_SPLIT_BY_FILE + 1)
#define OPTION_WRAP (OPTION_WHOLE_ARCHIVE + 1)
@@ -126,93 +140,96 @@ struct ld_option
static const struct ld_option ld_options[] =
{
{ {NULL, required_argument, NULL, '\0'},
'a', "KEYWORD", "Shared library control for HP/UX compatibility",
'a', N_("KEYWORD"), N_("Shared library control for HP/UX compatibility"),
ONE_DASH },
{ {"architecture", required_argument, NULL, 'A'},
'A', "ARCH", "Set architecture" , TWO_DASHES },
'A', N_("ARCH"), N_("Set architecture") , TWO_DASHES },
{ {"format", required_argument, NULL, 'b'},
'b', "TARGET", "Specify target for following input files", TWO_DASHES },
'b', N_("TARGET"), N_("Specify target for following input files"), TWO_DASHES },
{ {"mri-script", required_argument, NULL, 'c'},
'c', "FILE", "Read MRI format linker script", TWO_DASHES },
'c', N_("FILE"), N_("Read MRI format linker script"), TWO_DASHES },
{ {"dc", no_argument, NULL, 'd'},
'd', NULL, "Force common symbols to be defined", ONE_DASH },
'd', NULL, N_("Force common symbols to be defined"), ONE_DASH },
{ {"dp", no_argument, NULL, 'd'},
'\0', NULL, NULL, ONE_DASH },
{ {"entry", required_argument, NULL, 'e'},
'e', "ADDRESS", "Set start address", TWO_DASHES },
'e', N_("ADDRESS"), N_("Set start address"), TWO_DASHES },
{ {"export-dynamic", no_argument, NULL, OPTION_EXPORT_DYNAMIC},
'E', NULL, "Export all dynamic symbols", TWO_DASHES },
{ {NULL, optional_argument, NULL, '\0'},
'F', "[FORMAT]", "Ignored", ONE_DASH },
'E', NULL, N_("Export all dynamic symbols"), TWO_DASHES },
{ {"auxiliary", required_argument, NULL, 'f'},
'f', N_("SHLIB"), N_("Auxiliary filter for shared object symbol table"),
TWO_DASHES },
{ {"filter", required_argument, NULL, 'F'},
'F', N_("SHLIB"), N_("Filter for shared object symbol table"), TWO_DASHES },
{ {NULL, no_argument, NULL, '\0'},
'g', NULL, "Ignored", ONE_DASH },
'g', NULL, N_("Ignored"), ONE_DASH },
{ {"gpsize", required_argument, NULL, 'G'},
'G', "SIZE", "Small data size (if no size, same as --shared)",
'G', N_("SIZE"), N_("Small data size (if no size, same as --shared)"),
TWO_DASHES },
{ {"soname", required_argument, NULL, OPTION_SONAME},
'h', "FILENAME", "Set internal name of shared library", ONE_DASH },
'h', N_("FILENAME"), N_("Set internal name of shared library"), ONE_DASH },
{ {"library", required_argument, NULL, 'l'},
'l', "LIBNAME", "Search for library LIBNAME", TWO_DASHES },
'l', N_("LIBNAME"), N_("Search for library LIBNAME"), TWO_DASHES },
{ {"library-path", required_argument, NULL, 'L'},
'L', "DIRECTORY", "Add DIRECTORY to library search path", TWO_DASHES },
'L', N_("DIRECTORY"), N_("Add DIRECTORY to library search path"), TWO_DASHES },
{ {NULL, required_argument, NULL, '\0'},
'm', "EMULATION", "Set emulation", ONE_DASH },
'm', N_("EMULATION"), N_("Set emulation"), ONE_DASH },
{ {"print-map", no_argument, NULL, 'M'},
'M', NULL, "Print map file on standard output", TWO_DASHES },
'M', NULL, N_("Print map file on standard output"), TWO_DASHES },
{ {"nmagic", no_argument, NULL, 'n'},
'n', NULL, "Do not page align data", TWO_DASHES },
'n', NULL, N_("Do not page align data"), TWO_DASHES },
{ {"omagic", no_argument, NULL, 'N'},
'N', NULL, "Do not page align data, do not make text readonly",
'N', NULL, N_("Do not page align data, do not make text readonly"),
TWO_DASHES },
{ {"output", required_argument, NULL, 'o'},
'o', "FILE", "Set output file name", TWO_DASHES },
'o', N_("FILE"), N_("Set output file name"), TWO_DASHES },
{ {NULL, required_argument, NULL, '\0'},
'O', NULL, "Ignored", ONE_DASH },
'O', NULL, N_("Ignored"), ONE_DASH },
{ {"relocateable", no_argument, NULL, 'r'},
'r', NULL, "Generate relocateable output", TWO_DASHES },
'r', NULL, N_("Generate relocateable output"), TWO_DASHES },
{ {NULL, no_argument, NULL, '\0'},
'i', NULL, NULL, ONE_DASH },
{ {"just-symbols", required_argument, NULL, 'R'},
'R', "FILE", "Just link symbols (if directory, same as --rpath)",
'R', N_("FILE"), N_("Just link symbols (if directory, same as --rpath)"),
TWO_DASHES },
{ {"strip-all", no_argument, NULL, 's'},
's', NULL, "Strip all symbols", TWO_DASHES },
's', NULL, N_("Strip all symbols"), TWO_DASHES },
{ {"strip-debug", no_argument, NULL, 'S'},
'S', NULL, "Strip debugging symbols", TWO_DASHES },
'S', NULL, N_("Strip debugging symbols"), TWO_DASHES },
{ {"trace", no_argument, NULL, 't'},
't', NULL, "Trace file opens", TWO_DASHES },
't', NULL, N_("Trace file opens"), TWO_DASHES },
{ {"script", required_argument, NULL, 'T'},
'T', "FILE", "Read linker script", TWO_DASHES },
'T', N_("FILE"), N_("Read linker script"), TWO_DASHES },
{ {"undefined", required_argument, NULL, 'u'},
'u', "SYMBOL", "Start with undefined reference to SYMBOL", TWO_DASHES },
'u', N_("SYMBOL"), N_("Start with undefined reference to SYMBOL"), TWO_DASHES },
{ {"version", no_argument, NULL, OPTION_VERSION},
'v', NULL, "Print version information", TWO_DASHES },
'v', NULL, N_("Print version information"), TWO_DASHES },
{ {NULL, no_argument, NULL, '\0'},
'V', NULL, "Print version and emulation information", ONE_DASH },
'V', NULL, N_("Print version and emulation information"), ONE_DASH },
{ {"discard-all", no_argument, NULL, 'x'},
'x', NULL, "Discard all local symbols", TWO_DASHES },
'x', NULL, N_("Discard all local symbols"), TWO_DASHES },
{ {"discard-locals", no_argument, NULL, 'X'},
'X', NULL, "Discard temporary local symbols", TWO_DASHES },
'X', NULL, N_("Discard temporary local symbols"), TWO_DASHES },
{ {"trace-symbol", required_argument, NULL, 'y'},
'y', "SYMBOL", "Trace mentions of SYMBOL", TWO_DASHES },
'y', N_("SYMBOL"), N_("Trace mentions of SYMBOL"), TWO_DASHES },
{ {NULL, required_argument, NULL, '\0'},
'Y', "PATH", "Default search path for Solaris compatibility", ONE_DASH },
'Y', N_("PATH"), N_("Default search path for Solaris compatibility"), ONE_DASH },
{ {NULL, required_argument, NULL, '\0'},
'z', "KEYWORD", "Ignored for Solaris compatibility", ONE_DASH },
'z', N_("KEYWORD"), N_("Ignored for Solaris compatibility"), ONE_DASH },
{ {"start-group", no_argument, NULL, '('},
'(', NULL, "Start a group", TWO_DASHES },
'(', NULL, N_("Start a group"), TWO_DASHES },
{ {"end-group", no_argument, NULL, ')'},
')', NULL, "End a group", TWO_DASHES },
')', NULL, N_("End a group"), TWO_DASHES },
{ {"assert", required_argument, NULL, OPTION_ASSERT},
'\0', "KEYWORD", "Ignored for SunOS compatibility", ONE_DASH },
'\0', N_("KEYWORD"), N_("Ignored for SunOS compatibility"), ONE_DASH },
{ {"Bdynamic", no_argument, NULL, OPTION_CALL_SHARED},
'\0', NULL, "Link against shared libraries", ONE_DASH },
'\0', NULL, N_("Link against shared libraries"), ONE_DASH },
{ {"dy", no_argument, NULL, OPTION_CALL_SHARED},
'\0', NULL, NULL, ONE_DASH },
{ {"call_shared", no_argument, NULL, OPTION_CALL_SHARED},
'\0', NULL, NULL, ONE_DASH },
{ {"Bstatic", no_argument, NULL, OPTION_NON_SHARED},
'\0', NULL, "Do not link against shared libraries", ONE_DASH },
'\0', NULL, N_("Do not link against shared libraries"), ONE_DASH },
{ {"dn", no_argument, NULL, OPTION_NON_SHARED},
'\0', NULL, NULL, ONE_DASH },
{ {"non_shared", no_argument, NULL, OPTION_NON_SHARED},
@@ -220,92 +237,101 @@ static const struct ld_option ld_options[] =
{ {"static", no_argument, NULL, OPTION_NON_SHARED},
'\0', NULL, NULL, ONE_DASH },
{ {"Bsymbolic", no_argument, NULL, OPTION_SYMBOLIC},
'\0', NULL, "Bind global references locally", ONE_DASH },
'\0', NULL, N_("Bind global references locally"), ONE_DASH },
{ {"cref", no_argument, NULL, OPTION_CREF},
'\0', NULL, "Output cross reference table", TWO_DASHES },
'\0', NULL, N_("Output cross reference table"), TWO_DASHES },
{ {"defsym", required_argument, NULL, OPTION_DEFSYM},
'\0', "SYMBOL=EXPRESSION", "Define a symbol", TWO_DASHES },
'\0', N_("SYMBOL=EXPRESSION"), N_("Define a symbol"), TWO_DASHES },
{ {"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER},
'\0', "PROGRAM", "Set the dynamic linker to use", TWO_DASHES },
'\0', N_("PROGRAM"), N_("Set the dynamic linker to use"), TWO_DASHES },
{ {"EB", no_argument, NULL, OPTION_EB},
'\0', NULL, "Link big-endian objects", ONE_DASH },
'\0', NULL, N_("Link big-endian objects"), ONE_DASH },
{ {"EL", no_argument, NULL, OPTION_EL},
'\0', NULL, "Link little-endian objects", ONE_DASH },
'\0', NULL, N_("Link little-endian objects"), ONE_DASH },
{ {"embedded-relocs", no_argument, NULL, OPTION_EMBEDDED_RELOCS},
'\0', NULL, "Generate embedded relocs", TWO_DASHES},
'\0', NULL, N_("Generate embedded relocs"), TWO_DASHES},
{ {"force-exe-suffix", no_argument, NULL, OPTION_FORCE_EXE_SUFFIX},
'\0', NULL, "Force generation of file with .exe suffix", TWO_DASHES},
'\0', NULL, N_("Force generation of file with .exe suffix"), TWO_DASHES},
{ {"help", no_argument, NULL, OPTION_HELP},
'\0', NULL, "Print option help", TWO_DASHES },
'\0', NULL, N_("Print option help"), TWO_DASHES },
{ {"Map", required_argument, NULL, OPTION_MAP},
'\0', "FILE", "Write a map file", ONE_DASH },
'\0', N_("FILE"), N_("Write a map file"), ONE_DASH },
{ {"no-keep-memory", no_argument, NULL, OPTION_NO_KEEP_MEMORY},
'\0', NULL, "Use less memory and more disk I/O", TWO_DASHES },
'\0', NULL, N_("Use less memory and more disk I/O"), TWO_DASHES },
{ {"no-warn-mismatch", no_argument, NULL, OPTION_NO_WARN_MISMATCH},
'\0', NULL, N_("Don't warn about mismatched input files"), TWO_DASHES},
{ {"no-whole-archive", no_argument, NULL, OPTION_NO_WHOLE_ARCHIVE},
'\0', NULL, "Turn off --whole-archive", TWO_DASHES },
'\0', NULL, N_("Turn off --whole-archive"), TWO_DASHES },
{ {"noinhibit-exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC},
'\0', NULL, "Create an output file even if errors occur", TWO_DASHES },
'\0', NULL, N_("Create an output file even if errors occur"), TWO_DASHES },
{ {"noinhibit_exec", no_argument, NULL, OPTION_NOINHIBIT_EXEC},
'\0', NULL, NULL, NO_HELP },
{ {"oformat", required_argument, NULL, OPTION_OFORMAT},
'\0', "TARGET", "Specify target of output file", TWO_DASHES },
'\0', N_("TARGET"), N_("Specify target of output file"), TWO_DASHES },
{ {"qmagic", no_argument, NULL, OPTION_IGNORE},
'\0', NULL, "Ignored for Linux compatibility", ONE_DASH },
'\0', NULL, N_("Ignored for Linux compatibility"), ONE_DASH },
{ {"Qy", no_argument, NULL, OPTION_IGNORE},
'\0', NULL, "Ignored for SVR4 compatibility", ONE_DASH },
'\0', NULL, N_("Ignored for SVR4 compatibility"), ONE_DASH },
{ {"relax", no_argument, NULL, OPTION_RELAX},
'\0', NULL, "Relax branches on certain targets", TWO_DASHES },
'\0', NULL, N_("Relax branches on certain targets"), TWO_DASHES },
{ {"retain-symbols-file", required_argument, NULL,
OPTION_RETAIN_SYMBOLS_FILE},
'\0', "FILE", "Keep only symbols listed in FILE", TWO_DASHES },
'\0', N_("FILE"), N_("Keep only symbols listed in FILE"), TWO_DASHES },
{ {"rpath", required_argument, NULL, OPTION_RPATH},
'\0', "PATH", "Set runtime shared library search path", ONE_DASH },
'\0', N_("PATH"), N_("Set runtime shared library search path"), ONE_DASH },
{ {"rpath-link", required_argument, NULL, OPTION_RPATH_LINK},
'\0', "PATH", "Set link time shared library search path", ONE_DASH },
'\0', N_("PATH"), N_("Set link time shared library search path"), ONE_DASH },
{ {"shared", no_argument, NULL, OPTION_SHARED},
'\0', NULL, "Create a shared library", ONE_DASH },
'\0', NULL, N_("Create a shared library"), ONE_DASH },
{ {"Bshareable", no_argument, NULL, OPTION_SHARED }, /* FreeBSD. */
'\0', NULL, NULL, ONE_DASH },
{ {"sort-common", no_argument, NULL, OPTION_SORT_COMMON},
'\0', NULL, "Sort common symbols by size", TWO_DASHES },
'\0', NULL, N_("Sort common symbols by size"), TWO_DASHES },
{ {"sort_common", no_argument, NULL, OPTION_SORT_COMMON},
'\0', NULL, NULL, NO_HELP },
{ {"split-by-file", no_argument, NULL, OPTION_SPLIT_BY_FILE},
'\0', NULL, "Split output sections for each file", TWO_DASHES },
'\0', NULL, N_("Split output sections for each file"), TWO_DASHES },
{ {"split-by-reloc", required_argument, NULL, OPTION_SPLIT_BY_RELOC},
'\0', "COUNT", "Split output sections every COUNT relocs", TWO_DASHES },
'\0', N_("COUNT"), N_("Split output sections every COUNT relocs"), TWO_DASHES },
{ {"stats", no_argument, NULL, OPTION_STATS},
'\0', NULL, "Print memory usage statistics", TWO_DASHES },
'\0', NULL, N_("Print memory usage statistics"), TWO_DASHES },
{ {"task-link", required_argument, NULL, OPTION_TASK_LINK},
'\0', N_("SYMBOL"), N_("Do task level linking"), TWO_DASHES },
{ {"traditional-format", no_argument, NULL, OPTION_TRADITIONAL_FORMAT},
'\0', NULL, "Use same format as native linker", TWO_DASHES },
'\0', NULL, N_("Use same format as native linker"), TWO_DASHES },
{ {"Tbss", required_argument, NULL, OPTION_TBSS},
'\0', "ADDRESS", "Set address of .bss section", ONE_DASH },
'\0', N_("ADDRESS"), N_("Set address of .bss section"), ONE_DASH },
{ {"Tdata", required_argument, NULL, OPTION_TDATA},
'\0', "ADDRESS", "Set address of .data section", ONE_DASH },
'\0', N_("ADDRESS"), N_("Set address of .data section"), ONE_DASH },
{ {"Ttext", required_argument, NULL, OPTION_TTEXT},
'\0', "ADDRESS", "Set address of .text section", ONE_DASH },
'\0', N_("ADDRESS"), N_("Set address of .text section"), ONE_DASH },
{ {"Ur", no_argument, NULL, OPTION_UR},
'\0', NULL, "Build global constructor/destructor tables", ONE_DASH },
'\0', NULL, N_("Build global constructor/destructor tables"), ONE_DASH },
{ {"verbose", no_argument, NULL, OPTION_VERBOSE},
'\0', NULL, "Output lots of information during link", TWO_DASHES },
'\0', NULL, N_("Output lots of information during link"), TWO_DASHES },
{ {"dll-verbose", no_argument, NULL, OPTION_VERBOSE}, /* Linux. */
'\0', NULL, NULL, NO_HELP },
{ {"version-script", required_argument, NULL, OPTION_VERSION_SCRIPT },
'\0', N_("FILE"), N_("Read version information script"), TWO_DASHES },
{ {"warn-common", no_argument, NULL, OPTION_WARN_COMMON},
'\0', NULL, "Warn about duplicate common symbols", TWO_DASHES },
'\0', NULL, N_("Warn about duplicate common symbols"), TWO_DASHES },
{ {"warn-constructors", no_argument, NULL, OPTION_WARN_CONSTRUCTORS},
'\0', NULL, "Warn if global constructors/destructors are seen",
'\0', NULL, N_("Warn if global constructors/destructors are seen"),
TWO_DASHES },
{ {"warn-multiple-gp", no_argument, NULL, OPTION_WARN_MULTIPLE_GP},
'\0', NULL, "Warn if the multiple GP values are used", TWO_DASHES },
'\0', NULL, N_("Warn if the multiple GP values are used"), TWO_DASHES },
{ {"warn-once", no_argument, NULL, OPTION_WARN_ONCE},
'\0', NULL, "Warn only once per undefined symbol", TWO_DASHES },
'\0', NULL, N_("Warn only once per undefined symbol"), TWO_DASHES },
{ {"warn-section-align", no_argument, NULL, OPTION_WARN_SECTION_ALIGN},
'\0', NULL, N_("Warn if start of section changes due to alignment"),
TWO_DASHES },
{ {"whole-archive", no_argument, NULL, OPTION_WHOLE_ARCHIVE},
'\0', NULL, "Include all objects from following archives", TWO_DASHES },
'\0', NULL, N_("Include all objects from following archives"), TWO_DASHES },
{ {"wrap", required_argument, NULL, OPTION_WRAP},
'\0', "SYMBOL", "Use wrapper functions for SYMBOL", TWO_DASHES }
'\0', N_("SYMBOL"), N_("Use wrapper functions for SYMBOL"), TWO_DASHES }
};
#define OPTION_COUNT (sizeof ld_options / sizeof ld_options[0])
#define OPTION_COUNT ((int) (sizeof ld_options / sizeof ld_options[0]))
void
parse_args (argc, argv)
@@ -317,6 +343,7 @@ parse_args (argc, argv)
char *default_dirlist = NULL;
char shortopts[OPTION_COUNT * 3 + 2];
struct option longopts[OPTION_COUNT + 1];
int last_optind;
/* Starting the short option string with '-' is for programs that
expect options and other ARGV-elements in any order and that care about
@@ -366,9 +393,10 @@ parse_args (argc, argv)
for (i = 1; i < argc; i++)
if (strcmp (argv[i], "-G") == 0
&& (i + 1 >= argc
|| ! isdigit (argv[i + 1][0])))
|| ! isdigit ((unsigned char) argv[i + 1][0])))
argv[i] = (char *) "--shared";
last_optind = -1;
while (1)
{
/* getopt_long_only is like getopt_long, but '-' as well as '--' can
@@ -376,8 +404,18 @@ parse_args (argc, argv)
int longind;
int optc;
if (ldemul_parse_args (argc, argv))
continue;
/* Using last_optind lets us avoid calling ldemul_parse_args
multiple times on a single option, which would lead to
confusion in the internal static variables maintained by
getopt. This could otherwise happen for an argument like
-nx, in which the -n is parsed as a single option, and we
loop around to pick up the -x. */
if (optind != last_optind)
{
if (ldemul_parse_args (argc, argv))
continue;
last_optind = optind;
}
optc = getopt_long_only (argc, argv, shortopts, longopts, &longind);
@@ -404,7 +442,7 @@ parse_args (argc, argv)
|| strcmp (optarg, "default") == 0)
config.dynamic_link = true;
else
einfo ("%P%F: unrecognized -a option `%s'\n", optarg);
einfo (_("%P%F: unrecognized -a option `%s'\n"), optarg);
break;
case OPTION_ASSERT:
/* FIXME: We just ignore these, but we should handle them. */
@@ -417,7 +455,7 @@ parse_args (argc, argv)
else if (strcmp (optarg, "pure-text") == 0)
;
else
einfo ("%P%F: unrecognized -assert option `%s'\n", optarg);
einfo (_("%P%F: unrecognized -assert option `%s'\n"), optarg);
break;
case 'A':
ldfile_add_arch (optarg);
@@ -471,8 +509,31 @@ parse_args (argc, argv)
case 'e':
lang_add_entry (optarg, true);
break;
case 'f':
if (command_line.auxiliary_filters == NULL)
{
command_line.auxiliary_filters =
(char **) xmalloc (2 * sizeof (char *));
command_line.auxiliary_filters[0] = optarg;
command_line.auxiliary_filters[1] = NULL;
}
else
{
int c;
char **p;
c = 0;
for (p = command_line.auxiliary_filters; *p != NULL; p++)
++c;
command_line.auxiliary_filters =
(char **) xrealloc (command_line.auxiliary_filters,
(c + 2) * sizeof (char *));
command_line.auxiliary_filters[c] = optarg;
command_line.auxiliary_filters[c + 1] = NULL;
}
break;
case 'F':
/* Ignore. */
command_line.filter_shlib = optarg;
break;
case OPTION_FORCE_EXE_SUFFIX:
command_line.force_exe_suffix = true;
@@ -482,7 +543,7 @@ parse_args (argc, argv)
char *end;
g_switch_value = strtoul (optarg, &end, 0);
if (*end)
einfo ("%P%F: invalid number `%s'\n", optarg);
einfo (_("%P%F: invalid number `%s'\n"), optarg);
}
break;
case 'g':
@@ -520,6 +581,9 @@ parse_args (argc, argv)
case OPTION_NO_KEEP_MEMORY:
link_info.keep_memory = false;
break;
case OPTION_NO_WARN_MISMATCH:
command_line.warn_mismatch = false;
break;
case OPTION_NOINHIBIT_EXEC:
force_make_executable = true;
break;
@@ -646,6 +710,9 @@ parse_args (argc, argv)
case OPTION_TRADITIONAL_FORMAT:
link_info.traditional_format = true;
break;
case OPTION_TASK_LINK:
link_info.task_link = true;
/* Fall through - do an implied -r option. */
case OPTION_UR:
link_info.relocateable = true;
config.build_constructors = true;
@@ -672,14 +739,14 @@ parse_args (argc, argv)
case OPTION_VERSION:
/* This output is intended to follow the GNU standards document. */
printf ("GNU ld %s\n", ld_program_version);
printf ("Copyright 1996 Free Software Foundation, Inc.\n");
printf ("\
printf (_("Copyright 1997 Free Software Foundation, Inc.\n"));
printf (_("\
This program is free software; you may redistribute it under the terms of\n\
the GNU General Public License. This program has absolutely no warranty.\n");
the GNU General Public License. This program has absolutely no warranty.\n"));
{
ld_emulation_xfer_type **ptr = ld_emulations;
printf (" Supported emulations:\n");
printf (_(" Supported emulations:\n"));
while (*ptr)
{
printf (" %s\n", (*ptr)->emulation_name);
@@ -688,6 +755,20 @@ the GNU General Public License. This program has absolutely no warranty.\n");
}
xexit (0);
break;
case OPTION_VERSION_SCRIPT:
/* This option indicates a small script that only specifies
version information. Read it, but don't assume that
we've seen a linker script. */
{
boolean hold_had_script;
hold_had_script = had_script;
ldfile_open_command_file (optarg);
had_script = hold_had_script;
parser_input = input_version_script;
yyparse ();
}
break;
case OPTION_WARN_COMMON:
config.warn_common = true;
break;
@@ -700,6 +781,9 @@ the GNU General Public License. This program has absolutely no warranty.\n");
case OPTION_WARN_ONCE:
config.warn_once = true;
break;
case OPTION_WARN_SECTION_ALIGN:
config.warn_section_align = true;
break;
case OPTION_WHOLE_ARCHIVE:
whole_archive = true;
break;
@@ -735,7 +819,7 @@ the GNU General Public License. This program has absolutely no warranty.\n");
if (ingroup)
{
fprintf (stderr,
"%s: may not nest groups (--help for usage)\n",
_("%s: may not nest groups (--help for usage)\n"),
program_name);
xexit (1);
}
@@ -746,7 +830,7 @@ the GNU General Public License. This program has absolutely no warranty.\n");
if (! ingroup)
{
fprintf (stderr,
"%s: group ended before it began (--help for usage)\n",
_("%s: group ended before it began (--help for usage)\n"),
program_name);
xexit (1);
}
@@ -776,7 +860,7 @@ set_default_dirlist (dirlist_ptr)
while (1)
{
p = strchr (dirlist_ptr, ':');
p = strchr (dirlist_ptr, PATH_SEPARATOR);
if (p != NULL)
*p = '\0';
if (*dirlist_ptr != '\0')
@@ -794,7 +878,7 @@ set_section_start (sect, valstr)
char *end;
unsigned long val = strtoul (valstr, &end, 16);
if (*end)
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));
}
@@ -806,9 +890,9 @@ help ()
int i;
const char **targets, **pp;
printf ("Usage: %s [options] file...\n", program_name);
printf (_("Usage: %s [options] file...\n"), program_name);
printf ("Options:\n");
printf (_("Options:\n"));
for (i = 0; i < OPTION_COUNT; i++)
{
if (ld_options[i].doc != NULL)
@@ -837,8 +921,8 @@ help ()
printf (" ");
++len;
}
printf ("%s", ld_options[j].arg);
len += strlen (ld_options[j].arg);
printf ("%s", _(ld_options[j].arg));
len += strlen (_(ld_options[j].arg));
}
comma = true;
}
@@ -862,8 +946,8 @@ help ()
+ strlen (ld_options[j].opt.name));
if (ld_options[j].arg != NULL)
{
printf (" %s", ld_options[j].arg);
len += 1 + strlen (ld_options[j].arg);
printf (" %s", _(ld_options[j].arg));
len += 1 + strlen (_(ld_options[j].arg));
}
comma = true;
}
@@ -880,19 +964,19 @@ help ()
for (; len < 30; len++)
putchar (' ');
printf ("%s\n", ld_options[i].doc);
printf ("%s\n", _(ld_options[i].doc));
}
}
printf ("%s: supported targets:", program_name);
printf (_("%s: supported targets:"), program_name);
targets = bfd_target_list ();
for (pp = targets; *pp != NULL; pp++)
printf (" %s", *pp);
free (targets);
printf ("\n");
printf ("%s: supported emulations: ", program_name);
printf (_("%s: supported emulations: "), program_name);
ldemul_list_emulations (stdout);
printf ("\n");
printf ("\nReport bugs to bug-gnu-utils@prep.ai.mit.edu\n");
printf (_("\nReport bugs to bug-gnu-utils@gnu.org\n"));
}