summaryrefslogtreecommitdiff
path: root/elf/rtld.c
diff options
context:
space:
mode:
Diffstat (limited to 'elf/rtld.c')
-rw-r--r--elf/rtld.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/elf/rtld.c b/elf/rtld.c
index ad325d4c10..a359167f8a 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -857,6 +857,14 @@ rtld_lock_default_unlock_recursive (void *lock)
__rtld_lock_default_unlock_recursive (lock);
}
#endif
+#if PTHREAD_IN_LIBC
+/* Dummy implementation. See __rtld_mutex_init. */
+static int
+rtld_mutex_dummy (pthread_mutex_t *lock)
+{
+ return 0;
+}
+#endif
static void
@@ -1148,6 +1156,10 @@ dl_main (const ElfW(Phdr) *phdr,
GL(dl_rtld_lock_recursive) = rtld_lock_default_lock_recursive;
GL(dl_rtld_unlock_recursive) = rtld_lock_default_unlock_recursive;
#endif
+#if PTHREAD_IN_LIBC
+ ___rtld_mutex_lock = rtld_mutex_dummy;
+ ___rtld_mutex_unlock = rtld_mutex_dummy;
+#endif
/* The explicit initialization here is cheaper than processing the reloc
in the _rtld_local definition's initializer. */
@@ -2363,6 +2375,9 @@ dl_main (const ElfW(Phdr) *phdr,
loader. */
__rtld_malloc_init_real (main_map);
+ /* Likewise for the locking implementation. */
+ __rtld_mutex_init ();
+
/* Mark all the objects so we know they have been already relocated. */
for (struct link_map *l = main_map; l != NULL; l = l->l_next)
{
@@ -2468,6 +2483,9 @@ dl_main (const ElfW(Phdr) *phdr,
at this point. */
__rtld_malloc_init_real (main_map);
+ /* Likewise for the locking implementation. */
+ __rtld_mutex_init ();
+
RTLD_TIMING_VAR (start);
rtld_timer_start (&start);