diff options
author | Alan Modra <amodra@gmail.com> | 2015-02-24 18:16:26 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2015-03-18 17:49:35 +1030 |
commit | cff59f06b3b54ae3f5b61795c2719d4e28abf5d4 (patch) | |
tree | d670e1ff5280b2e0f54d74a88eec041272517997 | |
parent | 20951c83ce6f1cc2823375b7523c11452d5d830f (diff) | |
download | binutils-cff59f06b3b54ae3f5b61795c2719d4e28abf5d4.zip binutils-cff59f06b3b54ae3f5b61795c2719d4e28abf5d4.tar.gz binutils-cff59f06b3b54ae3f5b61795c2719d4e28abf5d4.tar.bz2 |
PowerPC64 GOLD: complain on misaligned _DS relocs
PR 18010
* powerpc.cc (Powerpc_relocate_functions::addr16_ds): Always
complain if value is not a multiple of four.
(Target_powerpc::Relocate::relocate): Correct handling of
R_POWERPC_GOT_TPREL16 and R_POWERPC_GOT_TPREL16_LO for ppc64.
-rw-r--r-- | gold/ChangeLog | 7 | ||||
-rw-r--r-- | gold/powerpc.cc | 7 |
2 files changed, 11 insertions, 3 deletions
diff --git a/gold/ChangeLog b/gold/ChangeLog index 4fc46e4..90c3aa7 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,6 +1,13 @@ 2015-03-18 Alan Modra <amodra@gmail.com> Apply from master + 2015-02-24 Alan Modra <amodra@gmail.com> + PR 18010 + * powerpc.cc (Powerpc_relocate_functions::addr16_ds): Always + complain if value is not a multiple of four. + (Target_powerpc::Relocate::relocate): Correct handling of + R_POWERPC_GOT_TPREL16 and R_POWERPC_GOT_TPREL16_LO for ppc64. + 2015-02-18 Alan Modra <amodra@gmail.com> PR 17954 * powerpc.cc (Global_symbol_visitor_opd::operator()): Set default diff --git a/gold/powerpc.cc b/gold/powerpc.cc index 9843f2f..93f2fcc 100644 --- a/gold/powerpc.cc +++ b/gold/powerpc.cc @@ -1626,7 +1626,7 @@ public: addr16_ds(unsigned char* view, Address value, Overflow_check overflow) { Status stat = This::template rela<16,16>(view, 0, 0xfffc, value, overflow); - if (overflow != CHECK_NONE && (value & 3) != 0) + if ((value & 3) != 0) stat = STATUS_OVERFLOW; return stat; } @@ -7518,8 +7518,11 @@ Target_powerpc<size, big_endian>::Relocate::relocate( case elfcpp::R_POWERPC_GOT_DTPREL16: case elfcpp::R_POWERPC_GOT_DTPREL16_LO: + case elfcpp::R_POWERPC_GOT_TPREL16: + case elfcpp::R_POWERPC_GOT_TPREL16_LO: if (size == 64) { + // On ppc64 these are all ds form status = Reloc::addr16_ds(view, value, overflow); break; } @@ -7532,7 +7535,6 @@ Target_powerpc<size, big_endian>::Relocate::relocate( case elfcpp::R_POWERPC_DTPREL16: case elfcpp::R_POWERPC_GOT_TLSGD16: case elfcpp::R_POWERPC_GOT_TLSLD16: - case elfcpp::R_POWERPC_GOT_TPREL16: case elfcpp::R_POWERPC_ADDR16_LO: case elfcpp::R_POWERPC_REL16_LO: case elfcpp::R_PPC64_TOC16_LO: @@ -7542,7 +7544,6 @@ Target_powerpc<size, big_endian>::Relocate::relocate( case elfcpp::R_POWERPC_DTPREL16_LO: case elfcpp::R_POWERPC_GOT_TLSGD16_LO: case elfcpp::R_POWERPC_GOT_TLSLD16_LO: - case elfcpp::R_POWERPC_GOT_TPREL16_LO: status = Reloc::addr16(view, value, overflow); break; |