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/binutils-2_27-branch] Fix improper handling of R_SPARC_GOTDATA_OP_LOX10 relocation.


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

commit 652f9c564865f6593c288bdae87944cca4cebdc4
Author: James Clarke <jrtc27@jrtc27.com>
Date:   Wed Aug 10 09:47:45 2016 -0700

    Fix improper handling of R_SPARC_GOTDATA_OP_LOX10 relocation.
    
    The fall-through in Target_sparc::Relocate::relocate for
    R_SPARC_GOTDATA_OP_LOX10 is currently R_SPARC_GOT13, but should
    clearly be R_SPARC_GOT10. GCC has been seen to emit a sethi/xor
    rather than a sethi/or sequence to load a 32-bit immediate, but
    if R_SPARC_GOT13 is used then bits 10-12 get zeroed out as both
    the sethi and xor immediates contain them.
    
    gold/
    	PR gold/20442
    	* sparc.cc (Target_sparc::Relocate::relocate): R_SPARC_GOTDATA_OP_LOX10
    	should fall back on R_SPARC_GOT10, not R_SPARC_GOT13.

Diff:
---
 gold/ChangeLog |  6 ++++++
 gold/sparc.cc  | 14 +++++++-------
 2 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/gold/ChangeLog b/gold/ChangeLog
index cca5455..d0a670b 100644
--- a/gold/ChangeLog
+++ b/gold/ChangeLog
@@ -1,5 +1,11 @@
 2016-08-10  James Clarke  <jrtc27@jrtc27.com>
 
+	PR gold/20442
+	* sparc.cc (Target_sparc::Relocate::relocate): R_SPARC_GOTDATA_OP_LOX10
+	should fall back on R_SPARC_GOT10, not R_SPARC_GOT13.
+
+2016-08-10  James Clarke  <jrtc27@jrtc27.com>
+
 	PR gold/20441
 	* sparc.cc (Target_sparc::Scan::check_non_pic): Allow R_SPARC_32 on
 	sparc64.
diff --git a/gold/sparc.cc b/gold/sparc.cc
index d9a8ef4..8e66b77 100644
--- a/gold/sparc.cc
+++ b/gold/sparc.cc
@@ -3469,6 +3469,13 @@ Target_sparc<size, big_endian>::Relocate::relocate(
       Reloc::lo10(view, object, psymval, addend);
       break;
 
+    case elfcpp::R_SPARC_GOTDATA_OP_LOX10:
+      if (gdop_valid)
+	{
+	  Reloc::gdop_lox10(view, got_offset);
+	  break;
+	}
+      /* Fall through.  */
     case elfcpp::R_SPARC_GOT10:
       Reloc::lo10(view, got_offset, addend);
       break;
@@ -3487,13 +3494,6 @@ Target_sparc<size, big_endian>::Relocate::relocate(
 	}
       break;
 
-    case elfcpp::R_SPARC_GOTDATA_OP_LOX10:
-      if (gdop_valid)
-	{
-	  Reloc::gdop_lox10(view, got_offset);
-	  break;
-	}
-      /* Fall through.  */
     case elfcpp::R_SPARC_GOT13:
       Reloc::rela32_13(view, got_offset, addend);
       break;


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