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]>
