This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Add AS_NEEDED () to INPUT () and GROUP () commands in linker scripts


Hi!

ATM it is impossible to link a shared library that uses TLS global or
local dynamic models with -Wl,-z,defs on Linux.
The reason is that __tls_get_addr and similar functions are defined/exported
from the dynamic linker, but the dynamic linker is not added as a
dependency.
On the other side, using something like:

/* GNU ld script
   Use the shared library, but some functions are only in
   the static library, so try that secondarily.  */
OUTPUT_FORMAT(elf64-x86-64)
GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a /lib64/ld-linux-x86-64.so.2 )

in /usr/lib64/libc.so means unnecessary DT_NEEDED for the vast majority
of shared libraries.
We have --as-needed, but so far lacked the ability to set this (temporarily)
from linker scripts.
With the patch below, glibc can use

...
GROUP ( /lib64/libc.so.6 /usr/lib64/libc_nonshared.a AS_NEEDED ( /lib64/ld-linux-x86-64.so.2 ) )

where as_needed will be temporarily set to TRUE for all the files listed
between AS_NEEDED's parens and reset back to the previous setting
afterwards.
Ok to commit?

2005-01-20  Jakub Jelinek  <jakub@redhat.com>

	* 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/ldgram.y.jj	2004-12-09 14:21:39.000000000 +0100
+++ ld/ldgram.y	2005-01-20 10:56:08.028812831 +0100
@@ -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 <token> assign_op atype attributes_opt sect_constraint
 %type <name>  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 '('
+		  { $<integer>$ = as_needed; as_needed = TRUE; }
+		     input_list ')'
+		  { as_needed = $<integer>3; }
+	|	input_list ',' AS_NEEDED '('
+		  { $<integer>$ = as_needed; as_needed = TRUE; }
+		     input_list ')'
+		  { as_needed = $<integer>5; }
+	|	input_list AS_NEEDED '('
+		  { $<integer>$ = as_needed; as_needed = TRUE; }
+		     input_list ')'
+		  { as_needed = $<integer>4; }
 	;
 
 sections:
--- ld/ldlex.l.jj	2004-12-09 14:21:40.000000000 +0100
+++ ld/ldlex.l	2005-01-20 10:24:16.068318830 +0100
@@ -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\[\]\-\!\^\\]([
 <BOTH,SCRIPT>"OUTPUT"			{ RTOKEN(OUTPUT);}
 <BOTH,SCRIPT>"INPUT"			{ RTOKEN(INPUT);}
 <EXPRESSION,BOTH,SCRIPT>"GROUP"		{ RTOKEN(GROUP);}
+<EXPRESSION,BOTH,SCRIPT>"AS_NEEDED"	{ RTOKEN(AS_NEEDED);}
 <EXPRESSION,BOTH,SCRIPT>"DEFINED"	{ RTOKEN(DEFINED);}
 <BOTH,SCRIPT>"CREATE_OBJECT_SYMBOLS"	{ RTOKEN(CREATE_OBJECT_SYMBOLS);}
 <BOTH,SCRIPT>"CONSTRUCTORS"		{ RTOKEN( CONSTRUCTORS);}
--- ld/NEWS.jj	2005-01-20 09:50:41.000000000 +0100
+++ ld/NEWS	2005-01-20 11:03:17.617311825 +0100
@@ -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.
--- ld/ld.texinfo.jj	2005-01-20 09:50:43.000000000 +0100
+++ ld/ld.texinfo	2005-01-20 10:24:26.559450407 +0100
@@ -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 a
 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

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]