]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
ld.so: Export tls_init_tp_called as __rtld_tls_init_tp_called
authorFlorian Weimer <fweimer@redhat.com>
Thu, 27 Oct 2022 09:36:44 +0000 (11:36 +0200)
committerFlorian Weimer <fweimer@redhat.com>
Thu, 27 Oct 2022 09:36:44 +0000 (11:36 +0200)
This allows the rest of dynamic loader to check whether the TCB
has been set up (and THREAD_GETMEM and THREAD_SETMEM will work).

Reviewed-by: Siddhesh Poyarekar <siddhesh@gotplt.org>
elf/rtld.c
sysdeps/generic/ldsodefs.h

index 3b78f405623b1e629b4a7440789fdbc10d7acf1a..221be5c71e18a82927c37a438e226de46faee238 100644 (file)
@@ -730,7 +730,7 @@ match_version (const char *string, struct link_map *map)
   return 0;
 }
 
-static bool tls_init_tp_called;
+bool __rtld_tls_init_tp_called;
 
 static void *
 init_tls (size_t naudit)
@@ -800,7 +800,7 @@ cannot allocate TLS data structures for initial thread\n");
   if (__glibc_unlikely (lossage != NULL))
     _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage);
   __tls_init_tp ();
-  tls_init_tp_called = true;
+  __rtld_tls_init_tp_called = true;
 
   return tcbp;
 }
@@ -2050,7 +2050,7 @@ dl_main (const ElfW(Phdr) *phdr,
      an old kernel that can't perform TLS_INIT_TP, even if no TLS is ever
      used.  Trying to do it lazily is too hairy to try when there could be
      multiple threads (from a non-TLS-using libpthread).  */
-  bool was_tls_init_tp_called = tls_init_tp_called;
+  bool was_tls_init_tp_called = __rtld_tls_init_tp_called;
   if (tcbp == NULL)
     tcbp = init_tls (0);
 
@@ -2321,7 +2321,7 @@ dl_main (const ElfW(Phdr) *phdr,
                               consider_profiling);
 
        /* Add object to slot information data if necessasy.  */
-       if (l->l_tls_blocksize != 0 && tls_init_tp_called)
+       if (l->l_tls_blocksize != 0 && __rtld_tls_init_tp_called)
          _dl_add_to_slotinfo (l, true);
       }
   }
@@ -2347,7 +2347,7 @@ dl_main (const ElfW(Phdr) *phdr,
   _dl_allocate_tls_init (tcbp, false);
 
   /* And finally install it for the main thread.  */
-  if (! tls_init_tp_called)
+  if (! __rtld_tls_init_tp_called)
     {
       const char *lossage = TLS_INIT_TP (tcbp);
       if (__glibc_unlikely (lossage != NULL))
index 6b256b83880cea967ea010d804d7288dd8d0cbad..0223aa9f12358175158b3010a13cb13ec0dd3670 100644 (file)
@@ -1219,6 +1219,9 @@ extern void *_dl_allocate_tls_storage (void) attribute_hidden;
 extern void *_dl_allocate_tls_init (void *, bool);
 rtld_hidden_proto (_dl_allocate_tls_init)
 
+/* True if the TCB has been set up.  */
+extern bool __rtld_tls_init_tp_called attribute_hidden;
+
 /* Deallocate memory allocated with _dl_allocate_tls.  */
 extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb);
 rtld_hidden_proto (_dl_deallocate_tls)