]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
PowerPC64 GOLD: complain on misaligned _DS relocs
authorAlan Modra <amodra@gmail.com>
Tue, 24 Feb 2015 07:46:26 +0000 (18:16 +1030)
committerAlan Modra <amodra@gmail.com>
Wed, 18 Mar 2015 07:19:35 +0000 (17:49 +1030)
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.

gold/ChangeLog
gold/powerpc.cc

index 4fc46e4b370f677d5c6a2295940b16ac22c173c6..90c3aa75e09fa738c135d186c3145d3736925ddd 100644 (file)
@@ -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
index 9843f2fb603ae2a686452f67362f2862c8294733..93f2fcccba93beac8ec132a4b679395fe618ca32 100644 (file)
@@ -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;