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

Florian Weimer <[email protected]>
Newsgroups gmane.comp.lib.glibc.alpha
Message-ID <[email protected]>
* Alexander Pevzner:

> Hi!
>
> On 7/13/26 8:43 AM, Florian Weimer wrote:
>
>> I believe this results in a data race on l_init_called.  In a
>> multi-threaded application, the same ELF constructor may execute with
>> itself in parallel on different threads, or dlopen may return before the
>> ELF constructor has completed running in another thread.  Some form of
>> synchronization is required to deal with these scenarios, perhaps using
>> pthread_once or a condition variable.
>
> I don't quite understand how could it happen. Constructors are running
> on a context of the thread that called dlopen, and should all complete
> before dlopen is finished and returned.

I expect that after your change, there is no synchronization that
protects the l_init_called update in call_init in elf/dl-init.c.

I think if you arrange for suitable sleeps or barriers, you can get a
second dlopen for the same object on another thread to return while the
constructor is still executing on a first thread.  This was not possible
before.

>> We also likely cannot remove a lock like this for old applications which
>> may depend on its existence.  We can deal with this with a different
>> mechanism.
>
> What visible change in behavior do you expect?

Two different DSOs access the same process-wide resource (say a global
variable in a third DSO, perhaps to register themselves) without
explicit synchronization.  Previously, this was safe due to the loader
lock.

Thanks,
Florian
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.