* elf64-ppc.c (ppc64_elf_check_relocs): Match versioned
authorAlan Modra <amodra@gmail.com>
Tue, 11 Feb 2003 03:02:46 +0000 (03:02 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 11 Feb 2003 03:02:46 +0000 (03:02 +0000)
.__tls_get_addr too.
(ppc64_elf_tls_setup): Ensure cached tls_get_addr is not indirect.

bfd/ChangeLog
bfd/elf64-ppc.c

index 0741c55d1f40d2e2ab643ef3e39d49a4c545ae9b..42c6d2b4dba65e8379ce8b19b66518539bb6796d 100644 (file)
@@ -1,3 +1,9 @@
+2003-02-11  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf64-ppc.c (ppc64_elf_check_relocs): Match versioned
+       .__tls_get_addr too.
+       (ppc64_elf_tls_setup): Ensure cached tls_get_addr is not indirect.
+
 2003-02-10  Kaz kojima  <kkojima@rr.iij4u.or.jp>
 
        * elf32-sh.c (elf_sh_dyn_relocs): Add tls_tpoff32 field.
index 63dc8f34b94ce043a1c400e94faf36bf093776e5..7bf926ff0c81b1a63c6358037acd170dad1b6ea9 100644 (file)
@@ -3726,7 +3726,10 @@ ppc64_elf_check_relocs (abfd, info, sec, relocs)
                return FALSE;
              if (h == htab->tls_get_addr)
                sec->has_tls_reloc = 1;
-             else if (strcmp (h->root.root.string, ".__tls_get_addr") == 0)
+             else if ((strncmp (h->root.root.string, ".__tls_get_addr", 15)
+                       == 0)
+                      && (h->root.root.string[15] == 0
+                          || h->root.root.string[15] == '@'))
                {
                  htab->tls_get_addr = h;
                  sec->has_tls_reloc = 1;
@@ -5171,6 +5174,18 @@ ppc64_elf_tls_setup (obfd, info)
 
   htab = ppc_hash_table (info);
   htab->tls_sec = tls;
+
+  if (htab->tls_get_addr != NULL)
+    {
+      struct elf_link_hash_entry *h = htab->tls_get_addr;
+
+      while (h->root.type == bfd_link_hash_indirect
+            || h->root.type == bfd_link_hash_warning)
+       h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+      htab->tls_get_addr = h;
+    }
+
   return tls != NULL;
 }