[GOLD] PowerPC64 __tls_get_addr_opt stub
authorAlan Modra <amodra@gmail.com>
Wed, 23 Sep 2020 13:24:01 +0000 (22:54 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 23 Sep 2020 22:25:48 +0000 (07:55 +0930)
This stub doesn't have the r2 store at the beginning.

* powerpc.cc (Target_powerpc::Relocate::relocate): Don't skip
first insn of __tls_get_addr_opt stub.

gold/ChangeLog
gold/powerpc.cc

index 176b728606deedc26804439efccf8c1da2484905..3cd441af656e464fb55cbcf5b0bf202a3b330e0b 100644 (file)
@@ -1,3 +1,8 @@
+2020-09-24  Alan Modra  <amodra@gmail.com>
+
+       * powerpc.cc (Target_powerpc::Relocate::relocate): Don't skip
+       first insn of __tls_get_addr_opt stub.
+
 2020-08-24  Alan Modra  <amodra@gmail.com>
 
        * powerpc.cc (Target_powerpc): Add tprel_opt_ and accessors.
index e35cbcf6c0b7935ab213e38f95e88bdace32883e..1020fa42f995d5e123ebef5f6676375e36f24c88 100644 (file)
@@ -10401,21 +10401,24 @@ Target_powerpc<size, big_endian>::Relocate::relocate(
                    value += ent->tocoff_;
                  if (size == 64
                      && ent->r2save_
-                     && r_type == elfcpp::R_PPC64_REL24_NOTOC)
+                     && !(gsym != NULL
+                          && target->is_tls_get_addr_opt(gsym)))
                    {
-                     if (!(target->power10_stubs()
-                           && target->power10_stubs_auto()))
-                       value += 4;
-                   }
-                 else if (size == 64
-                          && ent->r2save_
-                          && relnum < reloc_count - 1)
-                   {
-                     Reltype next_rela(preloc + reloc_size);
-                     if (elfcpp::elf_r_type<size>(next_rela.get_r_info())
-                         == elfcpp::R_PPC64_TOCSAVE
-                         && next_rela.get_r_offset() == rela.get_r_offset() + 4)
-                       value += 4;
+                     if (r_type == elfcpp::R_PPC64_REL24_NOTOC)
+                       {
+                         if (!(target->power10_stubs()
+                               && target->power10_stubs_auto()))
+                           value += 4;
+                       }
+                     else if (relnum < reloc_count - 1)
+                       {
+                         Reltype next_rela(preloc + reloc_size);
+                         if (elfcpp::elf_r_type<size>(next_rela.get_r_info())
+                             == elfcpp::R_PPC64_TOCSAVE
+                             && (next_rela.get_r_offset()
+                                 == rela.get_r_offset() + 4))
+                           value += 4;
+                       }
                    }
                  localentry0 = ent->localentry0_;
                  has_stub_value = true;