diff options
author | James Clarke <jrtc27@jrtc27.com> | 2016-08-10 09:47:45 -0700 |
---|---|---|
committer | Cary Coutant <ccoutant@gmail.com> | 2016-08-10 09:48:26 -0700 |
commit | 007801eeb19ed565eb4dc4020831f6d293f46930 (patch) | |
tree | 72645b53290b3cca14e8bb34ebce9a2056d8de21 /gold | |
parent | 55872e496e89285814d11f03bb543091d6757318 (diff) | |
download | binutils-007801eeb19ed565eb4dc4020831f6d293f46930.zip binutils-007801eeb19ed565eb4dc4020831f6d293f46930.tar.gz binutils-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')
-rw-r--r-- | gold/ChangeLog | 6 | ||||
-rw-r--r-- | 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; |