diff options
Diffstat (limited to 'nptl/init.c')
-rw-r--r-- | nptl/init.c | 9 |
1 files changed, 9 insertions, 0 deletions
diff --git a/nptl/init.c b/nptl/init.c index dae24f1eac..1f60e92aeb 100644 --- a/nptl/init.c +++ b/nptl/init.c @@ -270,6 +270,15 @@ __pthread_initialize_minimal_internal (void) /* Transfer the old value from the dynamic linker's internal location. */ *__libc_dl_error_tsd () = *(*GL(dl_error_catch_tsd)) (); GL(dl_error_catch_tsd) = &__libc_dl_error_tsd; + + /* Make __rtld_lock_{,un}lock_recursive use pthread_mutex_{,un}lock, + keep the lock count from the ld.so implementation. */ + GL(dl_rtld_lock_recursive) = (void *) INTUSE (__pthread_mutex_lock); + GL(dl_rtld_unlock_recursive) = (void *) INTUSE (__pthread_mutex_unlock); + unsigned int rtld_lock_count = GL(dl_load_lock).mutex.__data.__count; + GL(dl_load_lock).mutex.__data.__count = 0; + while (rtld_lock_count-- > 0) + INTUSE (__pthread_mutex_lock) (&GL(dl_load_lock).mutex); #endif GL(dl_init_static_tls) = &__pthread_init_static_tls; |