Fix breakage for SHT_REL targets where get_r_addend() gives internal error.
authorCary Coutant <ccoutant@gmail.com>
Tue, 12 Jan 2016 19:39:50 +0000 (11:39 -0800)
committerCary Coutant <ccoutant@gmail.com>
Tue, 12 Jan 2016 19:39:50 +0000 (11:39 -0800)
gold/
* arm.cc (Target_arm::Classify_reloc::get_r_addend): New method.
* i386.cc (Target_i386::Classify_reloc::get_r_addend): New method.
* mips.cc (Target_arm::Mips_classify_reloc::get_r_addend): (Both
specializations) New method.

gold/ChangeLog
gold/arm.cc
gold/i386.cc
gold/mips.cc

index c49ec6c9deb7ece3a7157696b48fd7cdd39a3ec1..c16b4a3ec226a7a43fe2ce547216ef34a5386168 100644 (file)
@@ -1,3 +1,10 @@
+2016-01-12  Cary Coutant  <ccoutant@gmail.com>
+
+       * arm.cc (Target_arm::Classify_reloc::get_r_addend): New method.
+       * i386.cc (Target_i386::Classify_reloc::get_r_addend): New method.
+       * mips.cc (Target_arm::Mips_classify_reloc::get_r_addend): (Both
+       specializations) New method.
+
 2016-01-11  Cary Coutant  <ccoutant@gmail.com>
 
        PR gold/19353
index 4cd0b91320ac05b2640e334d39148103216ea3d4..ed13c8709cc4847bdf35dcab951e5ddf21b335c2 100644 (file)
@@ -2749,6 +2749,14 @@ class Target_arm : public Sized_target<32, big_endian>
       public gold::Default_classify_reloc<elfcpp::SHT_REL, 32, big_endian>
   {
    public:
+    typedef typename Reloc_types<elfcpp::SHT_REL, 32, big_endian>::Reloc
+       Reltype;
+
+    // Return the explicit addend of the relocation (return 0 for SHT_REL).
+    static typename elfcpp::Elf_types<32>::Elf_Swxword
+    get_r_addend(const Reltype*)
+    { return 0; }
+
     // Return the size of the addend of the relocation (only used for SHT_REL).
     static unsigned int
     get_size_for_reloc(unsigned int, Relobj*);
index a7168a8f1f4345685c52ea5b80436d1a443cd1db..3715e5eaf857f1af6181dcc247653a74ebca7ca5 100644 (file)
@@ -743,6 +743,14 @@ class Target_i386 : public Sized_target<32, false>
       public gold::Default_classify_reloc<elfcpp::SHT_REL, 32, false>
   {
    public:
+    typedef typename Reloc_types<elfcpp::SHT_REL, 32, false>::Reloc
+       Reltype;
+
+    // Return the explicit addend of the relocation (return 0 for SHT_REL).
+    static typename elfcpp::Elf_types<32>::Elf_Swxword
+    get_r_addend(const Reltype*)
+    { return 0; }
+
     // Return the size of the addend of the relocation (only used for SHT_REL).
     static unsigned int
     get_size_for_reloc(unsigned int, Relobj*);
index c57ef4f807f4a51ade8a46ed822ef1267acc80a1..6c4f379b90231fe4877406cdaf1fd5fd33f19b1f 100644 (file)
@@ -2964,7 +2964,11 @@ class Mips_classify_reloc<sh_type_, 32, big_endian> :
   // Return the explicit addend of the relocation (return 0 for SHT_REL).
   static inline unsigned int
   get_r_addend(const Reltype* reloc)
-  { return Mips_reloc_types<sh_type_, 32, big_endian>::get_r_addend(reloc); }
+  {
+    if (sh_type_ == elfcpp::SHT_REL)
+      return 0;
+    return Mips_reloc_types<sh_type_, 32, big_endian>::get_r_addend(reloc);
+  }
 
   // Write the r_info field to a new reloc, using the r_info field from
   // the original reloc, replacing the r_sym field with R_SYM.
@@ -3010,7 +3014,11 @@ class Mips_classify_reloc<sh_type_, 64, big_endian> :
   // Return the explicit addend of the relocation (return 0 for SHT_REL).
   static inline typename elfcpp::Elf_types<64>::Elf_Swxword
   get_r_addend(const Reltype* reloc)
-  { return Mips_reloc_types<sh_type_, 64, big_endian>::get_r_addend(reloc); }
+  {
+    if (sh_type_ == elfcpp::SHT_REL)
+      return 0;
+    return Mips_reloc_types<sh_type_, 64, big_endian>::get_r_addend(reloc);
+  }
 
   // Write the r_info field to a new reloc, using the r_info field from
   // the original reloc, replacing the r_sym field with R_SYM.