This is the mail archive of the binutils-cvs@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]

[binutils-gdb] Fix bug when applying R_SPARC_GOTDATA_OP* relocations to local symbols.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=9eacb935acd69f6532135ec1353630db5111467c

commit 9eacb935acd69f6532135ec1353630db5111467c
Author: Cary Coutant <ccoutant@gmail.com>
Date:   Tue Oct 6 14:43:49 2015 -0700

    Fix bug when applying R_SPARC_GOTDATA_OP* relocations to local symbols.
    
    When applying a GOTDATA_OP* relocation to a local symbol, the addend
    is being applied after getting the value of the symbol. When the
    relocation refers to a merge section, however, the addend must be
    provided when computing the symbol value, since the contents of
    the section may have been rearranged.
    
    gold/
    	PR gold/18855
    	* sparc.cc (Sparc_relocate_functions::gdop_hix22): Remove addend
    	parameter.
    	(Sparc_relocate_functions::gdop_lox10): Likewise.
    	(Target_sparc::Relocate::relocate): Use addend when computing
    	symbol value for R_SPARC_GOTDATA_OP*.

Diff:
---
 gold/ChangeLog |  9 +++++++++
 gold/sparc.cc  | 16 +++++++---------
 2 files changed, 16 insertions(+), 9 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index 49ce2fe..180309e 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,3 +1,12 @@
+2015-10-06  Cary Coutant  <ccoutant@gmail.com>
+
+	PR gold/18855
+	* sparc.cc (Sparc_relocate_functions::gdop_hix22): Remove addend
+	parameter.
+	(Sparc_relocate_functions::gdop_lox10): Likewise.
+	(Target_sparc::Relocate::relocate): Use addend when computing
+	symbol value for R_SPARC_GOTDATA_OP*.
+
 2015-09-07  Cary Coutant  <ccoutant@gmail.com>
 
 	PR gold/18930
diff --git a/gold/sparc.cc b/gold/sparc.cc
index d34585a..db845b7 100644
--- a/gold/sparc.cc
+++ b/gold/sparc.cc
@@ -1107,13 +1107,12 @@ public:
   // R_SPARC_GOTDATA_OP_HIX22: @gdopoff(Symbol + Addend) >> 10
   static inline void
   gdop_hix22(unsigned char* view,
-	     typename elfcpp::Elf_types<size>::Elf_Addr value,
-	     typename elfcpp::Elf_types<size>::Elf_Addr addend)
+	     typename elfcpp::Elf_types<size>::Elf_Addr value)
   {
     typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
     Valtype* wv = reinterpret_cast<Valtype*>(view);
     Valtype val = elfcpp::Swap<32, true>::readval(wv);
-    int32_t reloc = static_cast<int32_t>(value + addend);
+    int32_t reloc = static_cast<int32_t>(value);
 
     val &= ~0x3fffff;
 
@@ -1170,13 +1169,12 @@ public:
   // R_SPARC_GOTDATA_OP_LOX10: (@gdopoff(Symbol + Addend) & 0x3ff) | 0x1c00
   static inline void
   gdop_lox10(unsigned char* view,
-	     typename elfcpp::Elf_types<size>::Elf_Addr value,
-	     typename elfcpp::Elf_types<size>::Elf_Addr addend)
+	     typename elfcpp::Elf_types<size>::Elf_Addr value)
   {
     typedef typename elfcpp::Swap<32, true>::Valtype Valtype;
     Valtype* wv = reinterpret_cast<Valtype*>(view);
     Valtype val = elfcpp::Swap<32, true>::readval(wv);
-    int32_t reloc = static_cast<int32_t>(value + addend);
+    int32_t reloc = static_cast<int32_t>(value);
 
     if (reloc < 0)
       reloc = (reloc & 0x3ff) | 0x1c00;
@@ -3244,7 +3242,7 @@ Target_sparc<size, big_endian>::Relocate::relocate(
 	      && !gsym->is_preemptible()
 	      && !orig_is_ifunc))
 	{
-	  got_offset = psymval->value(object, 0) - target->got_address();
+	  got_offset = psymval->value(object, addend) - target->got_address();
 	  gdop_valid = true;
 	  break;
 	}
@@ -3384,7 +3382,7 @@ Target_sparc<size, big_endian>::Relocate::relocate(
     case elfcpp::R_SPARC_GOTDATA_OP_LOX10:
       if (gdop_valid)
 	{
-	  Reloc::gdop_lox10(view, got_offset, addend);
+	  Reloc::gdop_lox10(view, got_offset);
 	  break;
 	}
       /* Fall through.  */
@@ -3395,7 +3393,7 @@ Target_sparc<size, big_endian>::Relocate::relocate(
     case elfcpp::R_SPARC_GOTDATA_OP_HIX22:
       if (gdop_valid)
 	{
-	  Reloc::gdop_hix22(view, got_offset, addend);
+	  Reloc::gdop_hix22(view, got_offset);
 	  break;
 	}
       /* Fall through.  */


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