diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 0741c55d1f..42c6d2b4db 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2003-02-11 Alan Modra + + * 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 * elf32-sh.c (elf_sh_dyn_relocs): Add tls_tpoff32 field. diff --git a/bfd/elf64-ppc.c b/bfd/elf64-ppc.c index 63dc8f34b9..7bf926ff0c 100644 --- a/bfd/elf64-ppc.c +++ b/bfd/elf64-ppc.c @@ -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; }