]> sourceware.org Git - glibc.git/commitdiff
[BZ #18572] arm: Disable lazy initialization of tlsdesc entries
authorSzabolcs Nagy <szabolcs.nagy@arm.com>
Fri, 20 Oct 2017 16:35:12 +0000 (17:35 +0100)
committerSzabolcs Nagy <szabolcs.nagy@arm.com>
Fri, 3 Nov 2017 14:47:35 +0000 (14:47 +0000)
Follow up to
https://sourceware.org/ml/libc-alpha/2015-11/msg00272.html

Always do tls descriptor initialization at load time during relocation
processing (as if DF_BIND_NOW were set for the binary) to avoid barriers
at every tls access.  This patch mimics bind-now semantics in the lazy
relocation code of the arm target (elf_machine_lazy_rel).

Ideally the static linker should be updated too to not emit tlsdesc
relocs in DT_REL*, so elf_machine_lazy_rel is not called on them at all.

[BZ #18572]
* sysdeps/arm/dl-machine.h (elf_machine_lazy_rel): Do symbol binding
non-lazily for R_ARM_TLS_DESC.

ChangeLog
sysdeps/arm/dl-machine.h

index 778e41fd455c887081a6bd44ee56b3c809ad01da..e1dc25c62eab6b2f2382c431c7b890c49025ef1f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2017-11-03  Szabolcs Nagy  <szabolcs.nagy@arm.com>
+
+       [BZ #18572]
+       * sysdeps/arm/dl-machine.h (elf_machine_lazy_rel): Do symbol binding
+       non-lazily for R_ARM_TLS_DESC.
+
 2017-11-03  Szabolcs Nagy  <szabolcs.nagy@arm.com>
 
        [BZ #17078]
index bf5f5d205c4f195f5d681c661ad0ba010f1d9113..c59386f515732d6fc083bb1728d69d71d2b589b5 100644 (file)
@@ -669,15 +669,21 @@ elf_machine_lazy_rel (struct link_map *map,
     }
   else if (__builtin_expect (r_type == R_ARM_TLS_DESC, 1))
     {
-      struct tlsdesc volatile *td =
-       (struct tlsdesc volatile *)reloc_addr;
-
-      /* The linker must have given us the parameter we need in the
-        first GOT entry, and left the second one empty.  We fill the
-        latter with the resolver address.  */
-      assert (td->entry == 0);
-      td->entry = (void*)(D_PTR (map, l_info[ADDRIDX (DT_TLSDESC_PLT)])
-                         + map->l_addr);
+      const Elf_Symndx symndx = ELFW (R_SYM) (reloc->r_info);
+      const ElfW (Sym) *symtab = (const void *)D_PTR (map, l_info[DT_SYMTAB]);
+      const ElfW (Sym) *sym = &symtab[symndx];
+      const struct r_found_version *version = NULL;
+
+      if (map->l_info[VERSYMIDX (DT_VERSYM)] != NULL)
+       {
+         const ElfW (Half) *vernum =
+           (const void *)D_PTR (map, l_info[VERSYMIDX (DT_VERSYM)]);
+         version = &map->l_versions[vernum[symndx] & 0x7fff];
+       }
+
+      /* Always initialize TLS descriptors completely, because lazy
+        initialization requires synchronization at every TLS access.  */
+      elf_machine_rel (map, reloc, sym, version, reloc_addr, skip_ifunc);
     }
   else
     _dl_reloc_bad_type (map, r_type, 1);
This page took 0.078847 seconds and 5 git commands to generate.