Use getopt instead of lex and yacc to parse the command line.
* ld.texinfo (Options): Document changes to option syntax. * Makefile.in: Update dependencies. * ldver.c (help): Tweak dashes in usage message. * ldgram.y (%union): Remove unused members. Remove %tokens for command line options; add ones for input types. (command_line): Rules removed. (file): Instead of command line, recognize an input type indicator, then use the nonterminal for that type. (defsym_expr): New nonterminal from code formerly in command_line. * ldlex.h: Declare parser input type enum and variable. Don't declare parse_line. * ldlex.l: Remove unused variables. Make some used ones static and comment them. (COMMAND): Start state and its rules removed. At start of yylex, return input state token if at start of input. (lex_redirect): Don't need to set yyout. (ldlex_command): Function removed. * ldmain.c (main): Instead of calling parse_line, set up the redirections and call yyparse directly. * ldmisc.c (vfinfo): If there's no input filename, print nothing, not "command line". * lexsup.c: Remove #if 0'd code. (parse_line): Function removed. (parse_args): Rewrite to use getopt_long_only. (set_default_dirlist): New function from code formerly in ldgram.y:command_line. (set_section_start): New function. * emultempl/generic.em, emultempl/gld960.em, emultempl/hppaelf.em, emultempl/lnk960.em, emultempl/m88kbcs.em: Don't enclose compiled-in link scripts in "{" and "}", as the grammar no longer wants them to be.
This commit is contained in:
parent
b4f6f3c114
commit
d4e5e3c330
10 changed files with 731 additions and 850 deletions
41
ld/ChangeLog
41
ld/ChangeLog
|
@ -1,3 +1,44 @@
|
|||
Thu Feb 24 12:27:07 1994 David J. Mackenzie (djm@rtl.cygnus.com)
|
||||
|
||||
Use getopt instead of lex and yacc to parse the command line.
|
||||
|
||||
* ld.texinfo (Options): Document changes to option syntax.
|
||||
* Makefile.in: Update dependencies.
|
||||
* ldver.c (help): Tweak dashes in usage message.
|
||||
* ldgram.y (%union): Remove unused members.
|
||||
Remove %tokens for command line options; add ones for input types.
|
||||
(command_line): Rules removed.
|
||||
(file): Instead of command line, recognize an
|
||||
input type indicator, then use the nonterminal for that type.
|
||||
(defsym_expr): New nonterminal from code formerly in command_line.
|
||||
* ldlex.h: Declare parser input type enum and variable.
|
||||
Don't declare parse_line.
|
||||
* ldlex.l: Remove unused variables. Make some used ones static
|
||||
and comment them.
|
||||
(COMMAND): Start state and its rules removed.
|
||||
At start of yylex, return input state token if at start of input.
|
||||
(lex_redirect): Don't need to set yyout.
|
||||
(ldlex_command): Function removed.
|
||||
* ldmain.c (main): Instead of calling parse_line, set up the
|
||||
redirections and call yyparse directly.
|
||||
* ldmisc.c (vfinfo): If there's no input filename, print nothing, not
|
||||
"command line".
|
||||
* lexsup.c: Remove #if 0'd code.
|
||||
(parse_line): Function removed.
|
||||
(parse_args): Rewrite to use getopt_long_only.
|
||||
(set_default_dirlist): New function from code formerly in
|
||||
ldgram.y:command_line.
|
||||
(set_section_start): New function.
|
||||
* emultempl/generic.em, emultempl/gld960.em, emultempl/hppaelf.em,
|
||||
emultempl/lnk960.em, emultempl/m88kbcs.em: Don't enclose
|
||||
compiled-in link scripts in "{" and "}", as the grammar no longer
|
||||
wants them to be.
|
||||
|
||||
Thu Feb 24 08:43:26 1994 Ken Raeburn (raeburn@rtl.cygnus.com)
|
||||
|
||||
* Makefile.in (ld.dvi): Depend on configdoc.texi, but don't
|
||||
require that it be in $(srcdir).
|
||||
|
||||
Tue Feb 22 09:21:18 1994 Ian Lance Taylor (ian@cygnus.com)
|
||||
|
||||
* ldlang.c (lang_size_sections): Only align section to alignment
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# Makefile for the GNU linker ld (version 2)
|
||||
# Copyright (C) 1989, 90, 91, 92, 93, 1994 Free Software Foundation, Inc.
|
||||
|
||||
# This file is part of GNU ld..
|
||||
# This file is part of GNU ld.
|
||||
|
||||
# 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
|
||||
|
@ -496,7 +496,7 @@ configdoc.texi: ${DOCVER}-doc.texi
|
|||
|
||||
# TeX output
|
||||
dvi: ld.dvi
|
||||
ld.dvi: $(srcdir)/ld.texinfo $(srcdir)/configdoc.texi $(BFDDIR)/doc/bfdsumm.texi
|
||||
ld.dvi: $(srcdir)/ld.texinfo configdoc.texi $(BFDDIR)/doc/bfdsumm.texi
|
||||
TEXINPUTS=$(BFDDIR)/doc:$$TEXINPUTS $(TEXI2DVI) $(srcdir)/ld.texinfo
|
||||
|
||||
ldint.dvi: $(srcdir)/ldint.texinfo
|
||||
|
@ -735,7 +735,7 @@ ldexp.o : ldexp.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
|||
ldgram.h ldlang.h
|
||||
ldfile.o : ldfile.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
||||
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
|
||||
ld.h ldmisc.h ldexp.h ldlang.h ldfile.h ldmain.h ldlex.h
|
||||
ld.h ldmisc.h ldexp.h ldlang.h ldfile.h ldmain.h ldgram.h ldlex.h
|
||||
ldlang.o : ldlang.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
||||
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
|
||||
$(INCDIR)/bfdlink.h ld.h ldmain.h ldgram.h ldexp.h \
|
||||
|
@ -747,7 +747,7 @@ ldmain.o : ldmain.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
|||
ldfile.h ldctor.h
|
||||
ldmisc.o : ldmisc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
||||
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
|
||||
ld.h ldmisc.h ldexp.h ldlang.h ldlex.h ldmain.h ldfile.h
|
||||
ld.h ldmisc.h ldexp.h ldlang.h ldgram.h ldlex.h ldmain.h ldfile.h
|
||||
ldver.o : ldver.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
||||
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
|
||||
ld.h ldver.h ldemul.h ldmain.h
|
||||
|
@ -757,7 +757,8 @@ ldwrite.o : ldwrite.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
|||
ldmisc.h ldgram.h ldmain.h
|
||||
lexsup.o : lexsup.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
||||
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
|
||||
ldlex.h ld.h ldexp.h ldgram.h ldmisc.h
|
||||
$(INCDIR)/getopt.h $(INCDIR)/bfdlink.h config.h \
|
||||
ldgram.h ldlex.h ld.h ldexp.h ldgram.h ldmisc.h ldmain.h ldfile.h
|
||||
mri.o : mri.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/obstack.h \
|
||||
../bfd/sysdep.h $(INCDIR)/fopen-same.h ld.h ldexp.h \
|
||||
ldlang.h ldmisc.h mri.h ldgram.h
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
# This shell script emits a C file. -*- C -*-
|
||||
# It does some substitutions.
|
||||
cat >em_${EMULATION_NAME}.c <<EOF
|
||||
/* An emulation for HP PA-RISC OSF/1 linkers.
|
||||
/* An emulation for HP PA-RISC ELF linkers.
|
||||
Copyright (C) 1991, 1993 Free Software Foundation, Inc.
|
||||
Written by Steve Chamberlain steve@cygnus.com
|
||||
|
||||
|
@ -35,7 +35,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
#include "ldmain.h"
|
||||
#include "ldctor.h"
|
||||
|
||||
static void hppaosf_before_parse()
|
||||
static void hppaelf_before_parse()
|
||||
{
|
||||
link_info.lprefix = "L$";
|
||||
link_info.lprefix_len = 2;
|
||||
|
@ -48,7 +48,7 @@ static lang_input_statement_type *stub_file = 0;
|
|||
static lang_input_section_type *stub_input_section = NULL;
|
||||
|
||||
static void
|
||||
hppaosf_search_for_padding_statements(s,prev)
|
||||
hppaelf_search_for_padding_statements(s,prev)
|
||||
lang_statement_union_type *s;
|
||||
lang_statement_union_type **prev;
|
||||
{
|
||||
|
@ -58,14 +58,14 @@ hppaosf_search_for_padding_statements(s,prev)
|
|||
switch (s->header.type)
|
||||
{
|
||||
case lang_constructors_statement_enum:
|
||||
hppaosf_search_for_padding_statements (constructor_list.head,&constructor_list.head);
|
||||
hppaelf_search_for_padding_statements (constructor_list.head,&constructor_list.head);
|
||||
break;
|
||||
case lang_output_section_statement_enum:
|
||||
hppaosf_search_for_padding_statements
|
||||
hppaelf_search_for_padding_statements
|
||||
(s->output_section_statement.children.head,&s->output_section_statement.children.head);
|
||||
break;
|
||||
case lang_wild_statement_enum:
|
||||
hppaosf_search_for_padding_statements
|
||||
hppaelf_search_for_padding_statements
|
||||
(s->wild_statement.children.head,&s->wild_statement.children.head);
|
||||
break;
|
||||
case lang_data_statement_enum:
|
||||
|
@ -96,7 +96,7 @@ hppaosf_search_for_padding_statements(s,prev)
|
|||
}
|
||||
|
||||
static void
|
||||
hppaosf_finish()
|
||||
hppaelf_finish()
|
||||
{
|
||||
extern asymbol *hppa_look_for_stubs_in_section();
|
||||
|
||||
|
@ -151,12 +151,12 @@ hppaosf_finish()
|
|||
|
||||
/* If we've added stubs,remove the padding_statements because */
|
||||
/* they are no longer valid */
|
||||
hppaosf_search_for_padding_statements(stat_ptr->head,&(stat_ptr->head));
|
||||
hppaelf_search_for_padding_statements(stat_ptr->head,&(stat_ptr->head));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
hppaosf_create_output_section_statements()
|
||||
hppaelf_create_output_section_statements()
|
||||
{
|
||||
asection *stub_sec;
|
||||
asection *output_text_sec = bfd_make_section_old_way(output_bfd,".text");
|
||||
|
@ -215,7 +215,7 @@ hppaosf_create_output_section_statements()
|
|||
}
|
||||
|
||||
static void
|
||||
hppaosf_set_output_arch()
|
||||
hppaelf_set_output_arch()
|
||||
{
|
||||
/* Set the output architecture and machine if possible */
|
||||
unsigned long machine = 0;
|
||||
|
@ -223,7 +223,7 @@ hppaosf_set_output_arch()
|
|||
}
|
||||
|
||||
static char *
|
||||
hppaosf_get_script(isfile)
|
||||
hppaelf_get_script(isfile)
|
||||
int *isfile;
|
||||
EOF
|
||||
|
||||
|
@ -234,8 +234,8 @@ then
|
|||
# sed commands to quote an ld script as a C string.
|
||||
sc='s/["\\]/\\&/g
|
||||
s/$/\\n\\/
|
||||
1s/^/"{/
|
||||
$s/$/n}"/
|
||||
1s/^/"/
|
||||
$s/$/n"/
|
||||
'
|
||||
|
||||
cat >>em_${EMULATION_NAME}.c <<EOF
|
||||
|
@ -279,20 +279,20 @@ fi
|
|||
|
||||
cat >>em_${EMULATION_NAME}.c <<EOF
|
||||
|
||||
struct ld_emulation_xfer_struct ld_hppaosf_emulation =
|
||||
struct ld_emulation_xfer_struct ld_hppaelf_emulation =
|
||||
{
|
||||
hppaosf_before_parse,
|
||||
hppaelf_before_parse,
|
||||
syslib_default,
|
||||
hll_default,
|
||||
after_parse_default,
|
||||
after_allocation_default,
|
||||
hppaosf_set_output_arch,
|
||||
hppaelf_set_output_arch,
|
||||
ldemul_default_target,
|
||||
before_allocation_default,
|
||||
hppaosf_get_script,
|
||||
"hppaosf",
|
||||
hppaelf_get_script,
|
||||
"hppaelf",
|
||||
"elf32-hppa",
|
||||
hppaosf_finish,
|
||||
hppaosf_create_output_section_statements
|
||||
hppaelf_finish,
|
||||
hppaelf_create_output_section_statements
|
||||
};
|
||||
EOF
|
||||
|
|
|
@ -57,8 +57,8 @@ then
|
|||
# sed commands to quote an ld script as a C string.
|
||||
sc='s/["\\]/\\&/g
|
||||
s/$/\\n\\/
|
||||
1s/^/"{/
|
||||
$s/$/n}"/
|
||||
1s/^/"/
|
||||
$s/$/n"/
|
||||
'
|
||||
|
||||
cat >>em_${EMULATION_NAME}.c <<EOF
|
||||
|
|
461
ld/ld.texinfo
461
ld/ld.texinfo
|
@ -17,7 +17,7 @@ END-INFO-DIR-ENTRY
|
|||
@ifinfo
|
||||
This file documents the GNU linker LD.
|
||||
|
||||
Copyright (C) 1991, 1992, 1993 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
|
@ -48,7 +48,7 @@ notice identical to this one except for the removal of this paragraph
|
|||
@subtitle The GNU linker
|
||||
@sp 1
|
||||
@subtitle @code{ld} version 2
|
||||
@subtitle March 1993
|
||||
@subtitle January 1994
|
||||
@author Steve Chamberlain and Roland Pesch
|
||||
@author Cygnus Support
|
||||
@page
|
||||
|
@ -58,13 +58,14 @@ notice identical to this one except for the removal of this paragraph
|
|||
\hfill Cygnus Support\par
|
||||
\hfill steve\@cygnus.com, pesch\@cygnus.com\par
|
||||
\hfill {\it Using LD, the GNU linker}\par
|
||||
\hfill Edited by Jeffrey Osier (jeffrey\@cygnus.com), March 1993.\par
|
||||
\hfill Edited by Jeffrey Osier (jeffrey\@cygnus.com)\par
|
||||
\hfill and Roland Pesch (pesch\@cygnus.com)\par
|
||||
}
|
||||
\global\parindent=0pt % Steve likes it this way.
|
||||
@end tex
|
||||
|
||||
@vskip 0pt plus 1filll
|
||||
Copyright @copyright{} 1991, 1992, 1993 Free Software Foundation, Inc.
|
||||
Copyright @copyright{} 1991, 1992, 1993, 1994 Free Software Foundation, Inc.
|
||||
|
||||
Permission is granted to make and distribute verbatim copies of
|
||||
this manual provided the copyright notice and this permission notice
|
||||
|
@ -129,8 +130,7 @@ This version of @code{ld} uses the general purpose BFD libraries
|
|||
to operate on object files. This allows @code{ld} to read, combine, and
|
||||
write object files in many different formats---for example, COFF or
|
||||
@code{a.out}. Different formats may be linked together to produce any
|
||||
available kind of object file. @xref{BFD} for a list of formats
|
||||
supported on various architectures.
|
||||
available kind of object file. @xref{BFD}, for more information.
|
||||
@end ifclear
|
||||
|
||||
Aside from its flexibility, the GNU linker is more helpful than other
|
||||
|
@ -168,15 +168,15 @@ ld [ -o @var{output} ] @var{objfile}@dots{}
|
|||
[ -c @var{MRI-commandfile} ] [ -d | -dc | -dp ]
|
||||
[ -defsym @var{symbol}=@var{expression} ]
|
||||
[ -e @var{entry} ] [ -F ] [ -F @var{format} ]
|
||||
[ -format @var{input-format} ] [ -g ] [ -G @var{size} ] [ --help ] [ -i ]
|
||||
[ -l@var{archive} ] [ -L@var{searchdir} ] [ -M ] [ -Map @var{mapfile} ]
|
||||
[ -m @var{emulation} ] [ -N | -n ] [ -noinhibit-exec ]
|
||||
[ -oformat @var{output-format} ] [ -R @var{filename} ] [ -relax ]
|
||||
[ -retain-symbols-file @var{filename} ]
|
||||
[ -format @var{input-format} ] [ -g ] [ -G @var{size} ] [ -help ]
|
||||
[ -i ] [ -l@var{archive} ] [ -L@var{searchdir} ] [ -M ]
|
||||
[ -Map @var{mapfile} ] [ -m @var{emulation} ] [ -N | -n ]
|
||||
[ -noinhibit-exec ] [ -oformat @var{output-format} ]
|
||||
[ -R @var{filename} ] [ -relax ] [ -retain-symbols-file @var{filename} ]
|
||||
[ -r | -Ur ] [ -S ] [ -s ] [ -sort-common ] [ -stats ]
|
||||
[ -T @var{commandfile} ]
|
||||
[ -Ttext @var{org} ] [ -Tdata @var{org} ]
|
||||
[ -Tbss @var{org} ] [ -t ] [ -u @var{symbol}] [-V] [-v] [ --version ]
|
||||
[ -Tbss @var{org} ] [ -t ] [ -u @var{symbol}] [-V] [-v] [ -version ]
|
||||
[ -warn-common ] [ -y @var{symbol} ] [ -X ] [-x ]
|
||||
@end smallexample
|
||||
|
||||
|
@ -224,10 +224,20 @@ and the script command language. If @emph{no} binary input files at all
|
|||
are specified, the linker does not produce any output, and issues the
|
||||
message @samp{No input files}.
|
||||
|
||||
Option arguments must either follow the option letter without intervening
|
||||
For options whose names are a single letter,
|
||||
option arguments must either follow the option letter without intervening
|
||||
whitespace, or be given as separate arguments immediately following the
|
||||
option that requires them.
|
||||
|
||||
For options whose names are multiple letters, either one dash or two can
|
||||
precede the option name; for example, @samp{--oformat} and
|
||||
@samp{-oformat} are equivalent. Arguments to multiple-letter options
|
||||
must either be separated from the option name by an equals sign, or be
|
||||
given as separate arguments immediately following the option that
|
||||
requires them. For example, @samp{--oformat srec} and
|
||||
@samp{--oformat=srec} are equivalent. Unique abbreviations of the names
|
||||
of multiple-letter options are accepted.
|
||||
|
||||
@table @code
|
||||
@ifset I960
|
||||
@cindex architectures
|
||||
|
@ -361,14 +371,11 @@ Ignored. Provided for compatibility with other tools.
|
|||
Set the maximum size of objects to be optimized using the GP register to
|
||||
@var{size} under MIPS ECOFF. Ignored for other object file formats.
|
||||
|
||||
@item --help
|
||||
@kindex --help
|
||||
@cindex help
|
||||
@cindex usage
|
||||
@kindex -help
|
||||
@item -help
|
||||
Print a summary of the command-line options on the standard output and exit.
|
||||
This option and @samp{--version} begin with two dashes instead of one
|
||||
for compatibility with other GNU programs. The other options start with
|
||||
only one dash for compatibility with other linkers.
|
||||
|
||||
@kindex -i
|
||||
@cindex incremental link
|
||||
|
@ -430,10 +437,10 @@ Set the text and data sections to be readable and writable. Also, do
|
|||
not page-align the data segment. If the output format supports Unix
|
||||
style magic numbers, mark the output as @code{OMAGIC}.
|
||||
|
||||
@item -n
|
||||
@kindex -n
|
||||
@cindex read-only text
|
||||
@kindex NMAGIC
|
||||
@item -n
|
||||
Set the text segment to be read only, and mark the output as
|
||||
@code{NMAGIC} if possible.
|
||||
|
||||
|
@ -476,10 +483,10 @@ relocate it or include it in the output. This allows your output file
|
|||
to refer symbolically to absolute locations of memory defined in other
|
||||
programs.
|
||||
|
||||
@item -relax
|
||||
@kindex -relax
|
||||
@cindex synthesizing linker
|
||||
@cindex relaxing addressing modes
|
||||
@item -relax
|
||||
An option with machine dependent effects.
|
||||
@ifset GENERIC
|
||||
Currently this option is only supported on the H8/300 and the Intel 960.
|
||||
|
@ -520,10 +527,10 @@ or symbols needed for relocations.
|
|||
You may only specify @samp{-retain-symbols-file} once in the command
|
||||
line. It overrides @samp{-s} and @samp{-S}.
|
||||
|
||||
@item -r
|
||||
@cindex partial link
|
||||
@cindex relocatable output
|
||||
@kindex -r
|
||||
@item -r
|
||||
Generate relocatable output---i.e., generate an output file that can in
|
||||
turn serve as input to @code{ld}. This is often called @dfn{partial
|
||||
linking}. As a side effect, in environments that support standard Unix
|
||||
|
@ -536,14 +543,14 @@ constructors; to do that, use @samp{-Ur}.
|
|||
|
||||
This option does the same thing as @samp{-i}.
|
||||
|
||||
@item -S
|
||||
@kindex -S
|
||||
@cindex strip debugger symbols
|
||||
@item -S
|
||||
Omit debugger symbol information (but not all symbols) from the output file.
|
||||
|
||||
@item -s
|
||||
@kindex -s
|
||||
@cindex strip all symbols
|
||||
@item -s
|
||||
Omit all symbol information from the output file.
|
||||
|
||||
@item -sort-common
|
||||
|
@ -581,10 +588,10 @@ the target format. @xref{Commands}. If @var{commandfile} does not
|
|||
exist, @code{ld} looks for it in the directories specified by any
|
||||
preceding @samp{-L} options. Multiple @samp{-T} options accumulate.
|
||||
|
||||
@item -t
|
||||
@kindex -t
|
||||
@cindex verbose
|
||||
@cindex input files, displaying
|
||||
@item -t
|
||||
Print the names of the input files as @code{ld} processes them.
|
||||
|
||||
@item -u @var{symbol}
|
||||
|
@ -597,9 +604,9 @@ arguments to enter additional undefined symbols.
|
|||
@c Nice idea, but no such command: This option is equivalent
|
||||
@c to the @code{EXTERN} linker command.
|
||||
|
||||
@item -Ur
|
||||
@kindex -Ur
|
||||
@cindex constructors
|
||||
@item -Ur
|
||||
For anything other than C++ programs, this option is equivalent to
|
||||
@samp{-r}: it generates relocatable output---i.e., an output file that can in
|
||||
turn serve as input to @code{ld}. When linking C++ programs, @samp{-Ur}
|
||||
|
@ -609,19 +616,19 @@ with @samp{-Ur}; once the constructor table has been built, it cannot
|
|||
be added to. Use @samp{-Ur} only for the last partial link, and
|
||||
@samp{-r} for the others.
|
||||
|
||||
@item -V
|
||||
@kindex -V
|
||||
@cindex version
|
||||
@item -V
|
||||
Display the version number for @code{ld} and list the linker emulations
|
||||
supported. Display which input files can and cannot be opened.
|
||||
|
||||
@item -v
|
||||
@kindex -v
|
||||
@cindex version
|
||||
@item -v
|
||||
Display the version number for @code{ld}.
|
||||
|
||||
@item --version
|
||||
@kindex --version
|
||||
@item -version
|
||||
@kindex -version
|
||||
Display the version number for @code{ld} and exit.
|
||||
|
||||
@item -warn-common
|
||||
|
@ -709,16 +716,16 @@ encountered in a different order.
|
|||
@end smallexample
|
||||
@end enumerate
|
||||
|
||||
@item -X
|
||||
@kindex -X
|
||||
@cindex local symbols, deleting
|
||||
@cindex L, deleting symbols beginning
|
||||
@item -X
|
||||
If @samp{-s} or @samp{-S} is also specified, delete only local symbols
|
||||
beginning with @samp{L}.
|
||||
|
||||
@item -x
|
||||
@kindex -x
|
||||
@cindex deleting local symbols
|
||||
@item -x
|
||||
If @samp{-s} or @samp{-S} is also specified, delete all local symbols,
|
||||
not just those beginning with @samp{L}.
|
||||
|
||||
|
@ -944,14 +951,14 @@ counter may never be moved backwards.
|
|||
@example
|
||||
SECTIONS
|
||||
@{
|
||||
output :
|
||||
@{
|
||||
file1(.text)
|
||||
. = . + 1000;
|
||||
file2(.text)
|
||||
. += 1000;
|
||||
file3(.text)
|
||||
@} = 0x1234;
|
||||
output :
|
||||
@{
|
||||
file1(.text)
|
||||
. = . + 1000;
|
||||
file2(.text)
|
||||
. += 1000;
|
||||
file3(.text)
|
||||
@} = 0x1234;
|
||||
@}
|
||||
@end example
|
||||
@noindent
|
||||
|
@ -961,6 +968,11 @@ appears, also with a 1000 byte gap following before @code{file3} is
|
|||
loaded. The notation @samp{= 0x1234} specifies what data to write in
|
||||
the gaps (@pxref{Section Options}).
|
||||
|
||||
@iftex
|
||||
@vfill
|
||||
@end iftex
|
||||
|
||||
@need 5000
|
||||
@node Operators
|
||||
@subsection Operators
|
||||
@cindex Operators for arithmetic
|
||||
|
@ -1112,11 +1124,11 @@ section definition by using the absolute assignment function
|
|||
is the last byte of an output section named @code{.data}:
|
||||
@example
|
||||
SECTIONS@{ @dots{}
|
||||
.data :
|
||||
@{
|
||||
*(.data)
|
||||
_edata = ABSOLUTE(.) ;
|
||||
@}
|
||||
.data :
|
||||
@{
|
||||
*(.data)
|
||||
_edata = ABSOLUTE(.) ;
|
||||
@}
|
||||
@dots{} @}
|
||||
@end example
|
||||
|
||||
|
@ -1130,9 +1142,9 @@ result of an expression is required, but the value is not available,
|
|||
then an error results. For example, a script like the following
|
||||
@example
|
||||
SECTIONS @{ @dots{}
|
||||
text 9+this_isnt_constant :
|
||||
@{ @dots{}
|
||||
@}
|
||||
text 9+this_isnt_constant :
|
||||
@{ @dots{}
|
||||
@}
|
||||
@dots{} @}
|
||||
@end example
|
||||
@kindex Non constant expression
|
||||
|
@ -1163,16 +1175,16 @@ example, @code{symbol_1} and @code{symbol_2} are assigned identical
|
|||
values:
|
||||
@example
|
||||
SECTIONS@{ @dots{}
|
||||
.output1 :
|
||||
@{
|
||||
start_of_output_1 = ABSOLUTE(.);
|
||||
@dots{}
|
||||
@}
|
||||
.output :
|
||||
@{
|
||||
symbol_1 = ADDR(.output1);
|
||||
symbol_2 = start_of_output_1;
|
||||
@}
|
||||
.output1 :
|
||||
@{
|
||||
start_of_output_1 = ABSOLUTE(.);
|
||||
@dots{}
|
||||
@}
|
||||
.output :
|
||||
@{
|
||||
symbol_1 = ADDR(.output1);
|
||||
symbol_2 = start_of_output_1;
|
||||
@}
|
||||
@dots{} @}
|
||||
@end example
|
||||
|
||||
|
@ -1193,10 +1205,10 @@ section and to set a variable within the section to the next
|
|||
@code{0x8000} boundary after the input sections:
|
||||
@example
|
||||
SECTIONS@{ @dots{}
|
||||
.data ALIGN(0x2000): @{
|
||||
*(.data)
|
||||
variable = ALIGN(0x8000);
|
||||
@}
|
||||
.data ALIGN(0x2000): @{
|
||||
*(.data)
|
||||
variable = ALIGN(0x8000);
|
||||
@}
|
||||
@dots{} @}
|
||||
@end example
|
||||
@noindent
|
||||
|
@ -1216,12 +1228,13 @@ values for symbols. For example, the following command-file fragment shows how
|
|||
to set a global symbol @code{begin} to the first location in the
|
||||
@code{.text} section---but if a symbol called @code{begin} already
|
||||
existed, its value is preserved:
|
||||
|
||||
@smallexample
|
||||
SECTIONS@{ @dots{}
|
||||
.text : @{
|
||||
begin = DEFINED(begin) ? begin : . ;
|
||||
@dots{}
|
||||
@}
|
||||
.text : @{
|
||||
begin = DEFINED(begin) ? begin : . ;
|
||||
@dots{}
|
||||
@}
|
||||
@dots{} @}
|
||||
@end smallexample
|
||||
|
||||
|
@ -1242,13 +1255,13 @@ been allocated. In the following example, @code{symbol_1} and
|
|||
@c What does it return if the section hasn't been allocated? 0?
|
||||
@example
|
||||
SECTIONS@{ @dots{}
|
||||
.output @{
|
||||
.start = . ;
|
||||
@dots{}
|
||||
.end = . ;
|
||||
@}
|
||||
symbol_1 = .end - .start ;
|
||||
symbol_2 = SIZEOF(.output);
|
||||
.output @{
|
||||
.start = . ;
|
||||
@dots{}
|
||||
.end = . ;
|
||||
@}
|
||||
symbol_1 = .end - .start ;
|
||||
symbol_2 = SIZEOF(.output);
|
||||
@dots{} @}
|
||||
|
||||
@end example
|
||||
|
@ -1285,37 +1298,40 @@ you wish. The syntax is:
|
|||
|
||||
@example
|
||||
MEMORY
|
||||
@{
|
||||
@var{name} (@var{attr}) : ORIGIN = @var{origin}, LENGTH = @var{len}
|
||||
@dots{}
|
||||
@}
|
||||
@{
|
||||
@var{name} (@var{attr}) : ORIGIN = @var{origin}, LENGTH = @var{len}
|
||||
@dots{}
|
||||
@}
|
||||
@end example
|
||||
@table @code
|
||||
@item @var{name}
|
||||
@cindex naming memory regions
|
||||
@item @var{name}
|
||||
is a name used internally by the linker to refer to the region. Any
|
||||
symbol name may be used. The region names are stored in a separate
|
||||
name space, and will not conflict with symbols, file names or section
|
||||
names. Use distinct names to specify multiple regions.
|
||||
@item (@var{attr})
|
||||
|
||||
@cindex memory region attributes
|
||||
@item (@var{attr})
|
||||
is an optional list of attributes, permitted for compatibility with the
|
||||
AT&T linker but not used by @code{ld} beyond checking that the
|
||||
attribute list is valid. Valid attribute lists must be made up of the
|
||||
characters ``@code{LIRWX}''. If you omit the attribute list, you may
|
||||
omit the parentheses around it as well.
|
||||
@item @var{origin}
|
||||
|
||||
@kindex ORIGIN =
|
||||
@kindex o =
|
||||
@kindex org =
|
||||
@item @var{origin}
|
||||
is the start address of the region in physical memory. It is
|
||||
an expression that must evaluate to a constant before
|
||||
memory allocation is performed. The keyword @code{ORIGIN} may be
|
||||
abbreviated to @code{org} or @code{o} (but not, for example, @samp{ORG}).
|
||||
@item @var{len}
|
||||
|
||||
@kindex LENGTH =
|
||||
@kindex len =
|
||||
@kindex l =
|
||||
@item @var{len}
|
||||
is the size in bytes of the region (an expression).
|
||||
The keyword @code{LENGTH} may be abbreviated to @code{len} or @code{l}.
|
||||
@end table
|
||||
|
@ -1326,10 +1342,10 @@ starting at @code{0x40000000} for four megabytes:
|
|||
|
||||
@example
|
||||
MEMORY
|
||||
@{
|
||||
rom : ORIGIN = 0, LENGTH = 256K
|
||||
ram : org = 0x40000000, l = 4M
|
||||
@}
|
||||
@{
|
||||
rom : ORIGIN = 0, LENGTH = 256K
|
||||
ram : org = 0x40000000, l = 4M
|
||||
@}
|
||||
@end example
|
||||
|
||||
Once you have defined a region of memory named @var{mem}, you can direct
|
||||
|
@ -1392,9 +1408,9 @@ these specifications are optional; the simplest form of a section
|
|||
definition is
|
||||
@example
|
||||
SECTIONS @{ @dots{}
|
||||
@var{secname} : @{
|
||||
@var{contents}
|
||||
@}
|
||||
@var{secname} : @{
|
||||
@var{contents}
|
||||
@}
|
||||
@dots{} @}
|
||||
@end example
|
||||
@cindex naming output sections
|
||||
|
@ -1432,10 +1448,10 @@ like in a single section definition, separated from one another by
|
|||
whitespace.
|
||||
|
||||
@table @code
|
||||
@item @var{filename}
|
||||
@kindex @var{filename}
|
||||
@cindex input files, section defn
|
||||
@cindex files, including in output sections
|
||||
@item @var{filename}
|
||||
You may simply name a particular input file to be placed in the current
|
||||
output section; @emph{all} sections from that file are placed in the
|
||||
current section definition. If the file name has already been mentioned
|
||||
|
@ -1451,21 +1467,21 @@ The example also illustrates that multiple statements can be included in
|
|||
the contents of a section definition, since each file name is a separate
|
||||
statement.
|
||||
|
||||
@kindex @var{filename}(@var{section})
|
||||
@cindex files and sections, section defn
|
||||
@item @var{filename}( @var{section} )
|
||||
@itemx @var{filename}( @var{section}, @var{section}, @dots{} )
|
||||
@itemx @var{filename}( @var{section} @var{section} @dots{} )
|
||||
@kindex @var{filename}(@var{section})
|
||||
@cindex files and sections, section defn
|
||||
You can name one or more sections from your input files, for
|
||||
insertion in the current output section. If you wish to specify a list
|
||||
of input-file sections inside the parentheses, you may separate the
|
||||
section names by either commas or whitespace.
|
||||
|
||||
@cindex input sections to output section
|
||||
@kindex *(@var{section})
|
||||
@item * (@var{section})
|
||||
@itemx * (@var{section}, @var{section}, @dots{})
|
||||
@itemx * (@var{section} @var{section} @dots{})
|
||||
@cindex input sections to output section
|
||||
@kindex *(@var{section})
|
||||
Instead of explicitly naming particular input files in a link control
|
||||
script, you can refer to @emph{all} files from the @code{ld} command
|
||||
line: use @samp{*} instead of a particular file name before the
|
||||
|
@ -1480,26 +1496,27 @@ into the @code{.text} section of an @code{a.out} file, and sections @code{13}
|
|||
and @code{14} into the @code{.data} section:
|
||||
@example
|
||||
SECTIONS @{
|
||||
.text :@{
|
||||
*("1" "2" "3" "4")
|
||||
@}
|
||||
|
||||
.data :@{
|
||||
*("13" "14")
|
||||
@}
|
||||
.text :@{
|
||||
*("1" "2" "3" "4")
|
||||
@}
|
||||
|
||||
.data :@{
|
||||
*("13" "14")
|
||||
@}
|
||||
@}
|
||||
@end example
|
||||
|
||||
@cindex @code{[@var{section}@dots{}]}, not supported
|
||||
@samp{[ @var{section} @dots{} ]} used to be accepted as an alternate way
|
||||
to specify named sections from all unallocated input files. Because
|
||||
some operating systems (VMS) allow brackets in file names, that notation
|
||||
is no longer supported.
|
||||
|
||||
@item @var{filename}@code{( COMMON )}
|
||||
@itemx *( COMMON )
|
||||
@kindex *( COMMON )
|
||||
@cindex uninitialized data
|
||||
@cindex commons in output
|
||||
@kindex *( COMMON )
|
||||
@item @var{filename}@code{( COMMON )}
|
||||
@itemx *( COMMON )
|
||||
Specify where in your output file to place uninitialized data
|
||||
with this notation. @code{*(COMMON)} by itself refers to all
|
||||
uninitialized data from all input files (so far as it is not yet
|
||||
|
@ -1515,6 +1532,7 @@ For example, the following command script arranges the output file into
|
|||
three consecutive sections, named @code{.text}, @code{.data}, and
|
||||
@code{.bss}, taking the input for each from the correspondingly named
|
||||
sections of all the input files:
|
||||
|
||||
@example
|
||||
SECTIONS @{
|
||||
.text : @{ *(.text) @}
|
||||
|
@ -1534,21 +1552,21 @@ files are written to output section @code{outputc}.
|
|||
|
||||
@example
|
||||
SECTIONS @{
|
||||
outputa 0x10000 :
|
||||
@{
|
||||
all.o
|
||||
foo.o (.input1)
|
||||
@}
|
||||
outputb :
|
||||
@{
|
||||
foo.o (.input2)
|
||||
foo1.o (.input1)
|
||||
@}
|
||||
outputc :
|
||||
@{
|
||||
*(.input1)
|
||||
*(.input2)
|
||||
@}
|
||||
outputa 0x10000 :
|
||||
@{
|
||||
all.o
|
||||
foo.o (.input1)
|
||||
@}
|
||||
outputb :
|
||||
@{
|
||||
foo.o (.input2)
|
||||
foo1.o (.input1)
|
||||
@}
|
||||
outputc :
|
||||
@{
|
||||
*(.input1)
|
||||
*(.input2)
|
||||
@}
|
||||
@}
|
||||
@end example
|
||||
|
||||
|
@ -1566,10 +1584,10 @@ command; you can intermix them freely with any of the statements we've
|
|||
just described.
|
||||
|
||||
@table @code
|
||||
@item CREATE_OBJECT_SYMBOLS
|
||||
@kindex CREATE_OBJECT_SYMBOLS
|
||||
@cindex input filename symbols
|
||||
@cindex filename symbols
|
||||
@kindex CREATE_OBJECT_SYMBOLS
|
||||
@item CREATE_OBJECT_SYMBOLS
|
||||
Create a symbol for each input file
|
||||
in the current section, set to the address of the first byte of
|
||||
data written from that input file. For instance, with @code{a.out}
|
||||
|
@ -1577,13 +1595,13 @@ files it is conventional to have a symbol for each input file. You can
|
|||
accomplish this by defining the output @code{.text} section as follows:
|
||||
@example
|
||||
SECTIONS @{
|
||||
.text 0x2020 :
|
||||
@{
|
||||
CREATE_OBJECT_SYMBOLS
|
||||
*(.text)
|
||||
_etext = ALIGN(0x2000);
|
||||
@}
|
||||
@dots{}
|
||||
.text 0x2020 :
|
||||
@{
|
||||
CREATE_OBJECT_SYMBOLS
|
||||
*(.text)
|
||||
_etext = ALIGN(0x2000);
|
||||
@}
|
||||
@dots{}
|
||||
@}
|
||||
@end example
|
||||
|
||||
|
@ -1624,10 +1642,10 @@ containing symbols matching the object file names:
|
|||
00002068 t d.o
|
||||
@end example
|
||||
|
||||
@item @var{symbol} = @var{expression} ;
|
||||
@kindex @var{symbol} = @var{expression} ;
|
||||
@itemx @var{symbol} @var{f}= @var{expression} ;
|
||||
@kindex @var{symbol} @var{f}= @var{expression} ;
|
||||
@item @var{symbol} = @var{expression} ;
|
||||
@itemx @var{symbol} @var{f}= @var{expression} ;
|
||||
@var{symbol} is any symbol name (@pxref{Symbols}). ``@var{f}=''
|
||||
refers to any of the operators @code{&= += -= *= /=} which combine
|
||||
arithmetic and assignment.
|
||||
|
@ -1636,6 +1654,7 @@ arithmetic and assignment.
|
|||
When you assign a value to a symbol within a particular section
|
||||
definition, the value is relative to the beginning of the section
|
||||
(@pxref{Assignment}). If you write
|
||||
|
||||
@example
|
||||
SECTIONS @{
|
||||
abs = 14 ;
|
||||
|
@ -1645,20 +1664,21 @@ SECTIONS @{
|
|||
@dots{}
|
||||
@}
|
||||
@end example
|
||||
|
||||
@c FIXME: Try above example!
|
||||
@noindent
|
||||
@code{abs} and @code{rel} do not have the same value; @code{rel} has the
|
||||
same value as @code{abs2}.
|
||||
|
||||
@item BYTE(@var{expression})
|
||||
@kindex BYTE(@var{expression})
|
||||
@itemx SHORT(@var{expression})
|
||||
@kindex SHORT(@var{expression})
|
||||
@itemx LONG(@var{expression})
|
||||
@kindex LONG(@var{expression})
|
||||
@itemx QUAD(@var{expression})
|
||||
@kindex QUAD(@var{expression})
|
||||
@cindex direct output
|
||||
@item BYTE(@var{expression})
|
||||
@itemx SHORT(@var{expression})
|
||||
@itemx LONG(@var{expression})
|
||||
@itemx QUAD(@var{expression})
|
||||
By including one of these four statements in a section definition, you
|
||||
can explicitly place one, two, four, or eight bytes (respectively) at
|
||||
the current address of that section. @code{QUAD} is only supported when
|
||||
|
@ -1693,7 +1713,7 @@ optional portions:
|
|||
SECTIONS @{
|
||||
@dots{}
|
||||
@var{secname} @var{start} BLOCK(@var{align}) (NOLOAD) : AT ( @var{ldadr} )
|
||||
@{ @var{contents} @} =@var{fill} >@var{region}
|
||||
@{ @var{contents} @} =@var{fill} >@var{region}
|
||||
@dots{}
|
||||
@}
|
||||
@end smallexample
|
||||
|
@ -1705,29 +1725,30 @@ Definition}, and @pxref{Section Placement} for details on
|
|||
@code{=@var{fill}}, and @code{>@var{region}}---are all optional.
|
||||
|
||||
@table @code
|
||||
@item @var{start}
|
||||
@cindex start address, section
|
||||
@cindex section start
|
||||
@cindex section address
|
||||
@item @var{start}
|
||||
You can force the output section to be loaded at a specified address by
|
||||
specifying @var{start} immediately following the section name.
|
||||
@var{start} can be represented as any expression. The following
|
||||
example generates section @var{output} at location
|
||||
@code{0x40000000}:
|
||||
|
||||
@example
|
||||
SECTIONS @{
|
||||
@dots{}
|
||||
output 0x40000000: @{
|
||||
@dots{}
|
||||
@}
|
||||
@dots{}
|
||||
@dots{}
|
||||
output 0x40000000: @{
|
||||
@dots{}
|
||||
@}
|
||||
@dots{}
|
||||
@}
|
||||
@end example
|
||||
|
||||
@item BLOCK(@var{align})
|
||||
@kindex BLOCK(@var{align})
|
||||
@cindex section alignment
|
||||
@cindex aligning sections
|
||||
@item BLOCK(@var{align})
|
||||
You can include @code{BLOCK()} specification to advance
|
||||
the location counter @code{.} prior to the beginning of the section, so
|
||||
that the section will begin at the specified alignment. @var{align} is
|
||||
|
@ -1744,8 +1765,8 @@ need to be loaded into each object file:
|
|||
|
||||
@example
|
||||
SECTIONS @{
|
||||
ROM 0 (NOLOAD) : @{ @dots{} @}
|
||||
@dots{}
|
||||
ROM 0 (NOLOAD) : @{ @dots{} @}
|
||||
@dots{}
|
||||
@}
|
||||
@end example
|
||||
|
||||
|
@ -1795,24 +1816,22 @@ for (dst = _bstart; dst< _bend; dst++)
|
|||
*dst = 0;
|
||||
@end smallexample
|
||||
|
||||
@item =@var{fill}
|
||||
@kindex =@var{fill}
|
||||
@cindex section fill pattern
|
||||
@cindex fill pattern, entire section
|
||||
Including
|
||||
@code{=@var{fill}} in a section definition specifies the initial fill
|
||||
value for that section.
|
||||
You may use any expression to specify @var{fill}.
|
||||
Any unallocated holes in the current output
|
||||
section when written to the output file will be filled with the two
|
||||
least significant bytes of the value, repeated as necessary. You can
|
||||
also change the fill value with a @code{FILL} statement in the
|
||||
@var{contents} of a section definition.
|
||||
@item =@var{fill}
|
||||
Including @code{=@var{fill}} in a section definition specifies the
|
||||
initial fill value for that section. You may use any expression to
|
||||
specify @var{fill}. Any unallocated holes in the current output section
|
||||
when written to the output file will be filled with the two least
|
||||
significant bytes of the value, repeated as necessary. You can also
|
||||
change the fill value with a @code{FILL} statement in the @var{contents}
|
||||
of a section definition.
|
||||
|
||||
@item >@var{region}
|
||||
@kindex >@var{region}
|
||||
@cindex section, assigning to memory region
|
||||
@cindex memory regions and sections
|
||||
@item >@var{region}
|
||||
Assign this section to a previously defined region of memory.
|
||||
@xref{MEMORY}.
|
||||
|
||||
|
@ -1858,6 +1877,7 @@ For example, you can use these rules to generate an entry point with an
|
|||
assignment statement: if no symbol @code{start} is defined within your
|
||||
input files, you can simply define it, assigning it an appropriate
|
||||
value---
|
||||
|
||||
@example
|
||||
start = 0x2020;
|
||||
@end example
|
||||
|
@ -1867,6 +1887,7 @@ The example shows an absolute address, but you can use any expression.
|
|||
For example, if your input object files use some other symbol-name
|
||||
convention for the entry point, you can just assign the value of
|
||||
whatever symbol contains the start address to @code{start}:
|
||||
|
||||
@example
|
||||
start = other_symbol ;
|
||||
@end example
|
||||
|
@ -1895,6 +1916,7 @@ must arrange to actually run this code; GNU C++ calls constructors from
|
|||
a subroutine @code{__main}, which it inserts automatically into the
|
||||
startup code for @code{main}, and destructors from @code{_exit}.)
|
||||
|
||||
@need 1000
|
||||
@kindex FLOAT
|
||||
@kindex NOFLOAT
|
||||
@item FLOAT
|
||||
|
@ -2110,113 +2132,17 @@ not itself call any subroutines).
|
|||
|
||||
@cindex back end
|
||||
@cindex object file management
|
||||
@cindex object formats available
|
||||
@kindex objdump -i
|
||||
The linker accesses object and archive files using the BFD libraries.
|
||||
These libraries allow the linker to use the same routines to operate on
|
||||
object files whatever the object file format. A different object file
|
||||
format can be supported simply by creating a new BFD back end and adding
|
||||
it to the library. You can use @code{objdump -i}
|
||||
it to the library. To conserve runtime memory, however, the linker and
|
||||
associated tools are usually configured to support only a subset of the
|
||||
object file formats available. You can use @code{objdump -i}
|
||||
(@pxref{objdump,,objdump,binutils.info,The GNU Binary Utilities}) to
|
||||
list all the formats available for each architecture under BFD. This
|
||||
was the list of formats, and of architectures supported for each format,
|
||||
as of the time this manual was prepared:
|
||||
@cindex formats available
|
||||
@cindex architectures available
|
||||
@example
|
||||
BFD header file version 0.18
|
||||
a.out-i386
|
||||
(header big endian, data big endian)
|
||||
m68k:68020
|
||||
a29k
|
||||
sparc
|
||||
i386
|
||||
a.out-sunos-big
|
||||
(header big endian, data big endian)
|
||||
m68k:68020
|
||||
a29k
|
||||
sparc
|
||||
i386
|
||||
b.out.big
|
||||
(header big endian, data little endian)
|
||||
i960:core
|
||||
b.out.little
|
||||
(header little endian, data little endian)
|
||||
i960:core
|
||||
coff-a29k-big
|
||||
(header big endian, data big endian)
|
||||
a29k
|
||||
coff-h8300
|
||||
(header big endian, data big endian)
|
||||
H8/300
|
||||
coff-i386
|
||||
(header little endian, data little endian)
|
||||
i386
|
||||
coff-Intel-big
|
||||
(header big endian, data little endian)
|
||||
i960:core
|
||||
coff-Intel-little
|
||||
(header little endian, data little endian)
|
||||
i960:core
|
||||
coff-m68k
|
||||
(header big endian, data big endian)
|
||||
m68k:68020
|
||||
coff-m88kbcs
|
||||
(header big endian, data big endian)
|
||||
m88k:88100
|
||||
ecoff-bigmips
|
||||
(header big endian, data big endian)
|
||||
mips
|
||||
ecoff-littlemips
|
||||
(header little endian, data little endian)
|
||||
mips
|
||||
elf-big
|
||||
(header big endian, data big endian)
|
||||
m68k:68020
|
||||
vax
|
||||
i960:core
|
||||
a29k
|
||||
sparc
|
||||
mips
|
||||
i386
|
||||
m88k:88100
|
||||
H8/300
|
||||
rs6000:6000
|
||||
elf-little
|
||||
(header little endian, data little endian)
|
||||
m68k:68020
|
||||
vax
|
||||
i960:core
|
||||
a29k
|
||||
sparc
|
||||
mips
|
||||
i386
|
||||
m88k:88100
|
||||
H8/300
|
||||
rs6000:6000
|
||||
ieee
|
||||
(header big endian, data big endian)
|
||||
m68k:68020
|
||||
vax
|
||||
i960:core
|
||||
a29k
|
||||
sparc
|
||||
mips
|
||||
i386
|
||||
m88k:88100
|
||||
H8/300
|
||||
rs6000:6000
|
||||
srec
|
||||
(header big endian, data big endian)
|
||||
m68k:68020
|
||||
vax
|
||||
i960:core
|
||||
a29k
|
||||
sparc
|
||||
mips
|
||||
i386
|
||||
m88k:88100
|
||||
H8/300
|
||||
rs6000:6000
|
||||
@end example
|
||||
list all the formats available for your configuration.
|
||||
|
||||
@cindex BFD requirements
|
||||
@cindex requirements for BFD
|
||||
|
@ -2274,9 +2200,9 @@ lower case; for example, @samp{chip} is the same as @samp{CHIP}.
|
|||
The following list shows only the upper-case form of each command.
|
||||
|
||||
@table @code
|
||||
@cindex @code{ABSOLUTE} (MRI)
|
||||
@item ABSOLUTE @var{secname}
|
||||
@item ABSOLUTE @var{secname}, @var{secname}, @dots{} @var{secname}
|
||||
@cindex @code{ABSOLUTE} (MRI)
|
||||
Normally, @code{ld} includes in the output file all sections from all
|
||||
the input files. However, in an MRI-compatible script, you can use the
|
||||
@code{ABSOLUTE} command to restrict the sections that will be present in
|
||||
|
@ -2286,31 +2212,32 @@ commands will appear in the linker output. You can still use other
|
|||
input sections (whatever you select on the command line, or using
|
||||
@code{LOAD}) to resolve addresses in the output file.
|
||||
|
||||
@item ALIAS @var{out-secname}, @var{in-secname}
|
||||
@cindex @code{ALIAS} (MRI)
|
||||
@item ALIAS @var{out-secname}, @var{in-secname}
|
||||
Use this command to place the data from input section @var{in-secname}
|
||||
in a section called @var{out-secname} in the linker output file.
|
||||
|
||||
@var{in-secname} may be an integer.
|
||||
|
||||
@item BASE @var{expression}
|
||||
@cindex @code{BASE} (MRI)
|
||||
@item BASE @var{expression}
|
||||
Use the value of @var{expression} as the lowest address (other than
|
||||
absolute addresses) in the output file.
|
||||
|
||||
@cindex @code{CHIP} (MRI)
|
||||
@item CHIP @var{expression}
|
||||
@itemx CHIP @var{expression}, @var{expression}
|
||||
@cindex @code{CHIP} (MRI)
|
||||
This command does nothing; it is accepted only for compatibility.
|
||||
|
||||
@item END
|
||||
@cindex @code{END} (MRI)
|
||||
@item END
|
||||
This command does nothing whatever; it's only accepted for compatibility.
|
||||
|
||||
@item FORMAT @var{output-format}
|
||||
@cindex @code{FORMAT} (MRI)
|
||||
@item FORMAT @var{output-format}
|
||||
Similar to the @code{OUTPUT_FORMAT} command in the more general linker
|
||||
language, but restricted to one of these output formats:
|
||||
|
||||
@enumerate
|
||||
@item
|
||||
S-records, if @var{output-format} is @samp{S}
|
||||
|
@ -2323,47 +2250,47 @@ COFF (the @samp{coff-m68k} variant in BFD), if @var{output-format} is
|
|||
@samp{COFF}
|
||||
@end enumerate
|
||||
|
||||
@item LIST @var{anything}@dots{}
|
||||
@cindex @code{LIST} (MRI)
|
||||
@item LIST @var{anything}@dots{}
|
||||
Print (to the standard output file) a link map, as produced by the
|
||||
@code{ld} command-line option @samp{-M}.
|
||||
|
||||
The keyword @code{LIST} may be followed by anything on the
|
||||
same line, with no change in its effect.
|
||||
|
||||
@cindex @code{LOAD} (MRI)
|
||||
@item LOAD @var{filename}
|
||||
@item LOAD @var{filename}, @var{filename}, @dots{} @var{filename}
|
||||
@cindex @code{LOAD} (MRI)
|
||||
Include one or more object file @var{filename} in the link; this has the
|
||||
same effect as specifying @var{filename} directly on the @code{ld}
|
||||
command line.
|
||||
|
||||
@item NAME @var{output-name}
|
||||
@cindex @code{NAME} (MRI)
|
||||
@item NAME @var{output-name}
|
||||
@var{output-name} is the name for the program produced by @code{ld}; the
|
||||
MRI-compatible command @code{NAME} is equivalent to the command-line
|
||||
option @samp{-o} or the general script language command @code{OUTPUT}.
|
||||
|
||||
@cindex @code{ORDER} (MRI)
|
||||
@item ORDER @var{secname}, @var{secname}, @dots{} @var{secname}
|
||||
@itemx ORDER @var{secname} @var{secname} @var{secname}
|
||||
@cindex @code{ORDER} (MRI)
|
||||
Normally, @code{ld} orders the sections in its output file in the
|
||||
order in which they first appear in the input files. In an MRI-compatible
|
||||
script, you can override this ordering with the @code{ORDER} command. The
|
||||
sections you list with @code{ORDER} will appear first in your output
|
||||
file, in the order specified.
|
||||
|
||||
@cindex @code{PUBLIC} (MRI)
|
||||
@item PUBLIC @var{name}=@var{expression}
|
||||
@itemx PUBLIC @var{name},@var{expression}
|
||||
@itemx PUBLIC @var{name} @var{expression}
|
||||
@cindex @code{PUBLIC} (MRI)
|
||||
Supply a value (@var{expression}) for external symbol
|
||||
@var{name} used in the linker input files.
|
||||
|
||||
@cindex @code{SECT} (MRI)
|
||||
@item SECT @var{secname}, @var{expression}
|
||||
@itemx SECT @var{secname}=@var{expression}
|
||||
@itemx SECT @var{secname} @var{expression}
|
||||
@cindex @code{SECT} (MRI)
|
||||
You can use any of these three forms of the @code{SECT} command to
|
||||
specify the start address (@var{expression}) for section @var{secname}.
|
||||
If you have more than one @code{SECT} statement for the same
|
||||
|
|
328
ld/ldgram.y
328
ld/ldgram.y
|
@ -65,21 +65,9 @@ static int error_index;
|
|||
%}
|
||||
%union {
|
||||
bfd_vma integer;
|
||||
int voidval;
|
||||
char *name;
|
||||
int token;
|
||||
union etree_union *etree;
|
||||
struct sec *section;
|
||||
struct lang_output_section_statement_struct *output_section_statement;
|
||||
union lang_statement_union **statement_ptr;
|
||||
int lineno;
|
||||
struct {
|
||||
FILE *file;
|
||||
char *name;
|
||||
unsigned int lineno;
|
||||
} state;
|
||||
|
||||
|
||||
}
|
||||
|
||||
%type <etree> exp opt_exp_with_type mustbe_exp opt_at
|
||||
|
@ -103,326 +91,48 @@ static int error_index;
|
|||
%left <token> '+' '-'
|
||||
%left <token> '*' '/' '%'
|
||||
|
||||
/*%token <token> '+' '-' '*' '/' '%'*/
|
||||
%right UNARY
|
||||
%token END
|
||||
%left <token> '('
|
||||
%token <token> ALIGN_K BLOCK QUAD LONG SHORT BYTE
|
||||
%token SECTIONS
|
||||
%token SECTIONS
|
||||
%token '{' '}'
|
||||
%token SIZEOF_HEADERS OUTPUT_FORMAT FORCE_COMMON_ALLOCATION OUTPUT_ARCH
|
||||
%token SIZEOF_HEADERS
|
||||
%token INCLUDE
|
||||
%token MEMORY DEFSYMEND
|
||||
%token MEMORY DEFSYMEND
|
||||
%token NOLOAD DSECT COPY INFO OVERLAY
|
||||
%token NAME DEFINED TARGET_K SEARCH_DIR MAP ENTRY
|
||||
%token OPTION_e OPTION_c OPTION_noinhibit_exec OPTION_s OPTION_S OPTION_sort_common OPTION_warn_common
|
||||
%token OPTION_EB OPTION_EL OPTION_G OPTION_Gval OPTION_help
|
||||
%token OPTION_format OPTION_oformat OPTION_F OPTION_u OPTION_y OPTION_Bstatic OPTION_N
|
||||
%token <integer> SIZEOF NEXT ADDR
|
||||
%token OPTION_d OPTION_dc OPTION_dp OPTION_x OPTION_X OPTION_defsym
|
||||
%token OPTION_v OPTION_V OPTION_m OPTION_memul OPTION_M OPTION_t STARTUP HLL SYSLIB FLOAT NOFLOAT
|
||||
%token OPTION_L OPTION_Map
|
||||
%token OPTION_n OPTION_r OPTION_o OPTION_b OPTION_R OPTION_relax OPTION_version
|
||||
%token <name> OPTION_l OPTION_Lfile OPTION_T OPTION_Aarch OPTION_Tfile
|
||||
%token <name> OPTION_Texp OPTION_esymbol OPTION_usymbol OPTION_ysymbol
|
||||
%token OPTION_Ur
|
||||
%token ORIGIN FILL OPTION_g
|
||||
%token LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS
|
||||
%token OPTION_RETAIN_SYMBOLS_FILE ALIGNMOD AT
|
||||
%token OPTION_Qy OPTION_Y OPTION_dn OPTION_call_shared OPTION_non_shared
|
||||
%token OPTION_Oval OPTION_stats OPTION_no_keep_memory
|
||||
%token <name> OPTION_YP
|
||||
|
||||
%token NAME DEFINED TARGET_K SEARCH_DIR MAP ENTRY
|
||||
%token <integer> SIZEOF NEXT ADDR
|
||||
%token STARTUP HLL SYSLIB FLOAT NOFLOAT
|
||||
%token ORIGIN FILL
|
||||
%token LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS
|
||||
%token ALIGNMOD AT
|
||||
%type <token> assign_op
|
||||
|
||||
%type <name> filename
|
||||
|
||||
|
||||
%token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD
|
||||
%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
|
||||
%token INPUT_SCRIPT INPUT_MRI_SCRIPT INPUT_DEFSYM
|
||||
|
||||
%%
|
||||
|
||||
file: command_line
|
||||
file:
|
||||
INPUT_SCRIPT script_file
|
||||
| INPUT_MRI_SCRIPT mri_script_file
|
||||
| INPUT_DEFSYM defsym_expr
|
||||
;
|
||||
|
||||
|
||||
filename: NAME;
|
||||
|
||||
|
||||
command_line:
|
||||
command_line command_line_option
|
||||
|
|
||||
;
|
||||
|
||||
command_line_option:
|
||||
OPTION_Bstatic { }
|
||||
| OPTION_help
|
||||
{
|
||||
help ();
|
||||
exit (0);
|
||||
}
|
||||
| OPTION_v
|
||||
{
|
||||
ldversion(0);
|
||||
version_printed = true;
|
||||
}
|
||||
| OPTION_V
|
||||
{
|
||||
ldversion(1);
|
||||
version_printed = true;
|
||||
trace_file_tries = true;
|
||||
}
|
||||
| OPTION_version
|
||||
{
|
||||
ldversion(0);
|
||||
version_printed = true;
|
||||
}
|
||||
| OPTION_t {
|
||||
trace_files = true;
|
||||
}
|
||||
| OPTION_Map NAME
|
||||
defsym_expr:
|
||||
{ ldlex_defsym(); }
|
||||
NAME '=' exp
|
||||
{
|
||||
write_map = true;
|
||||
config.map_filename = $2;
|
||||
ldlex_popstate();
|
||||
lang_add_assignment(exp_assop($3,$2,$4));
|
||||
}
|
||||
| OPTION_m NAME
|
||||
{
|
||||
/* Ignore. */
|
||||
}
|
||||
| OPTION_memul
|
||||
{
|
||||
/* Ignore. */
|
||||
}
|
||||
| OPTION_M
|
||||
{
|
||||
config.map_filename = "-";
|
||||
}
|
||||
| OPTION_n {
|
||||
config.magic_demand_paged = false;
|
||||
}
|
||||
| OPTION_N {
|
||||
config.text_read_only = false;
|
||||
config.magic_demand_paged = false;
|
||||
}
|
||||
| OPTION_s {
|
||||
link_info.strip = strip_all;
|
||||
}
|
||||
| OPTION_S {
|
||||
link_info.strip = strip_debugger;
|
||||
}
|
||||
| OPTION_stats {
|
||||
config.stats = true;
|
||||
}
|
||||
| OPTION_no_keep_memory {
|
||||
link_info.keep_memory = false;
|
||||
}
|
||||
| OPTION_u NAME {
|
||||
ldlang_add_undef($2);
|
||||
}
|
||||
| OPTION_usymbol {
|
||||
ldlang_add_undef($1);
|
||||
}
|
||||
| OPTION_r {
|
||||
link_info.relocateable = true;
|
||||
config.build_constructors = false;
|
||||
config.magic_demand_paged = false;
|
||||
config.text_read_only = false;
|
||||
}
|
||||
| OPTION_Ur {
|
||||
link_info.relocateable = true;
|
||||
config.build_constructors = true;
|
||||
config.magic_demand_paged = false;
|
||||
config.text_read_only = false;
|
||||
}
|
||||
| OPTION_o filename
|
||||
{
|
||||
lang_add_output($2, 0);
|
||||
}
|
||||
| OPTION_e NAME
|
||||
{ lang_add_entry($2);
|
||||
}
|
||||
| OPTION_esymbol
|
||||
{ lang_add_entry($1);
|
||||
}
|
||||
| OPTION_X {
|
||||
link_info.discard = discard_l;
|
||||
}
|
||||
| OPTION_x {
|
||||
link_info.discard = discard_all;
|
||||
}
|
||||
|
||||
| OPTION_noinhibit_exec
|
||||
{
|
||||
force_make_executable = true;
|
||||
}
|
||||
| OPTION_sort_common
|
||||
{
|
||||
config.sort_common = true;
|
||||
}
|
||||
| OPTION_warn_common
|
||||
{
|
||||
config.warn_common = true;
|
||||
}
|
||||
| OPTION_d {
|
||||
command_line.force_common_definition = true;
|
||||
}
|
||||
|
||||
| OPTION_relax {
|
||||
command_line.relax = true;
|
||||
}
|
||||
| OPTION_dc
|
||||
{
|
||||
command_line.force_common_definition = true;
|
||||
}
|
||||
| OPTION_g
|
||||
{
|
||||
/* Ignored */
|
||||
}
|
||||
| OPTION_dp
|
||||
{
|
||||
command_line.force_common_definition = true;
|
||||
}
|
||||
| OPTION_format NAME
|
||||
{
|
||||
lang_add_target($2);
|
||||
}
|
||||
| OPTION_oformat NAME
|
||||
{
|
||||
lang_add_output_format($2, 0);
|
||||
}
|
||||
| OPTION_Texp
|
||||
{ ldlex_expression();
|
||||
hex_mode = 16;
|
||||
}
|
||||
INT
|
||||
{ ldlex_popstate();
|
||||
lang_section_start($1,exp_intop($3));
|
||||
hex_mode = 0;
|
||||
}
|
||||
| OPTION_y NAME
|
||||
{
|
||||
add_ysym($2);
|
||||
}
|
||||
| OPTION_ysymbol
|
||||
{
|
||||
add_ysym($1);
|
||||
}
|
||||
| OPTION_Aarch
|
||||
{
|
||||
ldfile_add_arch($1);
|
||||
}
|
||||
| OPTION_b NAME
|
||||
{
|
||||
lang_add_target($2);
|
||||
}
|
||||
| OPTION_L NAME
|
||||
{
|
||||
ldfile_add_library_path($2);
|
||||
}
|
||||
| OPTION_Lfile
|
||||
{
|
||||
ldfile_add_library_path($1);
|
||||
}
|
||||
| OPTION_F
|
||||
{
|
||||
/* Ignore */
|
||||
}
|
||||
| OPTION_c filename
|
||||
{ldfile_open_command_file($2); }
|
||||
mri_script_file END { ldlex_command();}
|
||||
|
||||
| OPTION_Tfile
|
||||
{ ldfile_open_command_file($1); } script_file
|
||||
END { ldlex_command();}
|
||||
|
||||
| OPTION_T filename
|
||||
{ ldfile_open_command_file($2); } script_file
|
||||
END { ldlex_command();}
|
||||
|
||||
| OPTION_l
|
||||
{
|
||||
lang_add_input_file($1,
|
||||
lang_input_file_is_l_enum,
|
||||
(char *)NULL);
|
||||
}
|
||||
| OPTION_R filename
|
||||
{
|
||||
lang_add_input_file($2,
|
||||
lang_input_file_is_symbols_only_enum,
|
||||
(char *)NULL);
|
||||
}
|
||||
|
||||
| OPTION_defsym { ldlex_defsym(); }
|
||||
NAME '=' exp DEFSYMEND { ldlex_popstate();
|
||||
lang_add_assignment(exp_assop($4,$3,$5));
|
||||
}
|
||||
| OPTION_RETAIN_SYMBOLS_FILE filename
|
||||
{ add_keepsyms_file ($2); }
|
||||
| OPTION_EB
|
||||
{
|
||||
/* FIXME: This is currently ignored. It means
|
||||
``produce a big-endian object file''. It could
|
||||
be used to select an output format. */
|
||||
}
|
||||
| OPTION_EL
|
||||
{
|
||||
/* FIXME: This is currently ignored. It means
|
||||
``produce a little-endian object file''. It could
|
||||
be used to select an output format. */
|
||||
}
|
||||
| OPTION_G NAME
|
||||
{
|
||||
g_switch_value = atoi ($2);
|
||||
}
|
||||
| OPTION_Gval
|
||||
{
|
||||
g_switch_value = yylval.integer;
|
||||
}
|
||||
| OPTION_Qy
|
||||
| OPTION_dn
|
||||
| OPTION_non_shared
|
||||
| OPTION_call_shared
|
||||
| OPTION_Oval
|
||||
| OPTION_YP
|
||||
{
|
||||
dirlist_ptr = $1;
|
||||
goto set_default_dirlist;
|
||||
}
|
||||
| OPTION_Y NAME
|
||||
{
|
||||
if (strncmp ($2, "P,", 2))
|
||||
einfo ("%P%F: unknown -Y option -- %s\n", $2);
|
||||
else
|
||||
{
|
||||
char *p;
|
||||
dirlist_ptr = $2;
|
||||
set_default_dirlist:
|
||||
while (1)
|
||||
{
|
||||
p = strchr (dirlist_ptr, ':');
|
||||
if (p != NULL)
|
||||
*p = 0;
|
||||
if (*dirlist_ptr)
|
||||
ldfile_add_library_path (dirlist_ptr);
|
||||
if (p == NULL)
|
||||
break;
|
||||
*p = ':';
|
||||
dirlist_ptr = p + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
| '{' script_file '}' { /* This parses compiled-in scripts. */ }
|
||||
| NAME
|
||||
{
|
||||
if (*$1 == '-')
|
||||
einfo("%P%F: illegal option -- %s\n", $1);
|
||||
else
|
||||
lang_add_input_file($1,lang_input_file_is_file_enum,
|
||||
(char *)NULL);
|
||||
}
|
||||
;
|
||||
|
||||
|
||||
/* SYNTAX WITHIN AN MRI SCRIPT FILE */
|
||||
mri_script_file:
|
||||
|
|
13
ld/ldlex.h
13
ld/ldlex.h
|
@ -22,6 +22,16 @@
|
|||
|
||||
#include <stdio.h>
|
||||
|
||||
/* The initial parser states. */
|
||||
typedef enum input_enum {
|
||||
input_selected, /* We've set the initial state. */
|
||||
input_script = INPUT_SCRIPT,
|
||||
input_mri_script = INPUT_MRI_SCRIPT,
|
||||
input_defsym = INPUT_DEFSYM
|
||||
} input_type;
|
||||
|
||||
extern input_type parser_input;
|
||||
|
||||
extern int hex_mode;
|
||||
extern unsigned int lineno;
|
||||
|
||||
|
@ -40,8 +50,9 @@ extern void ldlex_popstate PARAMS ((void));
|
|||
/* In lexsup.c. */
|
||||
extern int lex_input PARAMS ((void));
|
||||
extern void lex_unput PARAMS ((int));
|
||||
#ifndef yywrap
|
||||
extern int yywrap PARAMS ((void));
|
||||
#endif
|
||||
extern void parse_args PARAMS ((int, char **));
|
||||
extern void parse_line PARAMS ((char*, int));
|
||||
|
||||
#endif
|
||||
|
|
347
ld/ldlex.l
347
ld/ldlex.l
|
@ -43,30 +43,40 @@ This was written by steve chamberlain
|
|||
#include "ldlex.h"
|
||||
#include "ldmain.h"
|
||||
|
||||
int ldgram_in_defsym;
|
||||
/* The type of top-level parser input.
|
||||
yylex and yyparse (indirectly) both check this. */
|
||||
input_type parser_input;
|
||||
|
||||
/* Radix to use for bfd_scan_vma -- 0 (default to base 10) or 16. */
|
||||
int hex_mode;
|
||||
|
||||
/* Line number in the current input file.
|
||||
(FIXME Actually, it doesn't appear to get reset for each file?) */
|
||||
unsigned int lineno = 1;
|
||||
int old;
|
||||
|
||||
/* Support for flex reading from more than one input file (stream).
|
||||
`include_stack' is flex's input state for each open file;
|
||||
`file_name_stack' is the file names.
|
||||
|
||||
If `include_stack_ptr' is 0, we haven't started reading anything yet.
|
||||
Otherwise, stack elements 0 through `include_stack_ptr - 1' are valid. */
|
||||
|
||||
#undef YY_INPUT
|
||||
#define YY_INPUT(buf,result,max_size) yy_input(buf, &result, max_size)
|
||||
#undef YY_FATAL_ERROR
|
||||
#define YY_FATAL_ERROR(s)
|
||||
|
||||
#define MAX_INCLUDE_DEPTH 10
|
||||
YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
|
||||
char *file_name_stack[MAX_INCLUDE_DEPTH];
|
||||
unsigned int include_stack_ptr = 0;
|
||||
static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
|
||||
static char *file_name_stack[MAX_INCLUDE_DEPTH];
|
||||
static unsigned int include_stack_ptr = 0;
|
||||
|
||||
static YY_BUFFER_STATE yy_create_string_buffer PARAMS ((const char *string,
|
||||
int size));
|
||||
size_t size));
|
||||
static void yy_input PARAMS ((char *, int *result, int max_size));
|
||||
|
||||
static void comment PARAMS ((void));
|
||||
static void lex_warn_invalid PARAMS ((char *where, char *what));
|
||||
|
||||
/* STATES
|
||||
COMMAND on command line
|
||||
EXPRESSION definitely in an expression
|
||||
SCRIPT definitely in a script
|
||||
BOTH either EXPRESSION or SCRIPT
|
||||
|
@ -74,6 +84,11 @@ static void lex_warn_invalid PARAMS ((char *where, char *what));
|
|||
MRI in an MRI script
|
||||
*/
|
||||
#define RTOKEN(x) { yylval.token = x; return x; }
|
||||
|
||||
/* Some versions of flex want this. */
|
||||
#ifndef yywrap
|
||||
int yywrap () { return 1; }
|
||||
#endif
|
||||
%}
|
||||
|
||||
%a 4000
|
||||
|
@ -90,7 +105,6 @@ WHITE [ \t\n]+
|
|||
NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
||||
|
||||
|
||||
%s COMMAND
|
||||
%s SCRIPT
|
||||
%s EXPRESSION
|
||||
%s BOTH
|
||||
|
@ -98,149 +112,21 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
|||
%s MRI
|
||||
%%
|
||||
|
||||
if (parser_input != input_selected)
|
||||
{
|
||||
/* The first token of the input determines the initial parser state. */
|
||||
input_type t = parser_input;
|
||||
parser_input = input_selected;
|
||||
return t;
|
||||
}
|
||||
|
||||
<BOTH,SCRIPT,EXPRESSION,COMMAND>"/*" { comment(); }
|
||||
<BOTH,SCRIPT,EXPRESSION>"/*" { comment(); }
|
||||
|
||||
|
||||
<DEFSYMEXP>"-" { RTOKEN('-');}
|
||||
<DEFSYMEXP>"+" { RTOKEN('+');}
|
||||
<DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = buystring(yytext); return NAME; }
|
||||
<DEFSYMEXP>[ \t] { RTOKEN(DEFSYMEND); }
|
||||
<DEFSYMEXP>"=" { RTOKEN('='); }
|
||||
<COMMAND>"--help" { return OPTION_help; }
|
||||
<COMMAND>"--version" { return OPTION_version; }
|
||||
<COMMAND>"-defsym"{WHITE}* { return OPTION_defsym; }
|
||||
<COMMAND>"-format" { return OPTION_format; }
|
||||
<COMMAND>"-noinhibit-exec" { return OPTION_noinhibit_exec; }
|
||||
<COMMAND>"-noinhibit_exec" { return OPTION_noinhibit_exec; }
|
||||
<COMMAND>"-oformat" { return OPTION_oformat; }
|
||||
<COMMAND>"-sort-common" { return OPTION_sort_common;}
|
||||
<COMMAND>"-sort_common" { return OPTION_sort_common;}
|
||||
<COMMAND>"-warn-common" { return OPTION_warn_common;}
|
||||
<COMMAND>"-n" { return OPTION_n; }
|
||||
<COMMAND>"-N" { return OPTION_N; }
|
||||
<COMMAND>"-r" { return OPTION_r; }
|
||||
<COMMAND>"-stats" { return OPTION_stats; }
|
||||
<COMMAND>"-no-keep-memory" { return OPTION_no_keep_memory; }
|
||||
<COMMAND>"-relax" { return OPTION_relax; }
|
||||
<COMMAND>"-i" { return OPTION_r; }
|
||||
<COMMAND>"-Ur" { return OPTION_Ur; }
|
||||
<COMMAND>"-o" { return OPTION_o; }
|
||||
<COMMAND>"-g" { return OPTION_g; }
|
||||
<COMMAND>"-e" { return OPTION_e; }
|
||||
<COMMAND>"-e"{FILENAME} {
|
||||
yylval.name = buystring(yytext+2);
|
||||
return OPTION_esymbol;
|
||||
}
|
||||
<COMMAND>"-b" { return OPTION_b; }
|
||||
<COMMAND>"-dc" { return OPTION_dc; }
|
||||
<COMMAND>"-dp" { return OPTION_dp; }
|
||||
<COMMAND>"-d" { return OPTION_d; }
|
||||
<COMMAND>"-v" { return OPTION_v; }
|
||||
<COMMAND>"-V" { return OPTION_V; }
|
||||
<COMMAND>"-m" { return OPTION_m; }
|
||||
<COMMAND>"-m"{FILENAME} { return OPTION_memul; }
|
||||
<COMMAND>"-M" { return OPTION_M; }
|
||||
<COMMAND>"-Map" { return OPTION_Map;}
|
||||
<COMMAND>"-t" { return OPTION_t; }
|
||||
<COMMAND>"-X" { return OPTION_X; }
|
||||
<COMMAND>"-x" { return OPTION_x; }
|
||||
<COMMAND>"-c" { return OPTION_c; }
|
||||
<COMMAND>"-R" { return OPTION_R; }
|
||||
<COMMAND>"-u" { return OPTION_u; }
|
||||
<COMMAND>"-u"{FILENAME} {
|
||||
yylval.name = buystring(yytext+2);
|
||||
return OPTION_usymbol;
|
||||
}
|
||||
<COMMAND>"-s" { return OPTION_s; }
|
||||
<COMMAND>"-S" { return OPTION_S; }
|
||||
<COMMAND>"-Bstat" { return OPTION_Bstatic; }
|
||||
<COMMAND>"-B"{FILENAME} { /* Ignored */ }
|
||||
<COMMAND>"-l"{FILENAME} {
|
||||
yylval.name = buystring(yytext+2);
|
||||
return OPTION_l;
|
||||
}
|
||||
|
||||
<COMMAND>"-L"{FILENAME} {
|
||||
yylval.name = buystring(yytext+2);
|
||||
return OPTION_Lfile;
|
||||
}
|
||||
<COMMAND>"-L" { return OPTION_L; }
|
||||
<COMMAND>"-Ttext" {
|
||||
yylval.name = ".text";
|
||||
return OPTION_Texp;
|
||||
}
|
||||
<COMMAND>"-Tdata" {
|
||||
yylval.name = ".data";
|
||||
return OPTION_Texp;
|
||||
}
|
||||
<COMMAND>"-Tbss" {
|
||||
yylval.name = ".bss";
|
||||
return OPTION_Texp;
|
||||
}
|
||||
<COMMAND>"-O"([0-9])+ {
|
||||
yylval.integer = atoi (yytext + 2);
|
||||
return OPTION_Oval;
|
||||
}
|
||||
<COMMAND>"-O"{FILENAME} {
|
||||
yylval.name = buystring(yytext+2);
|
||||
return OPTION_Texp;
|
||||
}
|
||||
|
||||
<COMMAND>"-T"{FILENAME} {
|
||||
yylval.name = buystring(yytext+2);
|
||||
return OPTION_Tfile;
|
||||
}
|
||||
<COMMAND>"-T" {
|
||||
return OPTION_T;
|
||||
}
|
||||
|
||||
<COMMAND>"-F"{FILENAME} {
|
||||
return OPTION_F;
|
||||
}
|
||||
<COMMAND>"-F" {
|
||||
return OPTION_F;
|
||||
}
|
||||
|
||||
<COMMAND>"-y" {
|
||||
return OPTION_y;
|
||||
}
|
||||
|
||||
<COMMAND>"-y"{FILENAME} {
|
||||
yylval.name = buystring(yytext+2);
|
||||
return OPTION_ysymbol;
|
||||
}
|
||||
|
||||
<COMMAND>"-A"{FILENAME} {
|
||||
yylval.name = buystring(yytext+2);
|
||||
return OPTION_Aarch;
|
||||
}
|
||||
|
||||
<COMMAND>"-retain-symbols-file" { return OPTION_RETAIN_SYMBOLS_FILE; }
|
||||
|
||||
<COMMAND>"-EB" {
|
||||
return OPTION_EB;
|
||||
}
|
||||
<COMMAND>"-EL" {
|
||||
return OPTION_EL;
|
||||
}
|
||||
<COMMAND>"-G" {
|
||||
return OPTION_G;
|
||||
}
|
||||
<COMMAND>"-G"([0-9])+ {
|
||||
yylval.integer = atoi (yytext + 2);
|
||||
return OPTION_Gval;
|
||||
}
|
||||
|
||||
<COMMAND>"-Qy" { return OPTION_Qy; }
|
||||
<COMMAND>"-dn" { return OPTION_dn; }
|
||||
<COMMAND>"-Y" { return OPTION_Y; }
|
||||
<COMMAND>"-YP,"{FILENAME} {
|
||||
yylval.name = buystring (yytext+4);
|
||||
return OPTION_YP;
|
||||
}
|
||||
<COMMAND>"-non_shared" { return OPTION_non_shared; }
|
||||
<COMMAND>"-call_shared" { return OPTION_call_shared; }
|
||||
|
||||
<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
|
||||
yylval.integer = bfd_scan_vma (yytext+1, 0,16);
|
||||
|
@ -311,18 +197,13 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
|||
<BOTH,SCRIPT,EXPRESSION>"/" { RTOKEN('/');}
|
||||
<BOTH,SCRIPT,EXPRESSION>"%" { RTOKEN('%');}
|
||||
<BOTH,SCRIPT,EXPRESSION>"<" { RTOKEN('<');}
|
||||
<BOTH,SCRIPT,EXPRESSION>">" { RTOKEN('>');}
|
||||
<MRI,BOTH,SCRIPT,EXPRESSION>"=" { RTOKEN('=');}
|
||||
<BOTH,SCRIPT,EXPRESSION>"}" { RTOKEN('}') ; }
|
||||
<BOTH,SCRIPT,EXPRESSION>"{" { RTOKEN('{'); }
|
||||
<BOTH,SCRIPT,EXPRESSION>")" { RTOKEN(')');}
|
||||
<BOTH,SCRIPT,EXPRESSION>"(" { RTOKEN('(');}
|
||||
<BOTH,SCRIPT,EXPRESSION>"]" { RTOKEN(']');}
|
||||
<BOTH,SCRIPT,EXPRESSION>"[" { RTOKEN('[');}
|
||||
<BOTH,SCRIPT,EXPRESSION>":" { RTOKEN(':'); }
|
||||
<BOTH,SCRIPT,EXPRESSION>";" { RTOKEN(';');}
|
||||
<BOTH,SCRIPT,EXPRESSION>"-" { RTOKEN('-');}
|
||||
<BOTH,SCRIPT,EXPRESSION>"/" { RTOKEN('/');}
|
||||
<BOTH,SCRIPT>"MEMORY" { RTOKEN(MEMORY);}
|
||||
<BOTH,SCRIPT>"ORIGIN" { RTOKEN(ORIGIN);}
|
||||
<BOTH,SCRIPT>"BLOCK" { RTOKEN(BLOCK);}
|
||||
|
@ -395,12 +276,6 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
|||
<MRI>"sect" { RTOKEN(SECT); }
|
||||
<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
|
||||
|
||||
<COMMAND>{CMDFILENAMECHAR1}{CMDFILENAMECHAR}* {
|
||||
yylval.name = buystring(yytext);
|
||||
return NAME;
|
||||
}
|
||||
|
||||
|
||||
<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
|
||||
/* Filename without commas, needed to parse mri stuff */
|
||||
yylval.name = buystring(yytext);
|
||||
|
@ -412,11 +287,11 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
|||
yylval.name = buystring(yytext);
|
||||
return NAME;
|
||||
}
|
||||
<SCRIPT,COMMAND>{FILENAMECHAR}* { yylval.name = buystring(yytext);
|
||||
<SCRIPT>{FILENAMECHAR}* { yylval.name = buystring(yytext);
|
||||
return NAME;
|
||||
}
|
||||
|
||||
<EXPRESSION,BOTH,COMMAND,SCRIPT>"\""[^\"]*"\"" {
|
||||
<EXPRESSION,BOTH,SCRIPT>"\""[^\"]*"\"" {
|
||||
/* No matter the state, quotes
|
||||
give what's inside */
|
||||
yylval.name = buystring(yytext+1);
|
||||
|
@ -424,7 +299,7 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
|||
return NAME;
|
||||
}
|
||||
<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
|
||||
<MRI,COMMAND,BOTH,SCRIPT,EXPRESSION>[ \t]
|
||||
<MRI,BOTH,SCRIPT,EXPRESSION>[ \t]
|
||||
|
||||
<<EOF>> {
|
||||
include_stack_ptr--;
|
||||
|
@ -438,24 +313,20 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
|||
yy_switch_to_buffer(include_stack[include_stack_ptr]);
|
||||
|
||||
}
|
||||
if (include_stack_ptr==1)
|
||||
{
|
||||
BEGIN(COMMAND);
|
||||
}
|
||||
else
|
||||
{
|
||||
BEGIN(SCRIPT);
|
||||
ldfile_input_filename = file_name_stack[include_stack_ptr-1];
|
||||
}
|
||||
BEGIN(SCRIPT);
|
||||
ldfile_input_filename = file_name_stack[include_stack_ptr-1];
|
||||
|
||||
return END;
|
||||
}
|
||||
|
||||
<COMMAND>. lex_warn_invalid(" on command line", yytext);
|
||||
<SCRIPT,MRI>. lex_warn_invalid(" in script", yytext);
|
||||
<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid(" in expression", yytext);
|
||||
|
||||
%%
|
||||
|
||||
|
||||
/* Switch flex to reading script file NAME, open on FILE,
|
||||
saving the current input info on the include stack. */
|
||||
|
||||
void
|
||||
lex_push_file (file, name)
|
||||
|
@ -463,123 +334,109 @@ lex_push_file (file, name)
|
|||
char *name;
|
||||
{
|
||||
if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
|
||||
{
|
||||
einfo("%F:includes nested too deeply\n");
|
||||
}
|
||||
{
|
||||
einfo("%F:includes nested too deeply\n");
|
||||
}
|
||||
file_name_stack[include_stack_ptr] = name;
|
||||
include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
|
||||
|
||||
include_stack_ptr++;
|
||||
yyin = file;
|
||||
yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
|
||||
|
||||
BEGIN(SCRIPT);
|
||||
BEGIN (SCRIPT);
|
||||
}
|
||||
|
||||
/* Return a newly created flex input buffer containing STRING,
|
||||
which is SIZE bytes long. */
|
||||
|
||||
static YY_BUFFER_STATE
|
||||
yy_create_string_buffer (string, size)
|
||||
yy_create_string_buffer (string, size)
|
||||
CONST char *string;
|
||||
int size;
|
||||
size_t size;
|
||||
{
|
||||
YY_BUFFER_STATE b;
|
||||
|
||||
b = (YY_BUFFER_STATE) malloc( sizeof( struct yy_buffer_state ) );
|
||||
/* Calls to m-alloc get turned by sed into xm-alloc. */
|
||||
b = (YY_BUFFER_STATE) malloc (sizeof (struct yy_buffer_state));
|
||||
b->yy_input_file = 0;
|
||||
|
||||
if ( ! b )
|
||||
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
|
||||
|
||||
b->yy_buf_size = size;
|
||||
|
||||
/* yy_ch_buf has to be 2 characters longer than the size given because
|
||||
* we need to put in 2 end-of-buffer characters.
|
||||
*/
|
||||
b->yy_ch_buf = (YY_CHAR *) malloc( (unsigned) (b->yy_buf_size + 3) );
|
||||
|
||||
if ( ! b->yy_ch_buf )
|
||||
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
|
||||
|
||||
we need to put in 2 end-of-buffer characters. */
|
||||
b->yy_ch_buf = (YY_CHAR *) malloc ((unsigned) (b->yy_buf_size + 3));
|
||||
|
||||
b->yy_ch_buf[0] = '\n';
|
||||
strcpy(b->yy_ch_buf+1, string);
|
||||
strcpy (b->yy_ch_buf+1, string);
|
||||
b->yy_ch_buf[size+1] = YY_END_OF_BUFFER_CHAR;
|
||||
b->yy_ch_buf[size+2] = YY_END_OF_BUFFER_CHAR;
|
||||
b->yy_n_chars = size+1;
|
||||
b->yy_n_chars = size+1;
|
||||
b->yy_buf_pos = &b->yy_ch_buf[1];
|
||||
|
||||
b->yy_eof_status = EOF_NOT_SEEN;
|
||||
|
||||
return ( b );
|
||||
return b;
|
||||
}
|
||||
|
||||
|
||||
/* Switch flex to reading from STRING, saving the current input info
|
||||
on the include stack. */
|
||||
|
||||
void
|
||||
lex_redirect (string)
|
||||
CONST char *string;
|
||||
CONST char *string;
|
||||
{
|
||||
YY_BUFFER_STATE tmp;
|
||||
|
||||
int len = strlen(string);
|
||||
yy_init = 0 ;
|
||||
yy_init = 0;
|
||||
if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
|
||||
{
|
||||
einfo("%F: macros nested too deeply\n");
|
||||
}
|
||||
{
|
||||
einfo("%F: macros nested too deeply\n");
|
||||
}
|
||||
file_name_stack[include_stack_ptr] = "redirect";
|
||||
include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
|
||||
include_stack_ptr++;
|
||||
tmp = yy_create_string_buffer(string, len);
|
||||
|
||||
yy_switch_to_buffer(tmp);
|
||||
BEGIN(COMMAND);
|
||||
yyout = stdout;
|
||||
tmp = yy_create_string_buffer (string, strlen (string));
|
||||
yy_switch_to_buffer (tmp);
|
||||
BEGIN (SCRIPT);
|
||||
}
|
||||
|
||||
/* Functions to switch to a different flex start condition,
|
||||
saving the current start condition on `state_stack'. */
|
||||
|
||||
int state_stack[20];
|
||||
int *state_stack_p = state_stack;
|
||||
static int state_stack[MAX_INCLUDE_DEPTH * 2];
|
||||
static int *state_stack_p = state_stack;
|
||||
|
||||
void
|
||||
ldlex_script ()
|
||||
{
|
||||
*(state_stack_p)++ = yy_start;
|
||||
|
||||
BEGIN(SCRIPT);
|
||||
BEGIN (SCRIPT);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ldlex_mri_script ()
|
||||
{
|
||||
*(state_stack_p)++ = yy_start;
|
||||
BEGIN(MRI);
|
||||
BEGIN (MRI);
|
||||
}
|
||||
|
||||
void
|
||||
ldlex_defsym ()
|
||||
{
|
||||
*(state_stack_p)++ = yy_start;
|
||||
BEGIN(DEFSYMEXP);
|
||||
BEGIN (DEFSYMEXP);
|
||||
}
|
||||
|
||||
void
|
||||
ldlex_expression ()
|
||||
{
|
||||
*(state_stack_p)++ = yy_start;
|
||||
BEGIN(EXPRESSION);
|
||||
|
||||
BEGIN (EXPRESSION);
|
||||
}
|
||||
|
||||
void
|
||||
ldlex_both ()
|
||||
{
|
||||
*(state_stack_p)++ = yy_start;
|
||||
BEGIN(BOTH);
|
||||
}
|
||||
void
|
||||
ldlex_command ()
|
||||
{
|
||||
*(state_stack_p)++ = yy_start;
|
||||
BEGIN(COMMAND);
|
||||
BEGIN (BOTH);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -587,53 +444,69 @@ ldlex_popstate ()
|
|||
{
|
||||
yy_start = *(--state_stack_p);
|
||||
}
|
||||
|
||||
|
||||
/* Place up to MAX_SIZE characters in BUF and return in *RESULT
|
||||
either the number of characters read, or 0 to indicate EOF. */
|
||||
|
||||
static void
|
||||
yy_input(buf, result, max_size)
|
||||
char *buf;
|
||||
int *result;
|
||||
int max_size;
|
||||
yy_input (buf, result, max_size)
|
||||
char *buf;
|
||||
int *result;
|
||||
int max_size;
|
||||
{
|
||||
*result = 0;
|
||||
if (yy_current_buffer->yy_input_file)
|
||||
{
|
||||
if (yyin)
|
||||
if ( (*result = read( fileno(yyin), (char *) buf, max_size )) < 0 )
|
||||
YY_FATAL_ERROR( "read() in flex scanner failed" );
|
||||
}
|
||||
{
|
||||
if (yyin)
|
||||
{
|
||||
*result = read (fileno (yyin), (char *) buf, max_size);
|
||||
if (*result < 0)
|
||||
einfo ("%F%P: read in flex scanner failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Eat the rest of a C-style comment. */
|
||||
|
||||
static void
|
||||
comment ()
|
||||
{
|
||||
int c;
|
||||
|
||||
while (1)
|
||||
{
|
||||
c = input();
|
||||
while (c !='*' && c != EOF)
|
||||
while (c != '*' && c != EOF)
|
||||
{
|
||||
if (c == '\n') lineno++;
|
||||
if (c == '\n')
|
||||
lineno++;
|
||||
c = input();
|
||||
}
|
||||
|
||||
|
||||
if (c == '*')
|
||||
{
|
||||
c = input();
|
||||
while ( c == '*')
|
||||
while (c == '*')
|
||||
c = input();
|
||||
if ( c == '/' )
|
||||
if (c == '/')
|
||||
break; /* found the end */
|
||||
}
|
||||
|
||||
if ( c == EOF )
|
||||
if (c == '\n')
|
||||
lineno++;
|
||||
|
||||
if (c == EOF)
|
||||
{
|
||||
einfo( "%F%P :EOF in comment\n");
|
||||
einfo( "%F%P: EOF in comment\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Warn the user about a garbage character WHAT in the input
|
||||
in context WHERE. */
|
||||
|
||||
static void
|
||||
lex_warn_invalid (where, what)
|
||||
char *where, *what;
|
||||
|
|
14
ld/ldmain.c
14
ld/ldmain.c
|
@ -22,6 +22,7 @@ the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
|||
#include "bfd.h"
|
||||
#include "sysdep.h"
|
||||
#include <stdio.h>
|
||||
#include "libiberty.h"
|
||||
#include "bfdlink.h"
|
||||
|
||||
#include "config.h"
|
||||
|
@ -205,16 +206,11 @@ main (argc, argv)
|
|||
char *s = ldemul_get_script (&isfile);
|
||||
|
||||
if (isfile)
|
||||
{
|
||||
/* sizeof counts the terminating NUL. */
|
||||
size_t size = strlen (s) + sizeof ("-T ");
|
||||
char *buf = (char *) xmalloc(size);
|
||||
sprintf (buf, "-T %s", s);
|
||||
parse_line (buf, 0);
|
||||
free (buf);
|
||||
}
|
||||
ldfile_open_command_file (s);
|
||||
else
|
||||
parse_line (s, 1);
|
||||
lex_redirect (s);
|
||||
parser_input = input_script;
|
||||
yyparse ();
|
||||
}
|
||||
|
||||
if (link_info.relocateable && command_line.relax)
|
||||
|
|
322
ld/lexsup.c
Normal file
322
ld/lexsup.c
Normal file
|
@ -0,0 +1,322 @@
|
|||
/* Parse options for the GNU linker.
|
||||
Copyright (C) 1991, 92, 93, 94 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GLD, the Gnu Linker.
|
||||
|
||||
GLD 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, or (at your option)
|
||||
any later version.
|
||||
|
||||
GLD 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 GLD; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||
|
||||
#include "bfd.h"
|
||||
#include "sysdep.h"
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include "getopt.h"
|
||||
#include "bfdlink.h"
|
||||
#include "config.h"
|
||||
#include "ld.h"
|
||||
#include "ldmain.h"
|
||||
#include "ldmisc.h"
|
||||
#include "ldexp.h"
|
||||
#include "ldlang.h"
|
||||
#include "ldgram.h"
|
||||
#include "ldlex.h"
|
||||
#include "ldfile.h"
|
||||
|
||||
/* Omit args to avoid the possibility of clashing with a system header
|
||||
that might disagree about consts. */
|
||||
unsigned long strtoul ();
|
||||
|
||||
static void set_default_dirlist PARAMS ((char *dirlist_ptr));
|
||||
static void set_section_start PARAMS ((char *sect, char *valstr));
|
||||
|
||||
void
|
||||
parse_args (argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
/* 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
|
||||
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:";
|
||||
|
||||
static struct option longopts[] =
|
||||
{
|
||||
{"call_shared", no_argument, NULL, 158},
|
||||
{"dc", no_argument, NULL, 'd'},
|
||||
{"defsym", required_argument, NULL, 160},
|
||||
{"dn", no_argument, NULL, 158},
|
||||
{"dp", no_argument, NULL, 'd'},
|
||||
{"EB", no_argument, NULL, 150},
|
||||
{"EL", no_argument, NULL, 151},
|
||||
{"format", required_argument, NULL, 'b'},
|
||||
{"help", no_argument, NULL, 164},
|
||||
{"Map", required_argument, NULL, 152},
|
||||
{"no-keep-memory", no_argument, NULL, 168},
|
||||
{"noinhibit-exec", no_argument, NULL, 169},
|
||||
{"noinhibit_exec", no_argument, NULL, 169},
|
||||
{"non_shared", no_argument, NULL, 158},
|
||||
{"oformat", required_argument, NULL, 172},
|
||||
{"Qy", no_argument, NULL, 158},
|
||||
{"relax", no_argument, NULL, 173},
|
||||
{"retain-symbols-file", no_argument, NULL, 174},
|
||||
{"sort-common", no_argument, NULL, 175},
|
||||
{"sort_common", no_argument, NULL, 175},
|
||||
{"stats", no_argument, NULL, 176},
|
||||
{"Tbss", required_argument, NULL, 154},
|
||||
{"Tdata", required_argument, NULL, 155},
|
||||
{"Ttext", required_argument, NULL, 156},
|
||||
{"Ur", no_argument, NULL, 157},
|
||||
{"version", no_argument, NULL, 178},
|
||||
{"warn-common", no_argument, NULL, 177},
|
||||
{"YP,", required_argument, NULL, 158},
|
||||
{NULL, no_argument, NULL, 0}
|
||||
};
|
||||
|
||||
while (1)
|
||||
{
|
||||
/* getopt_long_only is like getopt_long, but '-' as well as '--' can
|
||||
indicate a long option. */
|
||||
int optc = getopt_long_only (argc, argv, shortopts, longopts,
|
||||
(int *) NULL);
|
||||
if (optc == -1)
|
||||
break;
|
||||
|
||||
switch (optc)
|
||||
{
|
||||
default:
|
||||
xexit (1);
|
||||
case 1: /* File name. */
|
||||
lang_add_input_file (optarg, lang_input_file_is_file_enum,
|
||||
(char *) NULL);
|
||||
break;
|
||||
|
||||
case 'A':
|
||||
ldfile_add_arch (optarg);
|
||||
break;
|
||||
case 'B':
|
||||
/* Ignore. */
|
||||
break;
|
||||
case 'b':
|
||||
lang_add_target (optarg);
|
||||
break;
|
||||
case 'c':
|
||||
ldfile_open_command_file (optarg);
|
||||
parser_input = input_mri_script;
|
||||
yyparse ();
|
||||
break;
|
||||
case 158: /* call_shared, dn, non_shared, Qy, YP */
|
||||
set_default_dirlist (optarg);
|
||||
break;
|
||||
case 'd':
|
||||
command_line.force_common_definition = true;
|
||||
break;
|
||||
case 160: /* defsym */
|
||||
lex_redirect (optarg);
|
||||
parser_input = input_defsym;
|
||||
yyparse ();
|
||||
break;
|
||||
case 150: /* EB */
|
||||
/* FIXME: This is currently ignored. It means
|
||||
``produce a big-endian object file''. It could
|
||||
be used to select an output format. */
|
||||
break;
|
||||
case 151: /* EL */
|
||||
/* FIXME: This is currently ignored. It means
|
||||
``produce a little-endian object file''. It could
|
||||
be used to select an output format. */
|
||||
break;
|
||||
case 'e':
|
||||
lang_add_entry (optarg);
|
||||
break;
|
||||
case 'F':
|
||||
/* Ignore. */
|
||||
break;
|
||||
case 'G':
|
||||
{
|
||||
char *end;
|
||||
g_switch_value = strtoul (optarg, &end, 0);
|
||||
if (*end)
|
||||
einfo ("%P%F: invalid number `%s'", optarg);
|
||||
}
|
||||
break;
|
||||
case 'g':
|
||||
/* Ignore. */
|
||||
break;
|
||||
case 164: /* help */
|
||||
help ();
|
||||
xexit (0);
|
||||
break;
|
||||
case 'L':
|
||||
ldfile_add_library_path (optarg);
|
||||
break;
|
||||
case 'l':
|
||||
lang_add_input_file (optarg, lang_input_file_is_l_enum,
|
||||
(char *) NULL);
|
||||
break;
|
||||
case 'M':
|
||||
config.map_filename = "-";
|
||||
break;
|
||||
case 'm':
|
||||
/* Ignore. Was handled in a pre-parse. */
|
||||
break;
|
||||
case 152: /* Map */
|
||||
write_map = true;
|
||||
config.map_filename = optarg;
|
||||
break;
|
||||
case 'N':
|
||||
config.text_read_only = false;
|
||||
config.magic_demand_paged = false;
|
||||
break;
|
||||
case 'n':
|
||||
config.magic_demand_paged = false;
|
||||
break;
|
||||
case 168: /* no-keep-memory */
|
||||
link_info.keep_memory = false;
|
||||
break;
|
||||
case 169: /* noinhibit-exec */
|
||||
force_make_executable = true;
|
||||
break;
|
||||
case 'O':
|
||||
/* FIXME "-O<non-digits> <value>" used to set the address of
|
||||
section <non-digits>. Was this for compatibility with
|
||||
something, or can we create a new option to do that
|
||||
(with a syntax similar to -defsym)?
|
||||
getopt can't handle two args to an option without kludges. */
|
||||
set_default_dirlist (optarg);
|
||||
break;
|
||||
case 'o':
|
||||
lang_add_output (optarg, 0);
|
||||
break;
|
||||
case 172: /* oformat */
|
||||
lang_add_output_format (optarg, 0);
|
||||
break;
|
||||
case 'r':
|
||||
link_info.relocateable = true;
|
||||
config.build_constructors = false;
|
||||
config.magic_demand_paged = false;
|
||||
config.text_read_only = false;
|
||||
break;
|
||||
case 'R':
|
||||
lang_add_input_file (optarg,
|
||||
lang_input_file_is_symbols_only_enum,
|
||||
(char *) NULL);
|
||||
break;
|
||||
case 173: /* relax */
|
||||
command_line.relax = true;
|
||||
break;
|
||||
case 174: /* retain-symbols-file */
|
||||
add_keepsyms_file (optarg);
|
||||
break;
|
||||
case 'S':
|
||||
link_info.strip = strip_debugger;
|
||||
break;
|
||||
case 's':
|
||||
link_info.strip = strip_all;
|
||||
break;
|
||||
case 175: /* sort-common */
|
||||
config.sort_common = true;
|
||||
break;
|
||||
case 176: /* stats */
|
||||
config.stats = true;
|
||||
break;
|
||||
case 't':
|
||||
trace_files = true;
|
||||
break;
|
||||
case 'T':
|
||||
ldfile_open_command_file (optarg);
|
||||
parser_input = input_script;
|
||||
yyparse ();
|
||||
break;
|
||||
case 154: /* Tbss */
|
||||
set_section_start (".bss", optarg);
|
||||
break;
|
||||
case 155: /* Tdata */
|
||||
set_section_start (".data", optarg);
|
||||
break;
|
||||
case 156: /* Ttext */
|
||||
set_section_start (".text", optarg);
|
||||
break;
|
||||
case 157: /* Ur */
|
||||
link_info.relocateable = true;
|
||||
config.build_constructors = true;
|
||||
config.magic_demand_paged = false;
|
||||
config.text_read_only = false;
|
||||
break;
|
||||
case 'u':
|
||||
ldlang_add_undef (optarg);
|
||||
break;
|
||||
case 'V':
|
||||
ldversion (1);
|
||||
version_printed = true;
|
||||
trace_file_tries = true;
|
||||
break;
|
||||
case 'v':
|
||||
ldversion (0);
|
||||
version_printed = true;
|
||||
break;
|
||||
case 178: /* version */
|
||||
ldversion (0);
|
||||
version_printed = true;
|
||||
break;
|
||||
case 177: /* warn-common */
|
||||
config.warn_common = true;
|
||||
break;
|
||||
case 'X':
|
||||
link_info.discard = discard_l;
|
||||
break;
|
||||
case 'x':
|
||||
link_info.discard = discard_all;
|
||||
break;
|
||||
case 'y':
|
||||
add_ysym (optarg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Add the (colon-separated) elements of DIRLIST_PTR to the
|
||||
library search path. */
|
||||
|
||||
static void
|
||||
set_default_dirlist (dirlist_ptr)
|
||||
char *dirlist_ptr;
|
||||
{
|
||||
char *p;
|
||||
|
||||
while (1)
|
||||
{
|
||||
p = strchr (dirlist_ptr, ':');
|
||||
if (p != NULL)
|
||||
*p = 0;
|
||||
if (*dirlist_ptr)
|
||||
ldfile_add_library_path (dirlist_ptr);
|
||||
if (p == NULL)
|
||||
break;
|
||||
*p = ':';
|
||||
dirlist_ptr = p + 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
set_section_start (sect, valstr)
|
||||
char *sect, *valstr;
|
||||
{
|
||||
char *end;
|
||||
unsigned long val = strtoul (valstr, &end, 16);
|
||||
if (*end)
|
||||
einfo ("%P%F: invalid hex number `%s'", valstr);
|
||||
lang_section_start (sect, exp_intop (val));
|
||||
}
|
Loading…
Reference in a new issue