[PATCH v2] elf: Release dl_load_lock before running dlopen constructors (BZ 15686)

Artem Proskurnev temap@mail.ru
Tue Jul 14 08:42:33 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
>
I got it. Indeed I did it wrong when I used IS_IN (rtld). This is a 
significantly more complex patch. But I will try to implement it.

Thank you very much for your response!

Artem


More information about the Libc-alpha mailing list