From b717d30eb550a5418757c32f232a01e7620f640d Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Fri, 21 Jan 2005 12:04:25 +0000 Subject: [PATCH] * ldgram.y (AS_NEEDED): New token. (input_list): Handle AS_NEEDED ( input_list ). * ldlex.l (AS_NEEDED): Add. * ld.texinfo: Document AS_NEEDED (). * NEWS: Mention AS_NEEDED (). --- ld/ChangeLog | 8 ++++++++ ld/NEWS | 3 +++ ld/ld.texinfo | 14 +++++++++++++- ld/ldgram.y | 16 ++++++++++++++-- ld/ldlex.l | 3 ++- 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/ld/ChangeLog b/ld/ChangeLog index 92f10a84f50..8c7183aef40 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2005-01-21 Jakub Jelinek + + * ldgram.y (AS_NEEDED): New token. + (input_list): Handle AS_NEEDED ( input_list ). + * ldlex.l (AS_NEEDED): Add. + * ld.texinfo: Document AS_NEEDED (). + * NEWS: Mention AS_NEEDED (). + 2005-01-21 Ben Elliston * ldlang.c (lang_reasonable_defaults): Remove. diff --git a/ld/NEWS b/ld/NEWS index 8bfe5a8ceb9..e157fbf0ff0 100644 --- a/ld/NEWS +++ b/ld/NEWS @@ -1,5 +1,8 @@ -*- text -*- +* New linker script construct AS_NEEDED(), which sets the --as-needed flag + for input files listed inside of it. + * A new command-line option, --sysroot, can be used to override the default sysroot location. It only applies to toolchains that were configured using --with-sysroot. diff --git a/ld/ld.texinfo b/ld/ld.texinfo index 171ea4047b0..11628a62553 100644 --- a/ld/ld.texinfo +++ b/ld/ld.texinfo @@ -1,7 +1,7 @@ \input texinfo @setfilename ld.info @c Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, -@c 2001, 2002, 2003, 2004 Free Software Foundation, Inc. +@c 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. @syncodeindex ky cp @include configdoc.texi @c (configdoc.texi is generated by the Makefile) @@ -2576,6 +2576,18 @@ files should all be archives, and they are searched repeatedly until no new undefined references are created. See the description of @samp{-(} in @ref{Options,,Command Line Options}. +@item AS_NEEDED(@var{file}, @var{file}, @dots{}) +@itemx AS_NEEDED(@var{file} @var{file} @dots{}) +@kindex AS_NEEDED(@var{files}) +This construct can appear only inside of the @code{INPUT} or @code{GROUP} +commands, among other filenames. The files listed will be handled +as if they appear directly in the @code{INPUT} or @code{GROUP} commands, +with the exception of ELF shared libraries, that will be added only +when they are actually needed. This construct essentially enables +@option{--as-needed} option for all the files listed inside of it +and restores previous @option{--as-needed} resp. @option{--no-as-needed} +setting afterwards. + @item OUTPUT(@var{filename}) @kindex OUTPUT(@var{filename}) @cindex output file name in linker scripot diff --git a/ld/ldgram.y b/ld/ldgram.y index 49f274d259d..23151d8f6b0 100644 --- a/ld/ldgram.y +++ b/ld/ldgram.y @@ -1,6 +1,6 @@ /* A YACC grammar to parse a superset of the AT&T linker scripting language. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. Written by Steve Chamberlain of Cygnus Support (steve@cygnus.com). This file is part of GNU ld. @@ -144,7 +144,7 @@ static int error_index; %token STARTUP HLL SYSLIB FLOAT NOFLOAT NOCROSSREFS %token ORIGIN FILL %token LENGTH CREATE_OBJECT_SYMBOLS INPUT GROUP OUTPUT CONSTRUCTORS -%token ALIGNMOD AT SUBALIGN PROVIDE +%token ALIGNMOD AT SUBALIGN PROVIDE AS_NEEDED %type assign_op atype attributes_opt sect_constraint %type filename %token CHIP LIST SECT ABSOLUTE LOAD NEWLINE ENDWORD ORDER NAMEWORD ASSERT_K @@ -372,6 +372,18 @@ input_list: | input_list LNAME { lang_add_input_file($2,lang_input_file_is_l_enum, (char *)NULL); } + | AS_NEEDED '(' + { $$ = as_needed; as_needed = TRUE; } + input_list ')' + { as_needed = $3; } + | input_list ',' AS_NEEDED '(' + { $$ = as_needed; as_needed = TRUE; } + input_list ')' + { as_needed = $5; } + | input_list AS_NEEDED '(' + { $$ = as_needed; as_needed = TRUE; } + input_list ')' + { as_needed = $4; } ; sections: diff --git a/ld/ldlex.l b/ld/ldlex.l index d49c0852bca..70059e14086 100644 --- a/ld/ldlex.l +++ b/ld/ldlex.l @@ -1,7 +1,7 @@ %{ /* Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, - 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + 2000, 2001, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. This file is part of GLD, the Gnu Linker. @@ -269,6 +269,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([*?.$_a-zA-Z0-9\[\]\-\!\^\\]|::)* "OUTPUT" { RTOKEN(OUTPUT);} "INPUT" { RTOKEN(INPUT);} "GROUP" { RTOKEN(GROUP);} +"AS_NEEDED" { RTOKEN(AS_NEEDED);} "DEFINED" { RTOKEN(DEFINED);} "CREATE_OBJECT_SYMBOLS" { RTOKEN(CREATE_OBJECT_SYMBOLS);} "CONSTRUCTORS" { RTOKEN( CONSTRUCTORS);} -- 2.30.2