ld.so: Export tls_init_tp_called as __rtld_tls_init_tp_called

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>
This commit is contained in:
Florian Weimer 2022-10-27 11:36:44 +02:00
parent 77db67c56b
commit a65ff76c9a
2 changed files with 8 additions and 5 deletions

View File

@ -730,7 +730,7 @@ match_version (const char *string, struct link_map *map)
return 0; return 0;
} }
static bool tls_init_tp_called; bool __rtld_tls_init_tp_called;
static void * static void *
init_tls (size_t naudit) init_tls (size_t naudit)
@ -800,7 +800,7 @@ cannot allocate TLS data structures for initial thread\n");
if (__glibc_unlikely (lossage != NULL)) if (__glibc_unlikely (lossage != NULL))
_dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage); _dl_fatal_printf ("cannot set up thread-local storage: %s\n", lossage);
__tls_init_tp (); __tls_init_tp ();
tls_init_tp_called = true; __rtld_tls_init_tp_called = true;
return tcbp; 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 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 used. Trying to do it lazily is too hairy to try when there could be
multiple threads (from a non-TLS-using libpthread). */ 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) if (tcbp == NULL)
tcbp = init_tls (0); tcbp = init_tls (0);
@ -2321,7 +2321,7 @@ dl_main (const ElfW(Phdr) *phdr,
consider_profiling); consider_profiling);
/* Add object to slot information data if necessasy. */ /* 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); _dl_add_to_slotinfo (l, true);
} }
} }
@ -2347,7 +2347,7 @@ dl_main (const ElfW(Phdr) *phdr,
_dl_allocate_tls_init (tcbp, false); _dl_allocate_tls_init (tcbp, false);
/* And finally install it for the main thread. */ /* 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); const char *lossage = TLS_INIT_TP (tcbp);
if (__glibc_unlikely (lossage != NULL)) if (__glibc_unlikely (lossage != NULL))

View File

@ -1219,6 +1219,9 @@ extern void *_dl_allocate_tls_storage (void) attribute_hidden;
extern void *_dl_allocate_tls_init (void *, bool); extern void *_dl_allocate_tls_init (void *, bool);
rtld_hidden_proto (_dl_allocate_tls_init) 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. */ /* Deallocate memory allocated with _dl_allocate_tls. */
extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb); extern void _dl_deallocate_tls (void *tcb, bool dealloc_tcb);
rtld_hidden_proto (_dl_deallocate_tls) rtld_hidden_proto (_dl_deallocate_tls)