[PATCH v2] elf: Release dl_load_lock before running dlopen constructors (BZ 15686)
Florian Weimer
fweimer@redhat.com
Tue Jul 14 04:12:39 GMT 2026
> diff --git a/elf/dl-init.c b/elf/dl-init.c
> index bd85bacdc1..250f7cc175 100644
> --- a/elf/dl-init.c
> +++ b/elf/dl-init.c
> @@ -21,27 +21,24 @@
> #include <ldsodefs.h>
> #include <elf-initfini.h>
>
> +#if !IS_IN (rtld)
> +# include <stdint.h>
> +/* pthread_once_t is int; we use the l_init_once field in struct
> + link_map (also int, zero from calloc matches PTHREAD_ONCE_INIT). */
> +extern int __pthread_once (int *once_control, void (*init_routine) (void));
> +
> +/* Argument for call_init_once_cb. Set by call_init before calling
> + __pthread_once, which invokes the callback synchronously (either
> + immediately, or after blocking). */
> +static __thread struct link_map *call_init_once_arg;
> +
> +static void call_init_once_cb (void);
> +#endif
I don't think this change is effective because elf/dl-init.c is not
built at all for dynamically linked libc.so, only for libc.a and ld.so.
I think a fallible pthread_once variant with a closure pointer would be
generally useful. It could be used here to avoid the thread-local
variable.
We cannot use ELF TLS in ld.so, but we can access fields in struct
pthread. See rtld_catch.
> diff --git a/include/link.h b/include/link.h
> index 8f851d2212..e539535a44 100644
> --- a/include/link.h
> +++ b/include/link.h
> @@ -346,6 +346,12 @@ struct link_map
> size_t l_relro_size;
>
> unsigned long long int l_serial;
> +
> + /* Per-DSO once-initialization control for constructor execution.
> + Used as pthread_once_t (PTHREAD_ONCE_INIT == 0, matching
> + calloc). Only accessed from the libc.so build of dl-init.c
> + (IS_IN (rtld) path is single-threaded). */
> + int l_init_once;
> };
I don't think this will build on Hurd. It doesn't have futexes, so
pthread_once_t contains a spinlock and isn't just an int.
We'll need additional tests that show the synchronization is working as
expected.
My concern regarding the removal of a lock that applications could
previously rely on remains.
Thanks,
Florian
More information about the Libc-alpha
mailing list