diff options
author | Florian Weimer <fweimer@redhat.com> | 2021-05-10 10:31:41 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2021-05-10 10:31:41 +0200 |
commit | d6163dfd3831cf48b69f430f37b4c099059a9db5 (patch) | |
tree | fb37627d311887c530307ea5325121f6a4732cc2 /sysdeps/generic | |
parent | a64af8c9b6598f6d2685227f64f5ccb9b48c663c (diff) | |
download | glibc-d6163dfd3831cf48b69f430f37b4c099059a9db5.tar glibc-d6163dfd3831cf48b69f430f37b4c099059a9db5.tar.gz glibc-d6163dfd3831cf48b69f430f37b4c099059a9db5.tar.bz2 glibc-d6163dfd3831cf48b69f430f37b4c099059a9db5.zip |
elf, nptl: Resolve recursive lock implementation early
If libpthread is included in libc, it is not necessary to delay
initialization of the lock/unlock function pointers until libpthread
is loaded. This eliminates two unprotected function pointers
from _rtld_global and removes some initialization code from
libpthread.
Tested-by: Carlos O'Donell <carlos@redhat.com>
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
Diffstat (limited to 'sysdeps/generic')
-rw-r--r-- | sysdeps/generic/ldsodefs.h | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/sysdeps/generic/ldsodefs.h b/sysdeps/generic/ldsodefs.h index 1b064c5894..6d590d1335 100644 --- a/sysdeps/generic/ldsodefs.h +++ b/sysdeps/generic/ldsodefs.h @@ -403,7 +403,7 @@ struct rtld_global struct auditstate _dl_rtld_auditstate[DL_NNS]; #endif -#if defined SHARED && defined _LIBC_REENTRANT \ +#if !PTHREAD_IN_LIBC && defined SHARED \ && defined __rtld_lock_default_lock_recursive EXTERN void (*_dl_rtld_lock_recursive) (void *); EXTERN void (*_dl_rtld_unlock_recursive) (void *); @@ -1318,6 +1318,29 @@ link_map_audit_state (struct link_map *l, size_t index) } #endif /* SHARED */ +#if PTHREAD_IN_LIBC && defined SHARED +/* Recursive locking implementation for use within the dynamic loader. + Used to define the __rtld_lock_lock_recursive and + __rtld_lock_unlock_recursive via <libc-lock.h>. Initialized to a + no-op dummy implementation early. Similar + to GL (dl_rtld_lock_recursive) and GL (dl_rtld_unlock_recursive) + in !PTHREAD_IN_LIBC builds. */ +extern int (*___rtld_mutex_lock) (pthread_mutex_t *) attribute_hidden; +extern int (*___rtld_mutex_unlock) (pthread_mutex_t *lock) attribute_hidden; + +/* Called after libc has been loaded, but before RELRO is activated. + Used to initialize the function pointers to the actual + implementations. */ +void __rtld_mutex_init (void) attribute_hidden; +#else /* !PTHREAD_IN_LIBC */ +static inline void +__rtld_mutex_init (void) +{ + /* The initialization happens later (!PTHREAD_IN_LIBC) or is not + needed at all (!SHARED). */ +} +#endif /* !PTHREAD_IN_LIBC */ + #if THREAD_GSCOPE_IN_TCB void __thread_gscope_wait (void) attribute_hidden; # define THREAD_GSCOPE_WAIT() __thread_gscope_wait () |