From: James Clarke Date: Wed, 10 Aug 2016 16:47:45 +0000 (-0700) Subject: Fix improper handling of R_SPARC_GOTDATA_OP_LOX10 relocation. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=007801eeb19ed565eb4dc4020831f6d293f46930;p=binutils-gdb.git 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 --git a/gold/ChangeLog b/gold/ChangeLog index cca545586b9..d0a670b1df7 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,9 @@ +2016-08-10 James Clarke + + 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 PR gold/20441 diff --git a/gold/sparc.cc b/gold/sparc.cc index d9a8ef4da53..8e66b7772a8 100644 --- a/gold/sparc.cc +++ b/gold/sparc.cc @@ -3469,6 +3469,13 @@ Target_sparc::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::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;