On Wed, 19 Nov 2025 10:11:46 +0100
Corinna Vinschen wrote:
> On Nov 19 08:45, Takashi Yano wrote:
> > For dlopen()'ed DLL, __cxa_finalize() should always be called at dll
> > detach time. The reason is as follows. In the case that dlopen()'ed
> > DLL A is dlclose()'ed in the destructor of DLL B, and the destructor
> > of DLL B is called in exit_state, DLL A will be unloaded by dlclose().
> > If __cxa_finalize() for DLL A is not called here, the destructor of
> > DLL A will be called in exit() even though DLL A is already unloaded.
> > This causes crash at exit(). In this case, __cxa_finalize() should be
> > called before unloading DLL A even in exit_state.
> > 
> > Addresses: https://cygwin.com/pipermail/cygwin/2025-October/258877.html
> > Fixes: c019a66c32f8 ("* dll_init.cc (dll_list::detach) ... Don't call 
> > __cxa_finalize in exiting case.")
> > Reported-by: Thomas Huth <[email protected]>
> > Reviewed-by: Mark Geisert <[email protected]>, Jon Turney 
> > <[email protected]>, Corinna Vinschen <[email protected]>
> > Signed-off-by: Takashi Yano <[email protected]>
> > ---
> >  winsup/cygwin/dll_init.cc | 11 ++++++++++-
> >  1 file changed, 10 insertions(+), 1 deletion(-)
> > 
> > diff --git a/winsup/cygwin/dll_init.cc b/winsup/cygwin/dll_init.cc
> > index 1369165c9..d2ed74bed 100644
> > --- a/winsup/cygwin/dll_init.cc
> > +++ b/winsup/cygwin/dll_init.cc
> > @@ -584,7 +584,16 @@ dll_list::detach (void *retaddr)
> >       /* Ensure our exception handler is enabled for destructors */
> >       exception protect;
> >       /* Call finalize function if we are not already exiting */
> > -     if (!exit_state)
> > +     /* For dlopen()'ed DLL, __cxa_finalize() should always be called
> > +        at dll detach time. The reason is as follows. In the case that
> > +        dlopen()'ed DLL A is dlclose()'ed in the destructor of DLL B,
> > +        and the destructor of DLL B is called in exit_state, DLL A will
> > +        be unloaded by dlclose(). If __cxa_finalize() for DLL A is not
> > +        called here, the destructor of DLL A will be called in exit()
> > +        even though DLL A is already unloaded. This causes crash at
> > +        exit(). In this case, __cxa_finalize() should be called before
> > +        unloading DLL A even in exit_state. */
> > +     if (!exit_state || d->type == DLL_LOAD)
> >         __cxa_finalize (d->handle);
> >       d->run_dtors ();
> >     }
> > -- 
> > 2.51.0
> 
> Sounds good to me, now, thanks!

Thanks! Pushed.

-- 
Takashi Yano <[email protected]>

Reply via email to