From: Yuxuan Shui <yshui@codeweavers.com> --- dlls/msvcrt/crt_init.c | 12 ++++++++++++ dlls/winecrt0/crt_dllmain.c | 11 +++++++++++ 2 files changed, 23 insertions(+) diff --git a/dlls/msvcrt/crt_init.c b/dlls/msvcrt/crt_init.c index 5dc64c5882b..387b8ee9b23 100644 --- a/dlls/msvcrt/crt_init.c +++ b/dlls/msvcrt/crt_init.c @@ -8,6 +8,11 @@ #include <stdlib.h> #include "minwindef.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[]; @@ -35,11 +40,18 @@ void CDECL _initterm(_PVFV *,_PVFV *); static __cdecl void do_global_dtors(void) { + SIZE_T i; + for (i = 1; __DTOR_LIST__[i]; i++) __DTOR_LIST__[i](); _initterm(__xt_a, __xt_z); } 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 (INIT_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 0b27189b98c..7b3fcc8d419 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[]; @@ -59,6 +64,10 @@ static inline int initterm_e( _PIFV *table, _PIFV *end ) 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 (initterm_e( __xi_a, __xi_z ) != 0) return; initterm( __xc_a, __xc_z ); } @@ -66,6 +75,8 @@ static void do_global_ctors(void) static void do_global_dtors(void) { + SIZE_T i; + for (i = 1; __DTOR_LIST__[i]; i++) __DTOR_LIST__[i](); initterm( __xt_a, __xt_z ); } -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/9758