Message ID | 08163a7b1e71d42325dfa3baeec3193268729771.1661775887.git.fweimer@redhat.com |
---|---|
State | New |
Headers | show |
Series | Rework exception handling in the dynamic loader [BZ #25486] | expand |
On 2022-08-29 08:26, Florian Weimer via Libc-alpha wrote: > This allows the rest of dynamic loader to check whether the TCB > has been set up (and THREAD_GETMEM and THREAD_SETMEM will work). > --- > elf/rtld.c | 10 +++++----- > sysdeps/generic/ldsodefs.h | 3 +++ > 2 files changed, 8 insertions(+), 5 deletions(-) LGTM. Reviewed-by: Siddhesh Poyarekar <siddhesh@gotplt.org> > > diff --git a/elf/rtld.c b/elf/rtld.c > index cbbaf4a331..714434b21d 100644 > --- a/elf/rtld.c > +++ b/elf/rtld.c > @@ -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); > > @@ -2315,7 +2315,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); > } > } > @@ -2341,7 +2341,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)) > diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h > index 050a3032de..fc81affed0 100644 > --- a/sysdeps/generic/ldsodefs.h > +++ b/sysdeps/generic/ldsodefs.h > @@ -1217,6 +1217,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)
diff --git a/elf/rtld.c b/elf/rtld.c index cbbaf4a331..714434b21d 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -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); @@ -2315,7 +2315,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); } } @@ -2341,7 +2341,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)) diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index 050a3032de..fc81affed0 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -1217,6 +1217,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)