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)
|
Tue Feb 22 09:21:18 1994 Ian Lance Taylor (ian@cygnus.com)
|
||||||
|
|
||||||
* ldlang.c (lang_size_sections): Only align section to alignment
|
* ldlang.c (lang_size_sections): Only align section to alignment
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# Makefile for the GNU linker ld (version 2)
|
# Makefile for the GNU linker ld (version 2)
|
||||||
# Copyright (C) 1989, 90, 91, 92, 93, 1994 Free Software Foundation, Inc.
|
# 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
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
|
@ -496,7 +496,7 @@ configdoc.texi: ${DOCVER}-doc.texi
|
||||||
|
|
||||||
# TeX output
|
# TeX output
|
||||||
dvi: ld.dvi
|
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
|
TEXINPUTS=$(BFDDIR)/doc:$$TEXINPUTS $(TEXI2DVI) $(srcdir)/ld.texinfo
|
||||||
|
|
||||||
ldint.dvi: $(srcdir)/ldint.texinfo
|
ldint.dvi: $(srcdir)/ldint.texinfo
|
||||||
|
@ -735,7 +735,7 @@ ldexp.o : ldexp.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
||||||
ldgram.h ldlang.h
|
ldgram.h ldlang.h
|
||||||
ldfile.o : ldfile.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
ldfile.o : ldfile.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
||||||
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.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 \
|
ldlang.o : ldlang.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
||||||
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
|
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
|
||||||
$(INCDIR)/bfdlink.h ld.h ldmain.h ldgram.h ldexp.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
|
ldfile.h ldctor.h
|
||||||
ldmisc.o : ldmisc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
ldmisc.o : ldmisc.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
||||||
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.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 \
|
ldver.o : ldver.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
||||||
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
|
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.h \
|
||||||
ld.h ldver.h ldemul.h ldmain.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
|
ldmisc.h ldgram.h ldmain.h
|
||||||
lexsup.o : lexsup.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
lexsup.o : lexsup.c ../bfd/bfd.h $(INCDIR)/ansidecl.h \
|
||||||
$(INCDIR)/obstack.h ../bfd/sysdep.h $(INCDIR)/fopen-same.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 \
|
mri.o : mri.c ../bfd/bfd.h $(INCDIR)/ansidecl.h $(INCDIR)/obstack.h \
|
||||||
../bfd/sysdep.h $(INCDIR)/fopen-same.h ld.h ldexp.h \
|
../bfd/sysdep.h $(INCDIR)/fopen-same.h ld.h ldexp.h \
|
||||||
ldlang.h ldmisc.h mri.h ldgram.h
|
ldlang.h ldmisc.h mri.h ldgram.h
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
# This shell script emits a C file. -*- C -*-
|
# This shell script emits a C file. -*- C -*-
|
||||||
# It does some substitutions.
|
# It does some substitutions.
|
||||||
cat >em_${EMULATION_NAME}.c <<EOF
|
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.
|
Copyright (C) 1991, 1993 Free Software Foundation, Inc.
|
||||||
Written by Steve Chamberlain steve@cygnus.com
|
Written by Steve Chamberlain steve@cygnus.com
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
|
||||||
#include "ldmain.h"
|
#include "ldmain.h"
|
||||||
#include "ldctor.h"
|
#include "ldctor.h"
|
||||||
|
|
||||||
static void hppaosf_before_parse()
|
static void hppaelf_before_parse()
|
||||||
{
|
{
|
||||||
link_info.lprefix = "L$";
|
link_info.lprefix = "L$";
|
||||||
link_info.lprefix_len = 2;
|
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 lang_input_section_type *stub_input_section = NULL;
|
||||||
|
|
||||||
static void
|
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 *s;
|
||||||
lang_statement_union_type **prev;
|
lang_statement_union_type **prev;
|
||||||
{
|
{
|
||||||
|
@ -58,14 +58,14 @@ hppaosf_search_for_padding_statements(s,prev)
|
||||||
switch (s->header.type)
|
switch (s->header.type)
|
||||||
{
|
{
|
||||||
case lang_constructors_statement_enum:
|
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;
|
break;
|
||||||
case lang_output_section_statement_enum:
|
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);
|
(s->output_section_statement.children.head,&s->output_section_statement.children.head);
|
||||||
break;
|
break;
|
||||||
case lang_wild_statement_enum:
|
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);
|
(s->wild_statement.children.head,&s->wild_statement.children.head);
|
||||||
break;
|
break;
|
||||||
case lang_data_statement_enum:
|
case lang_data_statement_enum:
|
||||||
|
@ -96,7 +96,7 @@ hppaosf_search_for_padding_statements(s,prev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hppaosf_finish()
|
hppaelf_finish()
|
||||||
{
|
{
|
||||||
extern asymbol *hppa_look_for_stubs_in_section();
|
extern asymbol *hppa_look_for_stubs_in_section();
|
||||||
|
|
||||||
|
@ -151,12 +151,12 @@ hppaosf_finish()
|
||||||
|
|
||||||
/* If we've added stubs,remove the padding_statements because */
|
/* If we've added stubs,remove the padding_statements because */
|
||||||
/* they are no longer valid */
|
/* 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
|
static void
|
||||||
hppaosf_create_output_section_statements()
|
hppaelf_create_output_section_statements()
|
||||||
{
|
{
|
||||||
asection *stub_sec;
|
asection *stub_sec;
|
||||||
asection *output_text_sec = bfd_make_section_old_way(output_bfd,".text");
|
asection *output_text_sec = bfd_make_section_old_way(output_bfd,".text");
|
||||||
|
@ -215,7 +215,7 @@ hppaosf_create_output_section_statements()
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
hppaosf_set_output_arch()
|
hppaelf_set_output_arch()
|
||||||
{
|
{
|
||||||
/* Set the output architecture and machine if possible */
|
/* Set the output architecture and machine if possible */
|
||||||
unsigned long machine = 0;
|
unsigned long machine = 0;
|
||||||
|
@ -223,7 +223,7 @@ hppaosf_set_output_arch()
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
hppaosf_get_script(isfile)
|
hppaelf_get_script(isfile)
|
||||||
int *isfile;
|
int *isfile;
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
|
@ -234,8 +234,8 @@ then
|
||||||
# sed commands to quote an ld script as a C string.
|
# sed commands to quote an ld script as a C string.
|
||||||
sc='s/["\\]/\\&/g
|
sc='s/["\\]/\\&/g
|
||||||
s/$/\\n\\/
|
s/$/\\n\\/
|
||||||
1s/^/"{/
|
1s/^/"/
|
||||||
$s/$/n}"/
|
$s/$/n"/
|
||||||
'
|
'
|
||||||
|
|
||||||
cat >>em_${EMULATION_NAME}.c <<EOF
|
cat >>em_${EMULATION_NAME}.c <<EOF
|
||||||
|
@ -279,20 +279,20 @@ fi
|
||||||
|
|
||||||
cat >>em_${EMULATION_NAME}.c <<EOF
|
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,
|
syslib_default,
|
||||||
hll_default,
|
hll_default,
|
||||||
after_parse_default,
|
after_parse_default,
|
||||||
after_allocation_default,
|
after_allocation_default,
|
||||||
hppaosf_set_output_arch,
|
hppaelf_set_output_arch,
|
||||||
ldemul_default_target,
|
ldemul_default_target,
|
||||||
before_allocation_default,
|
before_allocation_default,
|
||||||
hppaosf_get_script,
|
hppaelf_get_script,
|
||||||
"hppaosf",
|
"hppaelf",
|
||||||
"elf32-hppa",
|
"elf32-hppa",
|
||||||
hppaosf_finish,
|
hppaelf_finish,
|
||||||
hppaosf_create_output_section_statements
|
hppaelf_create_output_section_statements
|
||||||
};
|
};
|
||||||
EOF
|
EOF
|
||||||
|
|
|
@ -57,8 +57,8 @@ then
|
||||||
# sed commands to quote an ld script as a C string.
|
# sed commands to quote an ld script as a C string.
|
||||||
sc='s/["\\]/\\&/g
|
sc='s/["\\]/\\&/g
|
||||||
s/$/\\n\\/
|
s/$/\\n\\/
|
||||||
1s/^/"{/
|
1s/^/"/
|
||||||
$s/$/n}"/
|
$s/$/n"/
|
||||||
'
|
'
|
||||||
|
|
||||||
cat >>em_${EMULATION_NAME}.c <<EOF
|
cat >>em_${EMULATION_NAME}.c <<EOF
|
||||||
|
|
287
ld/ld.texinfo
287
ld/ld.texinfo
|
@ -17,7 +17,7 @@ END-INFO-DIR-ENTRY
|
||||||
@ifinfo
|
@ifinfo
|
||||||
This file documents the GNU linker LD.
|
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
|
Permission is granted to make and distribute verbatim copies of
|
||||||
this manual provided the copyright notice and this permission notice
|
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
|
@subtitle The GNU linker
|
||||||
@sp 1
|
@sp 1
|
||||||
@subtitle @code{ld} version 2
|
@subtitle @code{ld} version 2
|
||||||
@subtitle March 1993
|
@subtitle January 1994
|
||||||
@author Steve Chamberlain and Roland Pesch
|
@author Steve Chamberlain and Roland Pesch
|
||||||
@author Cygnus Support
|
@author Cygnus Support
|
||||||
@page
|
@page
|
||||||
|
@ -58,13 +58,14 @@ notice identical to this one except for the removal of this paragraph
|
||||||
\hfill Cygnus Support\par
|
\hfill Cygnus Support\par
|
||||||
\hfill steve\@cygnus.com, pesch\@cygnus.com\par
|
\hfill steve\@cygnus.com, pesch\@cygnus.com\par
|
||||||
\hfill {\it Using LD, the GNU linker}\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.
|
\global\parindent=0pt % Steve likes it this way.
|
||||||
@end tex
|
@end tex
|
||||||
|
|
||||||
@vskip 0pt plus 1filll
|
@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
|
Permission is granted to make and distribute verbatim copies of
|
||||||
this manual provided the copyright notice and this permission notice
|
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
|
to operate on object files. This allows @code{ld} to read, combine, and
|
||||||
write object files in many different formats---for example, COFF or
|
write object files in many different formats---for example, COFF or
|
||||||
@code{a.out}. Different formats may be linked together to produce any
|
@code{a.out}. Different formats may be linked together to produce any
|
||||||
available kind of object file. @xref{BFD} for a list of formats
|
available kind of object file. @xref{BFD}, for more information.
|
||||||
supported on various architectures.
|
|
||||||
@end ifclear
|
@end ifclear
|
||||||
|
|
||||||
Aside from its flexibility, the GNU linker is more helpful than other
|
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 ]
|
[ -c @var{MRI-commandfile} ] [ -d | -dc | -dp ]
|
||||||
[ -defsym @var{symbol}=@var{expression} ]
|
[ -defsym @var{symbol}=@var{expression} ]
|
||||||
[ -e @var{entry} ] [ -F ] [ -F @var{format} ]
|
[ -e @var{entry} ] [ -F ] [ -F @var{format} ]
|
||||||
[ -format @var{input-format} ] [ -g ] [ -G @var{size} ] [ --help ] [ -i ]
|
[ -format @var{input-format} ] [ -g ] [ -G @var{size} ] [ -help ]
|
||||||
[ -l@var{archive} ] [ -L@var{searchdir} ] [ -M ] [ -Map @var{mapfile} ]
|
[ -i ] [ -l@var{archive} ] [ -L@var{searchdir} ] [ -M ]
|
||||||
[ -m @var{emulation} ] [ -N | -n ] [ -noinhibit-exec ]
|
[ -Map @var{mapfile} ] [ -m @var{emulation} ] [ -N | -n ]
|
||||||
[ -oformat @var{output-format} ] [ -R @var{filename} ] [ -relax ]
|
[ -noinhibit-exec ] [ -oformat @var{output-format} ]
|
||||||
[ -retain-symbols-file @var{filename} ]
|
[ -R @var{filename} ] [ -relax ] [ -retain-symbols-file @var{filename} ]
|
||||||
[ -r | -Ur ] [ -S ] [ -s ] [ -sort-common ] [ -stats ]
|
[ -r | -Ur ] [ -S ] [ -s ] [ -sort-common ] [ -stats ]
|
||||||
[ -T @var{commandfile} ]
|
[ -T @var{commandfile} ]
|
||||||
[ -Ttext @var{org} ] [ -Tdata @var{org} ]
|
[ -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 ]
|
[ -warn-common ] [ -y @var{symbol} ] [ -X ] [-x ]
|
||||||
@end smallexample
|
@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
|
are specified, the linker does not produce any output, and issues the
|
||||||
message @samp{No input files}.
|
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
|
whitespace, or be given as separate arguments immediately following the
|
||||||
option that requires them.
|
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
|
@table @code
|
||||||
@ifset I960
|
@ifset I960
|
||||||
@cindex architectures
|
@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
|
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.
|
@var{size} under MIPS ECOFF. Ignored for other object file formats.
|
||||||
|
|
||||||
@item --help
|
|
||||||
@kindex --help
|
|
||||||
@cindex help
|
@cindex help
|
||||||
@cindex usage
|
@cindex usage
|
||||||
|
@kindex -help
|
||||||
|
@item -help
|
||||||
Print a summary of the command-line options on the standard output and exit.
|
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
|
@kindex -i
|
||||||
@cindex incremental link
|
@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
|
not page-align the data segment. If the output format supports Unix
|
||||||
style magic numbers, mark the output as @code{OMAGIC}.
|
style magic numbers, mark the output as @code{OMAGIC}.
|
||||||
|
|
||||||
@item -n
|
|
||||||
@kindex -n
|
@kindex -n
|
||||||
@cindex read-only text
|
@cindex read-only text
|
||||||
@kindex NMAGIC
|
@kindex NMAGIC
|
||||||
|
@item -n
|
||||||
Set the text segment to be read only, and mark the output as
|
Set the text segment to be read only, and mark the output as
|
||||||
@code{NMAGIC} if possible.
|
@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
|
to refer symbolically to absolute locations of memory defined in other
|
||||||
programs.
|
programs.
|
||||||
|
|
||||||
@item -relax
|
|
||||||
@kindex -relax
|
@kindex -relax
|
||||||
@cindex synthesizing linker
|
@cindex synthesizing linker
|
||||||
@cindex relaxing addressing modes
|
@cindex relaxing addressing modes
|
||||||
|
@item -relax
|
||||||
An option with machine dependent effects.
|
An option with machine dependent effects.
|
||||||
@ifset GENERIC
|
@ifset GENERIC
|
||||||
Currently this option is only supported on the H8/300 and the Intel 960.
|
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
|
You may only specify @samp{-retain-symbols-file} once in the command
|
||||||
line. It overrides @samp{-s} and @samp{-S}.
|
line. It overrides @samp{-s} and @samp{-S}.
|
||||||
|
|
||||||
@item -r
|
|
||||||
@cindex partial link
|
@cindex partial link
|
||||||
@cindex relocatable output
|
@cindex relocatable output
|
||||||
@kindex -r
|
@kindex -r
|
||||||
|
@item -r
|
||||||
Generate relocatable output---i.e., generate an output file that can in
|
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
|
turn serve as input to @code{ld}. This is often called @dfn{partial
|
||||||
linking}. As a side effect, in environments that support standard Unix
|
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}.
|
This option does the same thing as @samp{-i}.
|
||||||
|
|
||||||
@item -S
|
|
||||||
@kindex -S
|
@kindex -S
|
||||||
@cindex strip debugger symbols
|
@cindex strip debugger symbols
|
||||||
|
@item -S
|
||||||
Omit debugger symbol information (but not all symbols) from the output file.
|
Omit debugger symbol information (but not all symbols) from the output file.
|
||||||
|
|
||||||
@item -s
|
|
||||||
@kindex -s
|
@kindex -s
|
||||||
@cindex strip all symbols
|
@cindex strip all symbols
|
||||||
|
@item -s
|
||||||
Omit all symbol information from the output file.
|
Omit all symbol information from the output file.
|
||||||
|
|
||||||
@item -sort-common
|
@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
|
exist, @code{ld} looks for it in the directories specified by any
|
||||||
preceding @samp{-L} options. Multiple @samp{-T} options accumulate.
|
preceding @samp{-L} options. Multiple @samp{-T} options accumulate.
|
||||||
|
|
||||||
@item -t
|
|
||||||
@kindex -t
|
@kindex -t
|
||||||
@cindex verbose
|
@cindex verbose
|
||||||
@cindex input files, displaying
|
@cindex input files, displaying
|
||||||
|
@item -t
|
||||||
Print the names of the input files as @code{ld} processes them.
|
Print the names of the input files as @code{ld} processes them.
|
||||||
|
|
||||||
@item -u @var{symbol}
|
@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 Nice idea, but no such command: This option is equivalent
|
||||||
@c to the @code{EXTERN} linker command.
|
@c to the @code{EXTERN} linker command.
|
||||||
|
|
||||||
@item -Ur
|
|
||||||
@kindex -Ur
|
@kindex -Ur
|
||||||
@cindex constructors
|
@cindex constructors
|
||||||
|
@item -Ur
|
||||||
For anything other than C++ programs, this option is equivalent to
|
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
|
@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}
|
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
|
be added to. Use @samp{-Ur} only for the last partial link, and
|
||||||
@samp{-r} for the others.
|
@samp{-r} for the others.
|
||||||
|
|
||||||
@item -V
|
|
||||||
@kindex -V
|
@kindex -V
|
||||||
@cindex version
|
@cindex version
|
||||||
|
@item -V
|
||||||
Display the version number for @code{ld} and list the linker emulations
|
Display the version number for @code{ld} and list the linker emulations
|
||||||
supported. Display which input files can and cannot be opened.
|
supported. Display which input files can and cannot be opened.
|
||||||
|
|
||||||
@item -v
|
|
||||||
@kindex -v
|
@kindex -v
|
||||||
@cindex version
|
@cindex version
|
||||||
|
@item -v
|
||||||
Display the version number for @code{ld}.
|
Display the version number for @code{ld}.
|
||||||
|
|
||||||
@item --version
|
@item -version
|
||||||
@kindex --version
|
@kindex -version
|
||||||
Display the version number for @code{ld} and exit.
|
Display the version number for @code{ld} and exit.
|
||||||
|
|
||||||
@item -warn-common
|
@item -warn-common
|
||||||
|
@ -709,16 +716,16 @@ encountered in a different order.
|
||||||
@end smallexample
|
@end smallexample
|
||||||
@end enumerate
|
@end enumerate
|
||||||
|
|
||||||
@item -X
|
|
||||||
@kindex -X
|
@kindex -X
|
||||||
@cindex local symbols, deleting
|
@cindex local symbols, deleting
|
||||||
@cindex L, deleting symbols beginning
|
@cindex L, deleting symbols beginning
|
||||||
|
@item -X
|
||||||
If @samp{-s} or @samp{-S} is also specified, delete only local symbols
|
If @samp{-s} or @samp{-S} is also specified, delete only local symbols
|
||||||
beginning with @samp{L}.
|
beginning with @samp{L}.
|
||||||
|
|
||||||
@item -x
|
|
||||||
@kindex -x
|
@kindex -x
|
||||||
@cindex deleting local symbols
|
@cindex deleting local symbols
|
||||||
|
@item -x
|
||||||
If @samp{-s} or @samp{-S} is also specified, delete all local symbols,
|
If @samp{-s} or @samp{-S} is also specified, delete all local symbols,
|
||||||
not just those beginning with @samp{L}.
|
not just those beginning with @samp{L}.
|
||||||
|
|
||||||
|
@ -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
|
loaded. The notation @samp{= 0x1234} specifies what data to write in
|
||||||
the gaps (@pxref{Section Options}).
|
the gaps (@pxref{Section Options}).
|
||||||
|
|
||||||
|
@iftex
|
||||||
|
@vfill
|
||||||
|
@end iftex
|
||||||
|
|
||||||
|
@need 5000
|
||||||
@node Operators
|
@node Operators
|
||||||
@subsection Operators
|
@subsection Operators
|
||||||
@cindex Operators for arithmetic
|
@cindex Operators for arithmetic
|
||||||
|
@ -1112,7 +1124,7 @@ section definition by using the absolute assignment function
|
||||||
is the last byte of an output section named @code{.data}:
|
is the last byte of an output section named @code{.data}:
|
||||||
@example
|
@example
|
||||||
SECTIONS@{ @dots{}
|
SECTIONS@{ @dots{}
|
||||||
.data :
|
.data :
|
||||||
@{
|
@{
|
||||||
*(.data)
|
*(.data)
|
||||||
_edata = ABSOLUTE(.) ;
|
_edata = ABSOLUTE(.) ;
|
||||||
|
@ -1216,6 +1228,7 @@ 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
|
to set a global symbol @code{begin} to the first location in the
|
||||||
@code{.text} section---but if a symbol called @code{begin} already
|
@code{.text} section---but if a symbol called @code{begin} already
|
||||||
existed, its value is preserved:
|
existed, its value is preserved:
|
||||||
|
|
||||||
@smallexample
|
@smallexample
|
||||||
SECTIONS@{ @dots{}
|
SECTIONS@{ @dots{}
|
||||||
.text : @{
|
.text : @{
|
||||||
|
@ -1291,31 +1304,34 @@ MEMORY
|
||||||
@}
|
@}
|
||||||
@end example
|
@end example
|
||||||
@table @code
|
@table @code
|
||||||
@item @var{name}
|
|
||||||
@cindex naming memory regions
|
@cindex naming memory regions
|
||||||
|
@item @var{name}
|
||||||
is a name used internally by the linker to refer to the region. Any
|
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
|
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
|
name space, and will not conflict with symbols, file names or section
|
||||||
names. Use distinct names to specify multiple regions.
|
names. Use distinct names to specify multiple regions.
|
||||||
@item (@var{attr})
|
|
||||||
@cindex memory region attributes
|
@cindex memory region attributes
|
||||||
|
@item (@var{attr})
|
||||||
is an optional list of attributes, permitted for compatibility with the
|
is an optional list of attributes, permitted for compatibility with the
|
||||||
AT&T linker but not used by @code{ld} beyond checking that 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
|
attribute list is valid. Valid attribute lists must be made up of the
|
||||||
characters ``@code{LIRWX}''. If you omit the attribute list, you may
|
characters ``@code{LIRWX}''. If you omit the attribute list, you may
|
||||||
omit the parentheses around it as well.
|
omit the parentheses around it as well.
|
||||||
@item @var{origin}
|
|
||||||
@kindex ORIGIN =
|
@kindex ORIGIN =
|
||||||
@kindex o =
|
@kindex o =
|
||||||
@kindex org =
|
@kindex org =
|
||||||
|
@item @var{origin}
|
||||||
is the start address of the region in physical memory. It is
|
is the start address of the region in physical memory. It is
|
||||||
an expression that must evaluate to a constant before
|
an expression that must evaluate to a constant before
|
||||||
memory allocation is performed. The keyword @code{ORIGIN} may be
|
memory allocation is performed. The keyword @code{ORIGIN} may be
|
||||||
abbreviated to @code{org} or @code{o} (but not, for example, @samp{ORG}).
|
abbreviated to @code{org} or @code{o} (but not, for example, @samp{ORG}).
|
||||||
@item @var{len}
|
|
||||||
@kindex LENGTH =
|
@kindex LENGTH =
|
||||||
@kindex len =
|
@kindex len =
|
||||||
@kindex l =
|
@kindex l =
|
||||||
|
@item @var{len}
|
||||||
is the size in bytes of the region (an expression).
|
is the size in bytes of the region (an expression).
|
||||||
The keyword @code{LENGTH} may be abbreviated to @code{len} or @code{l}.
|
The keyword @code{LENGTH} may be abbreviated to @code{len} or @code{l}.
|
||||||
@end table
|
@end table
|
||||||
|
@ -1392,7 +1408,7 @@ these specifications are optional; the simplest form of a section
|
||||||
definition is
|
definition is
|
||||||
@example
|
@example
|
||||||
SECTIONS @{ @dots{}
|
SECTIONS @{ @dots{}
|
||||||
@var{secname} : @{
|
@var{secname} : @{
|
||||||
@var{contents}
|
@var{contents}
|
||||||
@}
|
@}
|
||||||
@dots{} @}
|
@dots{} @}
|
||||||
|
@ -1432,10 +1448,10 @@ like in a single section definition, separated from one another by
|
||||||
whitespace.
|
whitespace.
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
@item @var{filename}
|
|
||||||
@kindex @var{filename}
|
@kindex @var{filename}
|
||||||
@cindex input files, section defn
|
@cindex input files, section defn
|
||||||
@cindex files, including in output sections
|
@cindex files, including in output sections
|
||||||
|
@item @var{filename}
|
||||||
You may simply name a particular input file to be placed in the current
|
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
|
output section; @emph{all} sections from that file are placed in the
|
||||||
current section definition. If the file name has already been mentioned
|
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
|
the contents of a section definition, since each file name is a separate
|
||||||
statement.
|
statement.
|
||||||
|
|
||||||
|
@kindex @var{filename}(@var{section})
|
||||||
|
@cindex files and sections, section defn
|
||||||
@item @var{filename}( @var{section} )
|
@item @var{filename}( @var{section} )
|
||||||
@itemx @var{filename}( @var{section}, @var{section}, @dots{} )
|
@itemx @var{filename}( @var{section}, @var{section}, @dots{} )
|
||||||
@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
|
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
|
insertion in the current output section. If you wish to specify a list
|
||||||
of input-file sections inside the parentheses, you may separate the
|
of input-file sections inside the parentheses, you may separate the
|
||||||
section names by either commas or whitespace.
|
section names by either commas or whitespace.
|
||||||
|
|
||||||
|
@cindex input sections to output section
|
||||||
|
@kindex *(@var{section})
|
||||||
@item * (@var{section})
|
@item * (@var{section})
|
||||||
@itemx * (@var{section}, @var{section}, @dots{})
|
@itemx * (@var{section}, @var{section}, @dots{})
|
||||||
@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
|
Instead of explicitly naming particular input files in a link control
|
||||||
script, you can refer to @emph{all} files from the @code{ld} command
|
script, you can refer to @emph{all} files from the @code{ld} command
|
||||||
line: use @samp{*} instead of a particular file name before the
|
line: use @samp{*} instead of a particular file name before the
|
||||||
|
@ -1490,16 +1506,17 @@ SECTIONS @{
|
||||||
@}
|
@}
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
|
@cindex @code{[@var{section}@dots{}]}, not supported
|
||||||
@samp{[ @var{section} @dots{} ]} used to be accepted as an alternate way
|
@samp{[ @var{section} @dots{} ]} used to be accepted as an alternate way
|
||||||
to specify named sections from all unallocated input files. Because
|
to specify named sections from all unallocated input files. Because
|
||||||
some operating systems (VMS) allow brackets in file names, that notation
|
some operating systems (VMS) allow brackets in file names, that notation
|
||||||
is no longer supported.
|
is no longer supported.
|
||||||
|
|
||||||
@item @var{filename}@code{( COMMON )}
|
|
||||||
@itemx *( COMMON )
|
|
||||||
@kindex *( COMMON )
|
|
||||||
@cindex uninitialized data
|
@cindex uninitialized data
|
||||||
@cindex commons in output
|
@cindex commons in output
|
||||||
|
@kindex *( COMMON )
|
||||||
|
@item @var{filename}@code{( COMMON )}
|
||||||
|
@itemx *( COMMON )
|
||||||
Specify where in your output file to place uninitialized data
|
Specify where in your output file to place uninitialized data
|
||||||
with this notation. @code{*(COMMON)} by itself refers to all
|
with this notation. @code{*(COMMON)} by itself refers to all
|
||||||
uninitialized data from all input files (so far as it is not yet
|
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
|
three consecutive sections, named @code{.text}, @code{.data}, and
|
||||||
@code{.bss}, taking the input for each from the correspondingly named
|
@code{.bss}, taking the input for each from the correspondingly named
|
||||||
sections of all the input files:
|
sections of all the input files:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
SECTIONS @{
|
SECTIONS @{
|
||||||
.text : @{ *(.text) @}
|
.text : @{ *(.text) @}
|
||||||
|
@ -1566,10 +1584,10 @@ command; you can intermix them freely with any of the statements we've
|
||||||
just described.
|
just described.
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
@item CREATE_OBJECT_SYMBOLS
|
|
||||||
@kindex CREATE_OBJECT_SYMBOLS
|
|
||||||
@cindex input filename symbols
|
@cindex input filename symbols
|
||||||
@cindex filename symbols
|
@cindex filename symbols
|
||||||
|
@kindex CREATE_OBJECT_SYMBOLS
|
||||||
|
@item CREATE_OBJECT_SYMBOLS
|
||||||
Create a symbol for each input file
|
Create a symbol for each input file
|
||||||
in the current section, set to the address of the first byte of
|
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}
|
data written from that input file. For instance, with @code{a.out}
|
||||||
|
@ -1624,10 +1642,10 @@ containing symbols matching the object file names:
|
||||||
00002068 t d.o
|
00002068 t d.o
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@item @var{symbol} = @var{expression} ;
|
|
||||||
@kindex @var{symbol} = @var{expression} ;
|
@kindex @var{symbol} = @var{expression} ;
|
||||||
@itemx @var{symbol} @var{f}= @var{expression} ;
|
|
||||||
@kindex @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}=''
|
@var{symbol} is any symbol name (@pxref{Symbols}). ``@var{f}=''
|
||||||
refers to any of the operators @code{&= += -= *= /=} which combine
|
refers to any of the operators @code{&= += -= *= /=} which combine
|
||||||
arithmetic and assignment.
|
arithmetic and assignment.
|
||||||
|
@ -1636,6 +1654,7 @@ arithmetic and assignment.
|
||||||
When you assign a value to a symbol within a particular section
|
When you assign a value to a symbol within a particular section
|
||||||
definition, the value is relative to the beginning of the section
|
definition, the value is relative to the beginning of the section
|
||||||
(@pxref{Assignment}). If you write
|
(@pxref{Assignment}). If you write
|
||||||
|
|
||||||
@example
|
@example
|
||||||
SECTIONS @{
|
SECTIONS @{
|
||||||
abs = 14 ;
|
abs = 14 ;
|
||||||
|
@ -1645,20 +1664,21 @@ SECTIONS @{
|
||||||
@dots{}
|
@dots{}
|
||||||
@}
|
@}
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@c FIXME: Try above example!
|
@c FIXME: Try above example!
|
||||||
@noindent
|
@noindent
|
||||||
@code{abs} and @code{rel} do not have the same value; @code{rel} has the
|
@code{abs} and @code{rel} do not have the same value; @code{rel} has the
|
||||||
same value as @code{abs2}.
|
same value as @code{abs2}.
|
||||||
|
|
||||||
@item BYTE(@var{expression})
|
|
||||||
@kindex BYTE(@var{expression})
|
@kindex BYTE(@var{expression})
|
||||||
@itemx SHORT(@var{expression})
|
|
||||||
@kindex SHORT(@var{expression})
|
@kindex SHORT(@var{expression})
|
||||||
@itemx LONG(@var{expression})
|
|
||||||
@kindex LONG(@var{expression})
|
@kindex LONG(@var{expression})
|
||||||
@itemx QUAD(@var{expression})
|
|
||||||
@kindex QUAD(@var{expression})
|
@kindex QUAD(@var{expression})
|
||||||
@cindex direct output
|
@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
|
By including one of these four statements in a section definition, you
|
||||||
can explicitly place one, two, four, or eight bytes (respectively) at
|
can explicitly place one, two, four, or eight bytes (respectively) at
|
||||||
the current address of that section. @code{QUAD} is only supported when
|
the current address of that section. @code{QUAD} is only supported when
|
||||||
|
@ -1705,15 +1725,16 @@ Definition}, and @pxref{Section Placement} for details on
|
||||||
@code{=@var{fill}}, and @code{>@var{region}}---are all optional.
|
@code{=@var{fill}}, and @code{>@var{region}}---are all optional.
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
@item @var{start}
|
|
||||||
@cindex start address, section
|
@cindex start address, section
|
||||||
@cindex section start
|
@cindex section start
|
||||||
@cindex section address
|
@cindex section address
|
||||||
|
@item @var{start}
|
||||||
You can force the output section to be loaded at a specified address by
|
You can force the output section to be loaded at a specified address by
|
||||||
specifying @var{start} immediately following the section name.
|
specifying @var{start} immediately following the section name.
|
||||||
@var{start} can be represented as any expression. The following
|
@var{start} can be represented as any expression. The following
|
||||||
example generates section @var{output} at location
|
example generates section @var{output} at location
|
||||||
@code{0x40000000}:
|
@code{0x40000000}:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
SECTIONS @{
|
SECTIONS @{
|
||||||
@dots{}
|
@dots{}
|
||||||
|
@ -1724,10 +1745,10 @@ SECTIONS @{
|
||||||
@}
|
@}
|
||||||
@end example
|
@end example
|
||||||
|
|
||||||
@item BLOCK(@var{align})
|
|
||||||
@kindex BLOCK(@var{align})
|
@kindex BLOCK(@var{align})
|
||||||
@cindex section alignment
|
@cindex section alignment
|
||||||
@cindex aligning sections
|
@cindex aligning sections
|
||||||
|
@item BLOCK(@var{align})
|
||||||
You can include @code{BLOCK()} specification to advance
|
You can include @code{BLOCK()} specification to advance
|
||||||
the location counter @code{.} prior to the beginning of the section, so
|
the location counter @code{.} prior to the beginning of the section, so
|
||||||
that the section will begin at the specified alignment. @var{align} is
|
that the section will begin at the specified alignment. @var{align} is
|
||||||
|
@ -1795,24 +1816,22 @@ for (dst = _bstart; dst< _bend; dst++)
|
||||||
*dst = 0;
|
*dst = 0;
|
||||||
@end smallexample
|
@end smallexample
|
||||||
|
|
||||||
@item =@var{fill}
|
|
||||||
@kindex =@var{fill}
|
@kindex =@var{fill}
|
||||||
@cindex section fill pattern
|
@cindex section fill pattern
|
||||||
@cindex fill pattern, entire section
|
@cindex fill pattern, entire section
|
||||||
Including
|
@item =@var{fill}
|
||||||
@code{=@var{fill}} in a section definition specifies the initial fill
|
Including @code{=@var{fill}} in a section definition specifies the
|
||||||
value for that section.
|
initial fill value for that section. You may use any expression to
|
||||||
You may use any expression to specify @var{fill}.
|
specify @var{fill}. Any unallocated holes in the current output section
|
||||||
Any unallocated holes in the current output
|
when written to the output file will be filled with the two least
|
||||||
section when written to the output file will be filled with the two
|
significant bytes of the value, repeated as necessary. You can also
|
||||||
least significant bytes of the value, repeated as necessary. You can
|
change the fill value with a @code{FILL} statement in the @var{contents}
|
||||||
also change the fill value with a @code{FILL} statement in the
|
of a section definition.
|
||||||
@var{contents} of a section definition.
|
|
||||||
|
|
||||||
@item >@var{region}
|
|
||||||
@kindex >@var{region}
|
@kindex >@var{region}
|
||||||
@cindex section, assigning to memory region
|
@cindex section, assigning to memory region
|
||||||
@cindex memory regions and sections
|
@cindex memory regions and sections
|
||||||
|
@item >@var{region}
|
||||||
Assign this section to a previously defined region of memory.
|
Assign this section to a previously defined region of memory.
|
||||||
@xref{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
|
assignment statement: if no symbol @code{start} is defined within your
|
||||||
input files, you can simply define it, assigning it an appropriate
|
input files, you can simply define it, assigning it an appropriate
|
||||||
value---
|
value---
|
||||||
|
|
||||||
@example
|
@example
|
||||||
start = 0x2020;
|
start = 0x2020;
|
||||||
@end example
|
@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
|
For example, if your input object files use some other symbol-name
|
||||||
convention for the entry point, you can just assign the value of
|
convention for the entry point, you can just assign the value of
|
||||||
whatever symbol contains the start address to @code{start}:
|
whatever symbol contains the start address to @code{start}:
|
||||||
|
|
||||||
@example
|
@example
|
||||||
start = other_symbol ;
|
start = other_symbol ;
|
||||||
@end example
|
@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
|
a subroutine @code{__main}, which it inserts automatically into the
|
||||||
startup code for @code{main}, and destructors from @code{_exit}.)
|
startup code for @code{main}, and destructors from @code{_exit}.)
|
||||||
|
|
||||||
|
@need 1000
|
||||||
@kindex FLOAT
|
@kindex FLOAT
|
||||||
@kindex NOFLOAT
|
@kindex NOFLOAT
|
||||||
@item FLOAT
|
@item FLOAT
|
||||||
|
@ -2110,113 +2132,17 @@ not itself call any subroutines).
|
||||||
|
|
||||||
@cindex back end
|
@cindex back end
|
||||||
@cindex object file management
|
@cindex object file management
|
||||||
|
@cindex object formats available
|
||||||
|
@kindex objdump -i
|
||||||
The linker accesses object and archive files using the BFD libraries.
|
The linker accesses object and archive files using the BFD libraries.
|
||||||
These libraries allow the linker to use the same routines to operate on
|
These libraries allow the linker to use the same routines to operate on
|
||||||
object files whatever the object file format. A different object file
|
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
|
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
|
(@pxref{objdump,,objdump,binutils.info,The GNU Binary Utilities}) to
|
||||||
list all the formats available for each architecture under BFD. This
|
list all the formats available for your configuration.
|
||||||
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
|
|
||||||
|
|
||||||
@cindex BFD requirements
|
@cindex BFD requirements
|
||||||
@cindex requirements for BFD
|
@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.
|
The following list shows only the upper-case form of each command.
|
||||||
|
|
||||||
@table @code
|
@table @code
|
||||||
|
@cindex @code{ABSOLUTE} (MRI)
|
||||||
@item ABSOLUTE @var{secname}
|
@item ABSOLUTE @var{secname}
|
||||||
@item ABSOLUTE @var{secname}, @var{secname}, @dots{} @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
|
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
|
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
|
@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
|
input sections (whatever you select on the command line, or using
|
||||||
@code{LOAD}) to resolve addresses in the output file.
|
@code{LOAD}) to resolve addresses in the output file.
|
||||||
|
|
||||||
@item ALIAS @var{out-secname}, @var{in-secname}
|
|
||||||
@cindex @code{ALIAS} (MRI)
|
@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}
|
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.
|
in a section called @var{out-secname} in the linker output file.
|
||||||
|
|
||||||
@var{in-secname} may be an integer.
|
@var{in-secname} may be an integer.
|
||||||
|
|
||||||
@item BASE @var{expression}
|
|
||||||
@cindex @code{BASE} (MRI)
|
@cindex @code{BASE} (MRI)
|
||||||
|
@item BASE @var{expression}
|
||||||
Use the value of @var{expression} as the lowest address (other than
|
Use the value of @var{expression} as the lowest address (other than
|
||||||
absolute addresses) in the output file.
|
absolute addresses) in the output file.
|
||||||
|
|
||||||
|
@cindex @code{CHIP} (MRI)
|
||||||
@item CHIP @var{expression}
|
@item CHIP @var{expression}
|
||||||
@itemx CHIP @var{expression}, @var{expression}
|
@itemx CHIP @var{expression}, @var{expression}
|
||||||
@cindex @code{CHIP} (MRI)
|
|
||||||
This command does nothing; it is accepted only for compatibility.
|
This command does nothing; it is accepted only for compatibility.
|
||||||
|
|
||||||
@item END
|
|
||||||
@cindex @code{END} (MRI)
|
@cindex @code{END} (MRI)
|
||||||
|
@item END
|
||||||
This command does nothing whatever; it's only accepted for compatibility.
|
This command does nothing whatever; it's only accepted for compatibility.
|
||||||
|
|
||||||
@item FORMAT @var{output-format}
|
|
||||||
@cindex @code{FORMAT} (MRI)
|
@cindex @code{FORMAT} (MRI)
|
||||||
|
@item FORMAT @var{output-format}
|
||||||
Similar to the @code{OUTPUT_FORMAT} command in the more general linker
|
Similar to the @code{OUTPUT_FORMAT} command in the more general linker
|
||||||
language, but restricted to one of these output formats:
|
language, but restricted to one of these output formats:
|
||||||
|
|
||||||
@enumerate
|
@enumerate
|
||||||
@item
|
@item
|
||||||
S-records, if @var{output-format} is @samp{S}
|
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}
|
@samp{COFF}
|
||||||
@end enumerate
|
@end enumerate
|
||||||
|
|
||||||
@item LIST @var{anything}@dots{}
|
|
||||||
@cindex @code{LIST} (MRI)
|
@cindex @code{LIST} (MRI)
|
||||||
|
@item LIST @var{anything}@dots{}
|
||||||
Print (to the standard output file) a link map, as produced by the
|
Print (to the standard output file) a link map, as produced by the
|
||||||
@code{ld} command-line option @samp{-M}.
|
@code{ld} command-line option @samp{-M}.
|
||||||
|
|
||||||
The keyword @code{LIST} may be followed by anything on the
|
The keyword @code{LIST} may be followed by anything on the
|
||||||
same line, with no change in its effect.
|
same line, with no change in its effect.
|
||||||
|
|
||||||
|
@cindex @code{LOAD} (MRI)
|
||||||
@item LOAD @var{filename}
|
@item LOAD @var{filename}
|
||||||
@item LOAD @var{filename}, @var{filename}, @dots{} @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
|
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}
|
same effect as specifying @var{filename} directly on the @code{ld}
|
||||||
command line.
|
command line.
|
||||||
|
|
||||||
@item NAME @var{output-name}
|
|
||||||
@cindex @code{NAME} (MRI)
|
@cindex @code{NAME} (MRI)
|
||||||
|
@item NAME @var{output-name}
|
||||||
@var{output-name} is the name for the program produced by @code{ld}; the
|
@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
|
MRI-compatible command @code{NAME} is equivalent to the command-line
|
||||||
option @samp{-o} or the general script language command @code{OUTPUT}.
|
option @samp{-o} or the general script language command @code{OUTPUT}.
|
||||||
|
|
||||||
|
@cindex @code{ORDER} (MRI)
|
||||||
@item ORDER @var{secname}, @var{secname}, @dots{} @var{secname}
|
@item ORDER @var{secname}, @var{secname}, @dots{} @var{secname}
|
||||||
@itemx ORDER @var{secname} @var{secname} @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
|
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
|
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
|
script, you can override this ordering with the @code{ORDER} command. The
|
||||||
sections you list with @code{ORDER} will appear first in your output
|
sections you list with @code{ORDER} will appear first in your output
|
||||||
file, in the order specified.
|
file, in the order specified.
|
||||||
|
|
||||||
|
@cindex @code{PUBLIC} (MRI)
|
||||||
@item PUBLIC @var{name}=@var{expression}
|
@item PUBLIC @var{name}=@var{expression}
|
||||||
@itemx PUBLIC @var{name},@var{expression}
|
@itemx 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
|
Supply a value (@var{expression}) for external symbol
|
||||||
@var{name} used in the linker input files.
|
@var{name} used in the linker input files.
|
||||||
|
|
||||||
|
@cindex @code{SECT} (MRI)
|
||||||
@item SECT @var{secname}, @var{expression}
|
@item SECT @var{secname}, @var{expression}
|
||||||
@itemx SECT @var{secname}=@var{expression}
|
@itemx 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
|
You can use any of these three forms of the @code{SECT} command to
|
||||||
specify the start address (@var{expression}) for section @var{secname}.
|
specify the start address (@var{expression}) for section @var{secname}.
|
||||||
If you have more than one @code{SECT} statement for the same
|
If you have more than one @code{SECT} statement for the same
|
||||||
|
|
318
ld/ldgram.y
318
ld/ldgram.y
|
@ -65,21 +65,9 @@ static int error_index;
|
||||||
%}
|
%}
|
||||||
%union {
|
%union {
|
||||||
bfd_vma integer;
|
bfd_vma integer;
|
||||||
int voidval;
|
|
||||||
char *name;
|
char *name;
|
||||||
int token;
|
int token;
|
||||||
union etree_union *etree;
|
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
|
%type <etree> exp opt_exp_with_type mustbe_exp opt_at
|
||||||
|
@ -103,7 +91,6 @@ static int error_index;
|
||||||
%left <token> '+' '-'
|
%left <token> '+' '-'
|
||||||
%left <token> '*' '/' '%'
|
%left <token> '*' '/' '%'
|
||||||
|
|
||||||
/*%token <token> '+' '-' '*' '/' '%'*/
|
|
||||||
%right UNARY
|
%right UNARY
|
||||||
%token END
|
%token END
|
||||||
%left <token> '('
|
%left <token> '('
|
||||||
|
@ -116,313 +103,36 @@ static int error_index;
|
||||||
%token MEMORY DEFSYMEND
|
%token MEMORY DEFSYMEND
|
||||||
%token NOLOAD DSECT COPY INFO OVERLAY
|
%token NOLOAD DSECT COPY INFO OVERLAY
|
||||||
%token NAME DEFINED TARGET_K SEARCH_DIR MAP ENTRY
|
%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 <integer> SIZEOF NEXT ADDR
|
||||||
%token OPTION_d OPTION_dc OPTION_dp OPTION_x OPTION_X OPTION_defsym
|
%token STARTUP HLL SYSLIB FLOAT NOFLOAT
|
||||||
%token OPTION_v OPTION_V OPTION_m OPTION_memul OPTION_M OPTION_t STARTUP HLL SYSLIB FLOAT NOFLOAT
|
%token ORIGIN FILL
|
||||||
%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 LENGTH CREATE_OBJECT_SYMBOLS INPUT OUTPUT CONSTRUCTORS
|
||||||
%token OPTION_RETAIN_SYMBOLS_FILE ALIGNMOD AT
|
%token 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
|
|
||||||
|
|
||||||
%type <token> assign_op
|
%type <token> assign_op
|
||||||
|
|
||||||
%type <name> filename
|
%type <name> filename
|
||||||
|
|
||||||
|
|
||||||
%token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD
|
%token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD
|
||||||
%token FORMAT PUBLIC DEFSYMEND BASE ALIAS TRUNCATE REL
|
%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;
|
filename: NAME;
|
||||||
|
|
||||||
|
|
||||||
command_line:
|
defsym_expr:
|
||||||
command_line command_line_option
|
{ ldlex_defsym(); }
|
||||||
|
|
NAME '=' exp
|
||||||
;
|
|
||||||
|
|
||||||
command_line_option:
|
|
||||||
OPTION_Bstatic { }
|
|
||||||
| OPTION_help
|
|
||||||
{
|
{
|
||||||
help ();
|
ldlex_popstate();
|
||||||
exit (0);
|
lang_add_assignment(exp_assop($3,$2,$4));
|
||||||
}
|
}
|
||||||
| 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
|
|
||||||
{
|
|
||||||
write_map = true;
|
|
||||||
config.map_filename = $2;
|
|
||||||
}
|
|
||||||
| 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 */
|
/* SYNTAX WITHIN AN MRI SCRIPT FILE */
|
||||||
mri_script_file:
|
mri_script_file:
|
||||||
|
|
13
ld/ldlex.h
13
ld/ldlex.h
|
@ -22,6 +22,16 @@
|
||||||
|
|
||||||
#include <stdio.h>
|
#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 int hex_mode;
|
||||||
extern unsigned int lineno;
|
extern unsigned int lineno;
|
||||||
|
|
||||||
|
@ -40,8 +50,9 @@ extern void ldlex_popstate PARAMS ((void));
|
||||||
/* In lexsup.c. */
|
/* In lexsup.c. */
|
||||||
extern int lex_input PARAMS ((void));
|
extern int lex_input PARAMS ((void));
|
||||||
extern void lex_unput PARAMS ((int));
|
extern void lex_unput PARAMS ((int));
|
||||||
|
#ifndef yywrap
|
||||||
extern int yywrap PARAMS ((void));
|
extern int yywrap PARAMS ((void));
|
||||||
|
#endif
|
||||||
extern void parse_args PARAMS ((int, char **));
|
extern void parse_args PARAMS ((int, char **));
|
||||||
extern void parse_line PARAMS ((char*, int));
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
319
ld/ldlex.l
319
ld/ldlex.l
|
@ -43,30 +43,40 @@ This was written by steve chamberlain
|
||||||
#include "ldlex.h"
|
#include "ldlex.h"
|
||||||
#include "ldmain.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;
|
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;
|
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
|
#undef YY_INPUT
|
||||||
#define YY_INPUT(buf,result,max_size) yy_input(buf, &result, max_size)
|
#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
|
#define MAX_INCLUDE_DEPTH 10
|
||||||
YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
|
static YY_BUFFER_STATE include_stack[MAX_INCLUDE_DEPTH];
|
||||||
char *file_name_stack[MAX_INCLUDE_DEPTH];
|
static char *file_name_stack[MAX_INCLUDE_DEPTH];
|
||||||
unsigned int include_stack_ptr = 0;
|
static unsigned int include_stack_ptr = 0;
|
||||||
|
|
||||||
static YY_BUFFER_STATE yy_create_string_buffer PARAMS ((const char *string,
|
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 yy_input PARAMS ((char *, int *result, int max_size));
|
||||||
|
|
||||||
static void comment PARAMS ((void));
|
static void comment PARAMS ((void));
|
||||||
static void lex_warn_invalid PARAMS ((char *where, char *what));
|
static void lex_warn_invalid PARAMS ((char *where, char *what));
|
||||||
|
|
||||||
/* STATES
|
/* STATES
|
||||||
COMMAND on command line
|
|
||||||
EXPRESSION definitely in an expression
|
EXPRESSION definitely in an expression
|
||||||
SCRIPT definitely in a script
|
SCRIPT definitely in a script
|
||||||
BOTH either EXPRESSION or 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
|
MRI in an MRI script
|
||||||
*/
|
*/
|
||||||
#define RTOKEN(x) { yylval.token = x; return x; }
|
#define RTOKEN(x) { yylval.token = x; return x; }
|
||||||
|
|
||||||
|
/* Some versions of flex want this. */
|
||||||
|
#ifndef yywrap
|
||||||
|
int yywrap () { return 1; }
|
||||||
|
#endif
|
||||||
%}
|
%}
|
||||||
|
|
||||||
%a 4000
|
%a 4000
|
||||||
|
@ -90,7 +105,6 @@ WHITE [ \t\n]+
|
||||||
NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
||||||
|
|
||||||
|
|
||||||
%s COMMAND
|
|
||||||
%s SCRIPT
|
%s SCRIPT
|
||||||
%s EXPRESSION
|
%s EXPRESSION
|
||||||
%s BOTH
|
%s BOTH
|
||||||
|
@ -98,149 +112,21 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
||||||
%s MRI
|
%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>"+" { RTOKEN('+');}
|
<DEFSYMEXP>"+" { RTOKEN('+');}
|
||||||
<DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = buystring(yytext); return NAME; }
|
<DEFSYMEXP>{FILENAMECHAR1}{SYMBOLCHARN}* { yylval.name = buystring(yytext); return NAME; }
|
||||||
<DEFSYMEXP>[ \t] { RTOKEN(DEFSYMEND); }
|
|
||||||
<DEFSYMEXP>"=" { RTOKEN('='); }
|
<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])+ {
|
<MRI,EXPRESSION>"$"([0-9A-Fa-f])+ {
|
||||||
yylval.integer = bfd_scan_vma (yytext+1, 0,16);
|
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('%');}
|
||||||
<BOTH,SCRIPT,EXPRESSION>"<" { RTOKEN('<');}
|
<BOTH,SCRIPT,EXPRESSION>"<" { RTOKEN('<');}
|
||||||
<BOTH,SCRIPT,EXPRESSION>">" { RTOKEN('>');}
|
|
||||||
<MRI,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,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>"MEMORY" { RTOKEN(MEMORY);}
|
||||||
<BOTH,SCRIPT>"ORIGIN" { RTOKEN(ORIGIN);}
|
<BOTH,SCRIPT>"ORIGIN" { RTOKEN(ORIGIN);}
|
||||||
<BOTH,SCRIPT>"BLOCK" { RTOKEN(BLOCK);}
|
<BOTH,SCRIPT>"BLOCK" { RTOKEN(BLOCK);}
|
||||||
|
@ -395,12 +276,6 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
||||||
<MRI>"sect" { RTOKEN(SECT); }
|
<MRI>"sect" { RTOKEN(SECT); }
|
||||||
<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
|
<EXPRESSION,BOTH,SCRIPT,MRI>"absolute" { RTOKEN(ABSOLUTE); }
|
||||||
|
|
||||||
<COMMAND>{CMDFILENAMECHAR1}{CMDFILENAMECHAR}* {
|
|
||||||
yylval.name = buystring(yytext);
|
|
||||||
return NAME;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
|
<MRI>{FILENAMECHAR1}{NOCFILENAMECHAR}* {
|
||||||
/* Filename without commas, needed to parse mri stuff */
|
/* Filename without commas, needed to parse mri stuff */
|
||||||
yylval.name = buystring(yytext);
|
yylval.name = buystring(yytext);
|
||||||
|
@ -412,11 +287,11 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
||||||
yylval.name = buystring(yytext);
|
yylval.name = buystring(yytext);
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
<SCRIPT,COMMAND>{FILENAMECHAR}* { yylval.name = buystring(yytext);
|
<SCRIPT>{FILENAMECHAR}* { yylval.name = buystring(yytext);
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
|
|
||||||
<EXPRESSION,BOTH,COMMAND,SCRIPT>"\""[^\"]*"\"" {
|
<EXPRESSION,BOTH,SCRIPT>"\""[^\"]*"\"" {
|
||||||
/* No matter the state, quotes
|
/* No matter the state, quotes
|
||||||
give what's inside */
|
give what's inside */
|
||||||
yylval.name = buystring(yytext+1);
|
yylval.name = buystring(yytext+1);
|
||||||
|
@ -424,7 +299,7 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
||||||
return NAME;
|
return NAME;
|
||||||
}
|
}
|
||||||
<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
|
<BOTH,SCRIPT,EXPRESSION>"\n" { lineno++;}
|
||||||
<MRI,COMMAND,BOTH,SCRIPT,EXPRESSION>[ \t]
|
<MRI,BOTH,SCRIPT,EXPRESSION>[ \t]
|
||||||
|
|
||||||
<<EOF>> {
|
<<EOF>> {
|
||||||
include_stack_ptr--;
|
include_stack_ptr--;
|
||||||
|
@ -438,24 +313,20 @@ NOCFILENAMECHAR [_a-zA-Z0-9\/\.\-\_\+\$\:\[\]\\\~]
|
||||||
yy_switch_to_buffer(include_stack[include_stack_ptr]);
|
yy_switch_to_buffer(include_stack[include_stack_ptr]);
|
||||||
|
|
||||||
}
|
}
|
||||||
if (include_stack_ptr==1)
|
|
||||||
{
|
|
||||||
BEGIN(COMMAND);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
BEGIN(SCRIPT);
|
BEGIN(SCRIPT);
|
||||||
ldfile_input_filename = file_name_stack[include_stack_ptr-1];
|
ldfile_input_filename = file_name_stack[include_stack_ptr-1];
|
||||||
}
|
|
||||||
|
|
||||||
return END;
|
return END;
|
||||||
}
|
}
|
||||||
|
|
||||||
<COMMAND>. lex_warn_invalid(" on command line", yytext);
|
|
||||||
<SCRIPT,MRI>. lex_warn_invalid(" in script", yytext);
|
<SCRIPT,MRI>. lex_warn_invalid(" in script", yytext);
|
||||||
<EXPRESSION,DEFSYMEXP,BOTH>. lex_warn_invalid(" in expression", 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
|
void
|
||||||
lex_push_file (file, name)
|
lex_push_file (file, name)
|
||||||
|
@ -472,47 +343,41 @@ lex_push_file (file, name)
|
||||||
include_stack_ptr++;
|
include_stack_ptr++;
|
||||||
yyin = file;
|
yyin = file;
|
||||||
yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
|
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
|
static YY_BUFFER_STATE
|
||||||
yy_create_string_buffer (string, size)
|
yy_create_string_buffer (string, size)
|
||||||
CONST char *string;
|
CONST char *string;
|
||||||
int size;
|
size_t size;
|
||||||
{
|
{
|
||||||
YY_BUFFER_STATE b;
|
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;
|
b->yy_input_file = 0;
|
||||||
|
|
||||||
if ( ! b )
|
|
||||||
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
|
|
||||||
|
|
||||||
b->yy_buf_size = size;
|
b->yy_buf_size = size;
|
||||||
|
|
||||||
/* yy_ch_buf has to be 2 characters longer than the size given because
|
/* yy_ch_buf has to be 2 characters longer than the size given because
|
||||||
* we need to put in 2 end-of-buffer characters.
|
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 = (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()" );
|
|
||||||
|
|
||||||
|
|
||||||
b->yy_ch_buf[0] = '\n';
|
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+1] = YY_END_OF_BUFFER_CHAR;
|
||||||
b->yy_ch_buf[size+2] = 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_buf_pos = &b->yy_ch_buf[1];
|
||||||
|
|
||||||
b->yy_eof_status = EOF_NOT_SEEN;
|
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
|
void
|
||||||
lex_redirect (string)
|
lex_redirect (string)
|
||||||
|
@ -520,8 +385,7 @@ lex_redirect (string)
|
||||||
{
|
{
|
||||||
YY_BUFFER_STATE tmp;
|
YY_BUFFER_STATE tmp;
|
||||||
|
|
||||||
int len = strlen(string);
|
yy_init = 0;
|
||||||
yy_init = 0 ;
|
|
||||||
if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
|
if (include_stack_ptr >= MAX_INCLUDE_DEPTH)
|
||||||
{
|
{
|
||||||
einfo("%F: macros nested too deeply\n");
|
einfo("%F: macros nested too deeply\n");
|
||||||
|
@ -529,57 +393,50 @@ lex_redirect (string)
|
||||||
file_name_stack[include_stack_ptr] = "redirect";
|
file_name_stack[include_stack_ptr] = "redirect";
|
||||||
include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
|
include_stack[include_stack_ptr] = YY_CURRENT_BUFFER;
|
||||||
include_stack_ptr++;
|
include_stack_ptr++;
|
||||||
tmp = yy_create_string_buffer(string, len);
|
tmp = yy_create_string_buffer (string, strlen (string));
|
||||||
|
yy_switch_to_buffer (tmp);
|
||||||
yy_switch_to_buffer(tmp);
|
BEGIN (SCRIPT);
|
||||||
BEGIN(COMMAND);
|
|
||||||
yyout = stdout;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Functions to switch to a different flex start condition,
|
||||||
|
saving the current start condition on `state_stack'. */
|
||||||
|
|
||||||
int state_stack[20];
|
static int state_stack[MAX_INCLUDE_DEPTH * 2];
|
||||||
int *state_stack_p = state_stack;
|
static int *state_stack_p = state_stack;
|
||||||
|
|
||||||
void
|
void
|
||||||
ldlex_script ()
|
ldlex_script ()
|
||||||
{
|
{
|
||||||
*(state_stack_p)++ = yy_start;
|
*(state_stack_p)++ = yy_start;
|
||||||
|
BEGIN (SCRIPT);
|
||||||
BEGIN(SCRIPT);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ldlex_mri_script ()
|
ldlex_mri_script ()
|
||||||
{
|
{
|
||||||
*(state_stack_p)++ = yy_start;
|
*(state_stack_p)++ = yy_start;
|
||||||
BEGIN(MRI);
|
BEGIN (MRI);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ldlex_defsym ()
|
ldlex_defsym ()
|
||||||
{
|
{
|
||||||
*(state_stack_p)++ = yy_start;
|
*(state_stack_p)++ = yy_start;
|
||||||
BEGIN(DEFSYMEXP);
|
BEGIN (DEFSYMEXP);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ldlex_expression ()
|
ldlex_expression ()
|
||||||
{
|
{
|
||||||
*(state_stack_p)++ = yy_start;
|
*(state_stack_p)++ = yy_start;
|
||||||
BEGIN(EXPRESSION);
|
BEGIN (EXPRESSION);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
ldlex_both ()
|
ldlex_both ()
|
||||||
{
|
{
|
||||||
*(state_stack_p)++ = yy_start;
|
*(state_stack_p)++ = yy_start;
|
||||||
BEGIN(BOTH);
|
BEGIN (BOTH);
|
||||||
}
|
|
||||||
void
|
|
||||||
ldlex_command ()
|
|
||||||
{
|
|
||||||
*(state_stack_p)++ = yy_start;
|
|
||||||
BEGIN(COMMAND);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -587,53 +444,69 @@ ldlex_popstate ()
|
||||||
{
|
{
|
||||||
yy_start = *(--state_stack_p);
|
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
|
static void
|
||||||
yy_input(buf, result, max_size)
|
yy_input (buf, result, max_size)
|
||||||
char *buf;
|
char *buf;
|
||||||
int *result;
|
int *result;
|
||||||
int max_size;
|
int max_size;
|
||||||
{
|
{
|
||||||
*result = 0;
|
*result = 0;
|
||||||
if (yy_current_buffer->yy_input_file)
|
if (yy_current_buffer->yy_input_file)
|
||||||
{
|
{
|
||||||
if (yyin)
|
if (yyin)
|
||||||
if ( (*result = read( fileno(yyin), (char *) buf, max_size )) < 0 )
|
{
|
||||||
YY_FATAL_ERROR( "read() in flex scanner failed" );
|
*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
|
static void
|
||||||
comment ()
|
comment ()
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
while (1)
|
while (1)
|
||||||
{
|
{
|
||||||
c = input();
|
c = input();
|
||||||
while (c !='*' && c != EOF)
|
while (c != '*' && c != EOF)
|
||||||
{
|
{
|
||||||
if (c == '\n') lineno++;
|
if (c == '\n')
|
||||||
|
lineno++;
|
||||||
c = input();
|
c = input();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (c == '*')
|
if (c == '*')
|
||||||
{
|
{
|
||||||
c = input();
|
c = input();
|
||||||
while ( c == '*')
|
while (c == '*')
|
||||||
c = input();
|
c = input();
|
||||||
if ( c == '/' )
|
if (c == '/')
|
||||||
break; /* found the end */
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Warn the user about a garbage character WHAT in the input
|
||||||
|
in context WHERE. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
lex_warn_invalid (where, what)
|
lex_warn_invalid (where, what)
|
||||||
char *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 "bfd.h"
|
||||||
#include "sysdep.h"
|
#include "sysdep.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include "libiberty.h"
|
||||||
#include "bfdlink.h"
|
#include "bfdlink.h"
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -205,16 +206,11 @@ main (argc, argv)
|
||||||
char *s = ldemul_get_script (&isfile);
|
char *s = ldemul_get_script (&isfile);
|
||||||
|
|
||||||
if (isfile)
|
if (isfile)
|
||||||
{
|
ldfile_open_command_file (s);
|
||||||
/* 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);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
parse_line (s, 1);
|
lex_redirect (s);
|
||||||
|
parser_input = input_script;
|
||||||
|
yyparse ();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (link_info.relocateable && command_line.relax)
|
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…
Add table
Add a link
Reference in a new issue