rtld: release rtld_bind_lock around calls to .preinit_array initializers

We unlock the bind lock around .init calls anyway.  Also, the main
object cannot be unloaded.

Reported and reviewed by:	dim
PR:	298943
Sponsored by:	The FreeBSD Foundation
MFC after:	1 week
Differential revision:	https://reviews.freebsd.org/D60588
This commit is contained in:
Konstantin Belousov committed 2026-10-10 20:03:01 +03:00
1 parent f877ace816
commit ef758b59a4
1 file changed
+5 -3
+5 -3
View File
@@ -187,7 +187,7 @@ static char *origin_subst_one(Obj_Entry *, char *, const char *, const char *,
bool);
static char *origin_subst(Obj_Entry *, const char *);
static bool obj_resolve_origin(Obj_Entry *obj);
static void preinit_main(void);
static void preinit_main(RtldLockState *lockstate);
static void rtld_recalc_bind_not(const char *);
static void rtld_recalc_dangerous_ld_env(void);
static void rtld_recalc_debug(const char *);
@@ -1005,7 +1005,7 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
rtld_exit_ptr = rtld_exit;
if (obj_main->crt_no_init)
preinit_main();
preinit_main(&lockstate);
objlist_call_init(&initlist, &lockstate);
_r_debug_postinit(&obj_main->linkmap);
objlist_clear(&initlist);
@@ -3122,7 +3122,7 @@ obj_from_addr(const void *addr)
}
static void
preinit_main(void)
preinit_main(RtldLockState *lockstate)
{
uintptr_t *preinit_addr;
int index;
@@ -3131,6 +3131,7 @@ preinit_main(void)
if (preinit_addr == NULL)
return;
lock_release(rtld_bind_lock, lockstate);
for (index = 0; index < obj_main->preinit_array_num; index++) {
if (preinit_addr[index] != 0 && preinit_addr[index] != 1) {
dbg("calling preinit function for %s at %p",
@@ -3140,6 +3141,7 @@ preinit_main(void)
call_init_pointer(obj_main, preinit_addr[index]);
}
}
wlock_acquire(rtld_bind_lock, lockstate);
}
/*