Use _initterm_e() for executing functions in __xi_a[] ... __xi_z[] array. This function properly stops execution on error and returns error value. Same logic is doing Visual C++ startup code.
This fixes error handling of function callbacks defined in that array. --- mingw-w64-crt/crt/crtdll.c | 3 ++- mingw-w64-crt/crt/crtexe.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/mingw-w64-crt/crt/crtdll.c b/mingw-w64-crt/crt/crtdll.c index 754648a6382b..7894466c6f85 100644 --- a/mingw-w64-crt/crt/crtdll.c +++ b/mingw-w64-crt/crt/crtdll.c @@ -97,7 +97,8 @@ WINBOOL WINAPI _CRT_INIT (HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) { __native_startup_state = __initializing; - _initterm ((_PVFV *) (void *) __xi_a, (_PVFV *) (void *) __xi_z); + if (_initterm_e (__xi_a, __xi_z) != 0) + return FALSE; } if (__native_startup_state == __initializing) { diff --git a/mingw-w64-crt/crt/crtexe.c b/mingw-w64-crt/crt/crtexe.c index 4f058a8e1f5f..a21a0ebe5526 100644 --- a/mingw-w64-crt/crt/crtexe.c +++ b/mingw-w64-crt/crt/crtexe.c @@ -229,7 +229,8 @@ __tmainCRTStartup (void) else if (__native_startup_state == __uninitialized) { __native_startup_state = __initializing; - _initterm ((_PVFV *)(void *)__xi_a, (_PVFV *)(void *) __xi_z); + if (_initterm_e (__xi_a, __xi_z) != 0) + return 255; } else has_cctor = 1; -- 2.20.1 _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public