public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 1/4] LD: Linker script hidden symbol support
@ 2012-08-03 18:01 Maciej W. Rozycki
  2012-08-04 11:54 ` Alan Modra
  0 siblings, 1 reply; 3+ messages in thread
From: Maciej W. Rozycki @ 2012-08-03 18:01 UTC (permalink / raw)
  To: binutils; +Cc: Richard Sandiford

Hi,

 A change to LD seven years ago, as recorded here:

http://sourceware.org/ml/binutils/2005-08/msg00045.html

switched the scope of symbols created in linker scripts from object to 
global.  A later update added support for hidden default symbols (as in 
PROVIDE vs PROVIDE_HIDDEN) here:

http://sourceware.org/ml/binutils/2005-08/msg00054.html

however the lost ability to create hidden symbols unconditionally has 
never been restituted.

 A workaround exists, in the form of version scripts (that may also be 
embedded in regular linker scripts with the use of the VERSION keyword) 
that can force the scope of any global symbols back to object, however 
that approach was not considered back when PROVIDE_HIDDEN was defined and 
therefore I decided to follow the precedent and implement a new keyword 
that will complement the three cases already handled: assignment, PROVIDE 
and PROVIDE_HIDDEN.

 Somewhat unimaginatively I called the new keyword HIDDEN, its syntax is 
exactly like that of PROVIDE and PROVIDE_HIDDEN, and its semantics exactly 
like that of a simple assignment (compound assignments are not supported; 
they don't adjust the scope of an already defined symbol), except that the 
newly defined symbol will have its scope set to object.

 While at it I have cleaned up a hack that reached as far as BFD and that 
caused this change not to be contained within LD -- for unconditional 
symbol definitions current code overloads the "hidden" member of the 
assignment structure used internally to mean the symbol has been defined 
with the --defsym command-line option rather than in a script.

 As a result unrelated code has to handle this special case in a few 
places, including BFD, with a suitable comment attached to explain what is 
really going on there, for a questionable saving of some structure space.  
With this change I have removed the hack and there is now a separate 
"defsym" member that denotes such symbols explicitly.

 The original change also broke all MIPS SVR4 ABI binaries produced as 
with the switch from the object to the global scope the required _gp 
symbol was no longer defined such as the MIPS psABI mandated.  This will 
be handled with a follow-up change, building on functionality added here.

 I have regression-tested it successfully against a superset of Alan's set 
of targets with no problems seen.  OK to apply?

2012-08-03  Maciej W. Rozycki  <macro@codesourcery.com>

	bfd/
	* elflink.c (bfd_elf_record_link_assignment): Remove --defsym
	symbols special case.

	ld/
	* ldexp.h (etree_union): Add defsym member to the assign member
	structure.
	(exp_assign): Add hidden argument to prototype.
	* ldexp.c (exp_fold_tree_1): Use the defsym member to handle
	--defsym symbols.
	(exp_assop): Add defsym argument, initialize the defsym member
	of the assign structure.
	(exp_assign): Handle hidden symbols.
	(exp_defsym): Update to use the defsym argument to exp_assop.
	(exp_provide): Update to handle the defsym argument to exp_assop.
	* ldlex.l (HIDDEN): New token.
	* ldgram.y (HIDDEN): Likewise.
	(assignment, section): Update calls to exp_assign.
	* ldctor.c (ldctor_build_sets): Likewise.
	* mri.c (mri_format): Likewise.
	* ldlang.c (lang_insert_orphan, lang_leave_overlay): Likewise.
	(open_input_bfds): Remove --defsym symbols special case.
	* ld/emultempl/beos.em (gld_${EMULATION_NAME}_set_symbols):
	Update call to exp_assign.
	* ld/emultempl/pe.em (gld_${EMULATION_NAME}_set_symbols):
	Likewise.
	* ld/emultempl/pep.em (gld_${EMULATION_NAME}_set_symbols):
	Likewise.
	* ld/emultempl/spuelf.em (spu_place_special_section): Likewise.
	* ld/emultempl/xtensaelf.em (ld_xtensa_insert_page_offsets):
	Likewise.
	* ld.texinfo (Assigning Values to Symbols): Add HIDDEN.
	(HIDDEN): New subsection.

  Maciej

binutils-ld-hidden.diff
Index: binutils-fsf-trunk-quilt/bfd/elflink.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/bfd/elflink.c	2012-07-30 19:11:21.000000000 +0100
+++ binutils-fsf-trunk-quilt/bfd/elflink.c	2012-08-02 22:35:36.011761953 +0100
@@ -569,7 +569,7 @@ bfd_elf_record_link_assignment (bfd *out
 
   h->def_regular = 1;
 
-  if (provide && hidden)
+  if (hidden)
     {
       bed = get_elf_backend_data (output_bfd);
       h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
Index: binutils-fsf-trunk-quilt/ld/ld.texinfo
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/ld.texinfo	2012-07-30 19:11:21.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/ld.texinfo	2012-08-02 22:35:36.011761953 +0100
@@ -3410,6 +3410,7 @@ the symbol and place it into the symbol 
 
 @menu
 * Simple Assignments::		Simple Assignments
+* HIDDEN::			HIDDEN
 * PROVIDE::			PROVIDE
 * PROVIDE_HIDDEN::		PROVIDE_HIDDEN
 * Source Code Reference::	How to use a linker script defined symbol in source code
@@ -3473,6 +3474,31 @@ the last @samp{.text} input section.  Th
 defined as the address following the @samp{.text} output section aligned
 upward to a 4 byte boundary.
 
+@node HIDDEN
+@subsection HIDDEN
+@cindex HIDDEN
+For ELF targeted ports, define a symbol that will be hidden and won't be
+exported.  The syntax is @code{HIDDEN(@var{symbol} = @var{expression})}.
+
+Here is the example from @ref{Simple Assignments}, rewritten to use
+@code{HIDDEN}:
+
+@smallexample
+HIDDEN(floating_point = 0);
+SECTIONS
+@{
+  .text :
+    @{
+      *(.text)
+      HIDDEN(_etext = .);
+    @}
+  HIDDEN(_bdata = (. + 3) & ~ 3);
+  .data : @{ *(.data) @}
+@}
+@end smallexample
+@noindent
+In this case none of the three symbols will be visible outside this module.
+
 @node PROVIDE
 @subsection PROVIDE
 @cindex PROVIDE
Index: binutils-fsf-trunk-quilt/ld/ldctor.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/ldctor.c	2012-07-30 19:11:21.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/ldctor.c	2012-08-02 22:35:36.011761953 +0100
@@ -321,9 +321,11 @@ ldctor_build_sets (void)
 
       lang_add_assignment (exp_assign (".",
 				       exp_unop (ALIGN_K,
-						 exp_intop (reloc_size))));
+						 exp_intop (reloc_size)),
+				       FALSE));
       lang_add_assignment (exp_assign (p->h->root.string,
-				       exp_nameop (NAME, ".")));
+				       exp_nameop (NAME, "."),
+				       FALSE));
       lang_add_data (size, exp_intop (p->count));
 
       for (e = p->elements; e != NULL; e = e->next)
Index: binutils-fsf-trunk-quilt/ld/ldexp.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/ldexp.c	2012-07-30 19:11:21.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/ldexp.c	2012-08-02 22:35:36.041394701 +0100
@@ -892,7 +892,7 @@ exp_fold_tree_1 (etree_type *tree)
 	  if (expld.result.valid_p
 	      || (expld.phase <= lang_mark_phase_enum
 		  && tree->type.node_class == etree_assign
-		  && tree->assign.hidden))
+		  && tree->assign.defsym))
 	    {
 	      if (h == NULL)
 		{
@@ -1054,6 +1054,7 @@ static etree_type *
 exp_assop (const char *dst,
 	   etree_type *src,
 	   enum node_tree_enum class,
+	   bfd_boolean defsym,
 	   bfd_boolean hidden)
 {
   etree_type *n;
@@ -1065,20 +1066,25 @@ exp_assop (const char *dst,
   n->assign.type.node_class = class;
   n->assign.src = src;
   n->assign.dst = dst;
+  n->assign.defsym = defsym;
   n->assign.hidden = hidden;
   return n;
 }
 
+/* Handle linker script assignments and HIDDEN.  */
+
 etree_type *
-exp_assign (const char *dst, etree_type *src)
+exp_assign (const char *dst, etree_type *src, bfd_boolean hidden)
 {
-  return exp_assop (dst, src, etree_assign, FALSE);
+  return exp_assop (dst, src, etree_assign, FALSE, hidden);
 }
 
+/* Handle --defsym command-line option.  */
+
 etree_type *
 exp_defsym (const char *dst, etree_type *src)
 {
-  return exp_assop (dst, src, etree_assign, TRUE);
+  return exp_assop (dst, src, etree_assign, TRUE, FALSE);
 }
 
 /* Handle PROVIDE.  */
@@ -1086,7 +1092,7 @@ exp_defsym (const char *dst, etree_type 
 etree_type *
 exp_provide (const char *dst, etree_type *src, bfd_boolean hidden)
 {
-  return exp_assop (dst, src, etree_provide, hidden);
+  return exp_assop (dst, src, etree_provide, FALSE, hidden);
 }
 
 /* Handle ASSERT.  */
Index: binutils-fsf-trunk-quilt/ld/ldexp.h
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/ldexp.h	2012-07-30 19:11:21.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/ldexp.h	2012-08-02 22:35:36.061761927 +0100
@@ -67,6 +67,7 @@ typedef union etree_union {
     node_type type;
     const char *dst;
     union etree_union *src;
+    bfd_boolean defsym;
     bfd_boolean hidden;
   } assign;
   struct {
@@ -199,7 +200,7 @@ etree_type *exp_unop
 etree_type *exp_nameop
   (int, const char *);
 etree_type *exp_assign
-  (const char *, etree_type *);
+  (const char *, etree_type *, bfd_boolean);
 etree_type *exp_defsym
   (const char *, etree_type *);
 etree_type *exp_provide
Index: binutils-fsf-trunk-quilt/ld/ldgram.y
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/ldgram.y	2012-07-30 19:11:21.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/ldgram.y	2012-08-02 22:35:36.061761927 +0100
@@ -146,7 +146,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 PROVIDE_HIDDEN AS_NEEDED
+%token ALIGNMOD AT SUBALIGN HIDDEN PROVIDE PROVIDE_HIDDEN 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
@@ -759,7 +759,7 @@ end:	';' | ','
 assignment:
 		NAME '=' mustbe_exp
 		{
-		  lang_add_assignment (exp_assign ($1, $3));
+		  lang_add_assignment (exp_assign ($1, $3, FALSE));
 		}
 	|	NAME assign_op mustbe_exp
 		{
@@ -767,7 +767,11 @@ end:	';' | ','
 						   exp_binop ($2,
 							      exp_nameop (NAME,
 									  $1),
-							      $3)));
+							      $3), FALSE));
+		}
+	|	HIDDEN '(' NAME '=' mustbe_exp ')'
+		{
+		  lang_add_assignment (exp_assign ($3, $5, TRUE));
 		}
 	|	PROVIDE '(' NAME '=' mustbe_exp ')'
 		{
@@ -1085,7 +1089,7 @@ section:	NAME 		{ ldlex_expression(); }
 		opt_exp_with_type
 		{
 		  ldlex_popstate ();
-		  lang_add_assignment (exp_assign (".", $3));
+		  lang_add_assignment (exp_assign (".", $3, FALSE));
 		}
 		'{' sec_or_group_p1 '}'
 	|	INCLUDE filename
Index: binutils-fsf-trunk-quilt/ld/ldlang.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/ldlang.c	2012-08-02 15:17:47.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/ldlang.c	2012-08-02 22:35:36.061761927 +0100
@@ -3286,7 +3286,7 @@ open_input_bfds (lang_statement_union_ty
 #endif
 	  break;
 	case lang_assignment_statement_enum:
-	  if (s->assignment_statement.exp->assign.hidden)
+	  if (s->assignment_statement.exp->assign.defsym)
 	    /* This is from a --defsym on the command line.  */
 	    exp_fold_tree_no_dot (s->assignment_statement.exp);
 	  break;
@@ -7437,7 +7437,7 @@ lang_leave_overlay (etree_type *lma_expr
     {
       overlay_list->os->update_dot = 1;
       overlay_list->os->update_dot_tree
-	= exp_assign (".", exp_binop ('+', overlay_vma, overlay_max));
+	= exp_assign (".", exp_binop ('+', overlay_vma, overlay_max), FALSE);
     }
 
   l = overlay_list;
Index: binutils-fsf-trunk-quilt/ld/ldlex.l
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/ldlex.l	2012-07-30 19:11:21.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/ldlex.l	2012-08-02 22:35:36.061761927 +0100
@@ -320,6 +320,7 @@ V_IDENTIFIER [*?.$_a-zA-Z\[\]\-\!\^\\]([
 <BOTH,SCRIPT>"PHDRS"			{ RTOKEN (PHDRS); }
 <EXPRESSION,BOTH,SCRIPT>"AT"		{ RTOKEN(AT);}
 <EXPRESSION,BOTH,SCRIPT>"SUBALIGN"	{ RTOKEN(SUBALIGN);}
+<EXPRESSION,BOTH,SCRIPT>"HIDDEN"	{ RTOKEN(HIDDEN); }
 <EXPRESSION,BOTH,SCRIPT>"PROVIDE"	{ RTOKEN(PROVIDE); }
 <EXPRESSION,BOTH,SCRIPT>"PROVIDE_HIDDEN" { RTOKEN(PROVIDE_HIDDEN); }
 <EXPRESSION,BOTH,SCRIPT>"KEEP"		{ RTOKEN(KEEP); }
Index: binutils-fsf-trunk-quilt/ld/mri.c
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/mri.c	2012-07-30 19:11:21.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/mri.c	2012-08-02 22:35:36.061761927 +0100
@@ -297,7 +297,7 @@ mri_format (const char *name)
 void
 mri_public (const char *name, etree_type *exp)
 {
-  lang_add_assignment (exp_assign (name, exp));
+  lang_add_assignment (exp_assign (name, exp, FALSE));
 }
 
 void
Index: binutils-fsf-trunk-quilt/ld/emultempl/beos.em
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/emultempl/beos.em	2012-07-30 19:11:20.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/emultempl/beos.em	2012-08-02 22:38:10.911761895 +0100
@@ -348,7 +348,8 @@ gld_${EMULATION_NAME}_set_symbols (void)
   for (j = 0; init[j].ptr; j++)
     {
       long val = init[j].value;
-      lang_add_assignment (exp_assign (init[j].symbol, exp_intop (val)));
+      lang_add_assignment (exp_assign (init[j].symbol, exp_intop (val),
+				       FALSE));
       if (init[j].size == sizeof(short))
 	*(short *)init[j].ptr = val;
       else if (init[j].size == sizeof(int))
Index: binutils-fsf-trunk-quilt/ld/emultempl/pe.em
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/emultempl/pe.em	2012-07-30 19:11:20.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/emultempl/pe.em	2012-08-02 22:38:10.911761895 +0100
@@ -944,7 +944,7 @@ gld_${EMULATION_NAME}_set_symbols (void)
       lang_assignment_statement_type *rv;
 
       rv = lang_add_assignment (exp_assign (GET_INIT_SYMBOL_NAME (j),
-					    exp_intop (val)));
+					    exp_intop (val), FALSE));
       if (init[j].size == sizeof (short))
 	*(short *) init[j].ptr = val;
       else if (init[j].size == sizeof (int))
@@ -1721,8 +1721,9 @@ gld_${EMULATION_NAME}_unrecognized_file 
 		= pe_def_file->base_address;
 	      init[IMAGEBASEOFF].inited = 1;
 	      if (image_base_statement)
-		image_base_statement->exp = exp_assign ("__image_base__",
-							exp_intop (pe.ImageBase));
+		image_base_statement->exp
+		  = exp_assign ("__image_base__", exp_intop (pe.ImageBase),
+				FALSE);
 	    }
 
 	  if (pe_def_file->stack_reserve != -1
Index: binutils-fsf-trunk-quilt/ld/emultempl/pep.em
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/emultempl/pep.em	2012-07-30 19:11:20.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/emultempl/pep.em	2012-08-02 22:38:10.911761895 +0100
@@ -856,7 +856,7 @@ gld_${EMULATION_NAME}_set_symbols (void)
       lang_assignment_statement_type *rv;
 
       rv = lang_add_assignment (exp_assign (GET_INIT_SYMBOL_NAME (j),
-					    exp_intop (val)));
+					    exp_intop (val), FALSE));
       if (init[j].size == sizeof (short))
 	*(short *) init[j].ptr = (short) val;
       else if (init[j].size == sizeof (int))
@@ -1522,8 +1522,9 @@ gld_${EMULATION_NAME}_unrecognized_file 
 		= pep_def_file->base_address;
 	      init[IMAGEBASEOFF].inited = 1;
 	      if (image_base_statement)
-		image_base_statement->exp = exp_assign ("__image_base__",
-							exp_intop (pep.ImageBase));
+		image_base_statement->exp
+		  = exp_assign ("__image_base__", exp_intop (pep.ImageBase),
+				FALSE);
 	    }
 
 	  if (pep_def_file->stack_reserve != -1
Index: binutils-fsf-trunk-quilt/ld/emultempl/spuelf.em
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/emultempl/spuelf.em	2012-07-30 19:11:20.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/emultempl/spuelf.em	2012-08-02 22:38:10.911761895 +0100
@@ -165,7 +165,7 @@ spu_place_special_section (asection *s, 
 
 	  push_stat_ptr (&os->children);
 	  e_size = exp_intop (params.line_size - s->size);
-	  lang_add_assignment (exp_assign (".", e_size));
+	  lang_add_assignment (exp_assign (".", e_size, FALSE));
 	  pop_stat_ptr ();
 	}
       lang_add_section (&os->children, s, NULL, os);
Index: binutils-fsf-trunk-quilt/ld/emultempl/xtensaelf.em
===================================================================
--- binutils-fsf-trunk-quilt.orig/ld/emultempl/xtensaelf.em	2012-07-30 19:11:20.000000000 +0100
+++ binutils-fsf-trunk-quilt/ld/emultempl/xtensaelf.em	2012-08-02 22:38:10.911761895 +0100
@@ -1887,7 +1887,7 @@ ld_xtensa_insert_page_offsets (bfd_vma d
 		etree_type *name_op = exp_nameop (NAME, ".");
 		etree_type *addend_op = exp_intop (1 << xtensa_page_power);
 		etree_type *add_op = exp_binop ('+', name_op, addend_op);
-		etree_type *assign_op = exp_assign (".", add_op);
+		etree_type *assign_op = exp_assign (".", add_op, FALSE);
 
 		lang_assignment_statement_type *assign_stmt;
 		lang_statement_union_type *assign_union;

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 1/4] LD: Linker script hidden symbol support
  2012-08-03 18:01 [PATCH 1/4] LD: Linker script hidden symbol support Maciej W. Rozycki
@ 2012-08-04 11:54 ` Alan Modra
  2012-08-06 22:42   ` Maciej W. Rozycki
  0 siblings, 1 reply; 3+ messages in thread
From: Alan Modra @ 2012-08-04 11:54 UTC (permalink / raw)
  To: Maciej W. Rozycki; +Cc: binutils, Richard Sandiford

On Fri, Aug 03, 2012 at 07:00:05PM +0100, Maciej W. Rozycki wrote:
> http://sourceware.org/ml/binutils/2005-08/msg00045.html
> 
> switched the scope of symbols created in linker scripts from object to 
> global.

Not so.  The above patch did not change the scope of symbols created
in linker scripts.  What it did do is change some linker created
symbols to instead be created by PROVIDE in the linker script, and
shortly thereafter this was corrected to PROVIDE_HIDDEN.  Linker
script symbols have been global forever.

>  The original change also broke all MIPS SVR4 ABI binaries produced as 
> with the switch from the object to the global scope the required _gp 
> symbol was no longer defined such as the MIPS psABI mandated.

So the above change can't have been responsible for breaking MIPS..
Regardless of that, I like the patch.  Please commit.

> 	bfd/
> 	* elflink.c (bfd_elf_record_link_assignment): Remove --defsym
> 	symbols special case.
> 
> 	ld/
> 	* ldexp.h (etree_union): Add defsym member to the assign member
> 	structure.
> 	(exp_assign): Add hidden argument to prototype.
> 	* ldexp.c (exp_fold_tree_1): Use the defsym member to handle
> 	--defsym symbols.
> 	(exp_assop): Add defsym argument, initialize the defsym member
> 	of the assign structure.
> 	(exp_assign): Handle hidden symbols.
> 	(exp_defsym): Update to use the defsym argument to exp_assop.
> 	(exp_provide): Update to handle the defsym argument to exp_assop.
> 	* ldlex.l (HIDDEN): New token.
> 	* ldgram.y (HIDDEN): Likewise.
> 	(assignment, section): Update calls to exp_assign.
> 	* ldctor.c (ldctor_build_sets): Likewise.
> 	* mri.c (mri_format): Likewise.
> 	* ldlang.c (lang_insert_orphan, lang_leave_overlay): Likewise.
> 	(open_input_bfds): Remove --defsym symbols special case.
> 	* ld/emultempl/beos.em (gld_${EMULATION_NAME}_set_symbols):
> 	Update call to exp_assign.
> 	* ld/emultempl/pe.em (gld_${EMULATION_NAME}_set_symbols):
> 	Likewise.
> 	* ld/emultempl/pep.em (gld_${EMULATION_NAME}_set_symbols):
> 	Likewise.
> 	* ld/emultempl/spuelf.em (spu_place_special_section): Likewise.
> 	* ld/emultempl/xtensaelf.em (ld_xtensa_insert_page_offsets):
> 	Likewise.
> 	* ld.texinfo (Assigning Values to Symbols): Add HIDDEN.
> 	(HIDDEN): New subsection.

-- 
Alan Modra
Australia Development Lab, IBM

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH 1/4] LD: Linker script hidden symbol support
  2012-08-04 11:54 ` Alan Modra
@ 2012-08-06 22:42   ` Maciej W. Rozycki
  0 siblings, 0 replies; 3+ messages in thread
From: Maciej W. Rozycki @ 2012-08-06 22:42 UTC (permalink / raw)
  To: Alan Modra; +Cc: binutils, Richard Sandiford

On Sat, 4 Aug 2012, Alan Modra wrote:

> > http://sourceware.org/ml/binutils/2005-08/msg00045.html
> > 
> > switched the scope of symbols created in linker scripts from object to 
> > global.
> 
> Not so.  The above patch did not change the scope of symbols created
> in linker scripts.  What it did do is change some linker created
> symbols to instead be created by PROVIDE in the linker script, and
> shortly thereafter this was corrected to PROVIDE_HIDDEN.  Linker
> script symbols have been global forever.

 Hmm, I must have misinterpreted the change then, sorry about that.

> >  The original change also broke all MIPS SVR4 ABI binaries produced as 
> > with the switch from the object to the global scope the required _gp 
> > symbol was no longer defined such as the MIPS psABI mandated.
> 
> So the above change can't have been responsible for breaking MIPS..

 I have now checked some old MIPS/Linux binaries I have lurking around and 
_gp appears exported in some back to 2001; those from 2000 do not have the 
symbol in the dynamic table.  Obviously having access to main executable's 
value of GP in shared libraries rather than their own is less than useful 
anyway.
 
> Regardless of that, I like the patch.  Please commit.

 I have done so now, thanks for the review.

  Maciej

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2012-08-06 22:36 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-08-03 18:01 [PATCH 1/4] LD: Linker script hidden symbol support Maciej W. Rozycki
2012-08-04 11:54 ` Alan Modra
2012-08-06 22:42   ` Maciej W. Rozycki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).