From: Yuxuan Shui <yshui@codeweavers.com> --- dlls/msvcrt/crt_init.h | 15 +++++++++++++++ dlls/winecrt0/crt_dllmain.c | 20 +++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/dlls/msvcrt/crt_init.h b/dlls/msvcrt/crt_init.h index 97d9de618cc..7462c82156d 100644 --- a/dlls/msvcrt/crt_init.h +++ b/dlls/msvcrt/crt_init.h @@ -18,6 +18,11 @@ #include <corecrt_startup.h> +/* Reference: mingw-w64-crt: crt/gccmain.c */ +typedef void (*fnptr)(void); +extern fnptr __CTOR_LIST__[]; +extern fnptr __DTOR_LIST__[]; + extern _PIFV __xi_a[]; extern _PIFV __xi_z[]; extern _PVFV __xc_a[]; @@ -39,11 +44,21 @@ static inline int fallback_initterm_e(_PIFV *table, _PIFV *end) static __cdecl void do_global_dtors(void) { + SIZE_T i; + _initterm(__xt_a, __xt_z); + + for (i = 1; __DTOR_LIST__[i]; i++) __DTOR_LIST__[i](); } static void do_global_ctors(void) { + ULONG_PTR nfns = (ULONG_PTR)__CTOR_LIST__[0], i; + + if (nfns == (ULONG_PTR)-1) + for (nfns = 0; __CTOR_LIST__[nfns + 1]; nfns++); + for (i = nfns; i >= 1; i--) __CTOR_LIST__[i](); + if (fallback_initterm_e(__xi_a, __xi_z) != 0) return; _initterm(__xc_a, __xc_z); diff --git a/dlls/winecrt0/crt_dllmain.c b/dlls/winecrt0/crt_dllmain.c index 02dccdec511..fdef5ba11de 100644 --- a/dlls/winecrt0/crt_dllmain.c +++ b/dlls/winecrt0/crt_dllmain.c @@ -26,6 +26,11 @@ #include "windef.h" #include "winbase.h" +/* Reference: mingw-w64-crt: crt/gccmain.c */ +typedef void (*fnptr)(void); +extern fnptr __CTOR_LIST__[]; +extern fnptr __DTOR_LIST__[]; + extern _PIFV __xi_a[]; extern _PIFV __xi_z[]; extern _PVFV __xc_a[]; @@ -53,13 +58,26 @@ BOOL WINAPI DllMainCRTStartup( HINSTANCE inst, DWORD reason, void *reserved ) if (reason == DLL_PROCESS_ATTACH) { + ULONG_PTR nfns = (ULONG_PTR)__CTOR_LIST__[0], i; + + if (nfns == (ULONG_PTR)-1) + for (nfns = 0; __CTOR_LIST__[nfns + 1]; nfns++); + for (i = nfns; i >= 1; i--) __CTOR_LIST__[i](); + if (fallback_initterm_e( __xi_a, __xi_z ) != 0) return FALSE; fallback_initterm( __xc_a, __xc_z ); } ret = DllMain( inst, reason, reserved ); - if (reason == DLL_PROCESS_DETACH) fallback_initterm( __xt_a, __xt_z ); + if (reason == DLL_PROCESS_DETACH) + { + SIZE_T i; + + fallback_initterm( __xt_a, __xt_z ); + + for (i = 1; __DTOR_LIST__[i]; i++) __DTOR_LIST__[i](); + } return ret; } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9758