This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH, PR/3469] properly handle cloned symbols used in relocations
- From: "Jan Beulich" <jbeulich at novell dot com>
- To: <binutils at sourceware dot org>
- Date: Wed, 15 Nov 2006 11:25:09 +0000
- Subject: [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