This is the mail archive of the binutils@sourceware.org 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, PR/3469] properly handle cloned symbols used in relocations


gas/
2006-11-15  Jan Beulich  <jbeulich@novell.com>

	PR/3469
	* symbols.c (symbol_clone): Mark symbol ending up not on symbol
	chain by linking it to itself.
	(resolve_symbol_value): Also check symbol_shadow_p().
	(symbol_shadow_p): New.
	* symbols.h (symbol_shadow_p): Declare.

gas/testsuite/
2006-11-15  Jan Beulich  <jbeulich@novell.com>

	* gas/elf/equ-reloc.[sd]: New.
	* gas/elf/elf.exp: Run new test.

--- 2006-11-14/gas/symbols.c	2006-11-13 15:21:59.000000000 +0100
+++ 2006-11-14/gas/symbols.c	2006-11-14 10:48:16.000000000 +0100
@@ -598,11 +598,13 @@ symbol_clone (symbolS *orgsymP, int repl
 	symbol_lastP = newsymP;
       else if (orgsymP->sy_next)
 	orgsymP->sy_next->sy_previous = newsymP;
-      orgsymP->sy_next = NULL;
+      orgsymP->sy_previous = orgsymP->sy_next = orgsymP;
       debug_verify_symchain (symbol_rootP, symbol_lastP);
 
       symbol_table_insert (newsymP);
     }
+  else
+    newsymP->sy_previous = newsymP->sy_next = newsymP;
 
   return newsymP;
 }
@@ -1078,8 +1080,9 @@ resolve_symbol_value (symbolS *symp)
 	      symp->sy_resolving = 0;
 	      goto exit_dont_set_value;
 	    }
-	  else if (finalize_syms && final_seg == expr_section
-		   && seg_left != expr_section)
+	  else if (finalize_syms &&
+		   ((final_seg == expr_section && seg_left != expr_section) ||
+		    symbol_shadow_p (symp)))
 	    {
 	      /* If the symbol is an expression symbol, do similarly
 		 as for undefined and common syms above.  Handles
@@ -2492,6 +2495,17 @@ symbol_constant_p (symbolS *s)
   return s->sy_value.X_op == O_constant;
 }
 
+/* Return whether a symbol was cloned and thus removed from the global
+   symbol list.  */
+
+int
+symbol_shadow_p (symbolS *s)
+{
+  if (LOCAL_SYMBOL_CHECK (s))
+    return 0;
+  return s->sy_next == s;
+}
+
 /* Return the BFD symbol for a symbol.  */
 
 asymbol *
--- 2006-11-14/gas/symbols.h	2005-11-24 16:54:58.000000000 +0100
+++ 2006-11-14/gas/symbols.h	2006-11-14 10:48:16.000000000 +0100
@@ -192,6 +192,7 @@ extern int symbol_section_p (symbolS *);
 extern int symbol_equated_p (symbolS *);
 extern int symbol_equated_reloc_p (symbolS *);
 extern int symbol_constant_p (symbolS *);
+extern int symbol_shadow_p (symbolS *);
 extern asymbol *symbol_get_bfdsym (symbolS *);
 extern void symbol_set_bfdsym (symbolS *, asymbol *);
 
--- 2006-11-14/gas/testsuite/gas/elf/elf.exp	2006-11-13 15:22:00.000000000 +0100
+++ 2006-11-14/gas/testsuite/gas/elf/elf.exp	2006-11-14 10:48:16.000000000 +0100
@@ -72,6 +72,7 @@ if { ([istarget "*-*-*elf*"]		
 	{ *c54x*-*-* } { }
 	default {
 	    run_dump_test redef
+	    run_dump_test equ-reloc
 	}
     }
     run_dump_test "section0" 
--- 2006-11-14/gas/testsuite/gas/elf/equ-reloc.d	1970-01-01 01:00:00.000000000 +0100
+++ 2006-11-14/gas/testsuite/gas/elf/equ-reloc.d	2006-11-15 09:10:29.000000000 +0100
@@ -0,0 +1,13 @@
+#objdump: -rsj .data
+#name: elf equate relocs
+
+.*: +file format .*
+
+RELOCATION RECORDS FOR \[.*\]:
+OFFSET *TYPE *VALUE 
+0*0 [^ ]+ +(\.bss(\+0x0*4)?|y1)
+0*4 [^ ]+ +(\.bss(\+0x0*8)?|y2)
+#...
+Contents of section .data:
+ 0000 0[04]00000[04] 0[08]00000[08].*
+#pass
--- 2006-11-14/gas/testsuite/gas/elf/equ-reloc.s	1970-01-01 01:00:00.000000000 +0100
+++ 2006-11-14/gas/testsuite/gas/elf/equ-reloc.s	2006-11-14 09:51:51.000000000 +0100
@@ -0,0 +1,16 @@
+	.data
+	.long x1, x2
+
+	.global x1, x2, z2
+
+	.set x1, y1
+	.set x2, y2
+	.set x2, z2
+
+	.section .bss, "aw", %nobits
+x1:
+	.zero	4
+y1:
+	.zero	4
+y2:
+	.zero	4



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