aboutsummaryrefslogtreecommitdiff
path: root/gold/sparc.cc
diff options
context:
space:
mode:
authorJames Clarke <jrtc27@jrtc27.com>2016-08-10 09:47:45 -0700
committerCary Coutant <ccoutant@gmail.com>2016-08-10 09:48:26 -0700
commit007801eeb19ed565eb4dc4020831f6d293f46930 (patch)
tree72645b53290b3cca14e8bb34ebce9a2056d8de21 /gold/sparc.cc
parent55872e496e89285814d11f03bb543091d6757318 (diff)
downloadfsf-binutils-gdb-007801eeb19ed565eb4dc4020831f6d293f46930.zip
fsf-binutils-gdb-007801eeb19ed565eb4dc4020831f6d293f46930.tar.gz
fsf-binutils-gdb-007801eeb19ed565eb4dc4020831f6d293f46930.tar.bz2
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.
Diffstat (limited to 'gold/sparc.cc')
-rw-r--r--gold/sparc.cc14
1 files changed, 7 insertions, 7 deletions
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;