aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2015-02-24 18:16:26 +1030
committerAlan Modra <amodra@gmail.com>2015-03-18 17:49:35 +1030
commitcff59f06b3b54ae3f5b61795c2719d4e28abf5d4 (patch)
treed670e1ff5280b2e0f54d74a88eec041272517997
parent20951c83ce6f1cc2823375b7523c11452d5d830f (diff)
downloadbinutils-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/ChangeLog7
-rw-r--r--gold/powerpc.cc7
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;