crt: Fix _onexit() function for DLL builds MS documentation for _onexit function says: In the case when _onexit is called from within a DLL, routines registered with _onexit run when the DLL is unloaded, after DllMain is called with DLL_PROCESS_DETACH. And for this functionality msvc statically links _onexit functionality for DLL builds, and do not let applications to use msvcrt.dll's _onexit symbol directly. Fix this issue in mingw-w64 by redefining _onexit function to calls private mingw-w64 atexit() function, which already distinguish between EXE and DLL builds. Include this _onexit function into every CRT import library and disable original _onexit symbol in all def files. Signed-off-by: Martin Storsjö <martin@martin.st>
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am index fa62d0f..c781387 100644 --- a/mingw-w64-crt/Makefile.am +++ b/mingw-w64-crt/Makefile.am
@@ -159,6 +159,7 @@ # Files included in all libmsvcr*.a src_msvcrt_common=\ + misc/_onexit.c \ misc/mbsinit.c \ misc/onexit_table.c \ misc/register_tls_atexit.c \ @@ -353,7 +354,6 @@ # Files included in libucrt*.a src_ucrtbase=\ misc/ucrt_compat.c \ - misc/ucrt__onexit.c \ misc/ucrt__getmainargs.c \ misc/ucrt__wgetmainargs.c \ misc/ucrt_at_quick_exit.c \ @@ -365,6 +365,7 @@ misc/__p__osver_emul.c \ misc/__initenv.c \ misc/__winitenv.c \ + misc/_onexit.c \ misc/ucrt-access.c \ stdio/ucrt_fprintf.c \ stdio/ucrt_fscanf.c \
diff --git a/mingw-w64-crt/lib-common/msvcr120_app.def.in b/mingw-w64-crt/lib-common/msvcr120_app.def.in index 48f3df0..4508a43 100644 --- a/mingw-w64-crt/lib-common/msvcr120_app.def.in +++ b/mingw-w64-crt/lib-common/msvcr120_app.def.in
@@ -1499,7 +1499,7 @@ _msize _nextafter F_X64(_nextafterf) -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pctype DATA
diff --git a/mingw-w64-crt/lib-common/msvcrt.def.in b/mingw-w64-crt/lib-common/msvcrt.def.in index a1b4761..18e994f 100644 --- a/mingw-w64-crt/lib-common/msvcrt.def.in +++ b/mingw-w64-crt/lib-common/msvcrt.def.in
@@ -756,7 +756,7 @@ _mktemp _msize _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osver DATA
diff --git a/mingw-w64-crt/lib32/crtdll.def.in b/mingw-w64-crt/lib32/crtdll.def.in index 297c551..82cf0bc 100644 --- a/mingw-w64-crt/lib32/crtdll.def.in +++ b/mingw-w64-crt/lib32/crtdll.def.in
@@ -318,7 +318,7 @@ _mktemp _msize _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osmajor_dll DATA
diff --git a/mingw-w64-crt/lib32/msvcr100.def.in b/mingw-w64-crt/lib32/msvcr100.def.in index a7646f5..03929c7 100644 --- a/mingw-w64-crt/lib32/msvcr100.def.in +++ b/mingw-w64-crt/lib32/msvcr100.def.in
@@ -1245,7 +1245,7 @@ _mktime64 _msize _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _outp
diff --git a/mingw-w64-crt/lib32/msvcr100d.def.in b/mingw-w64-crt/lib32/msvcr100d.def.in index 0a54d46..30a7307 100644 --- a/mingw-w64-crt/lib32/msvcr100d.def.in +++ b/mingw-w64-crt/lib32/msvcr100d.def.in
@@ -1304,7 +1304,7 @@ _msize _msize_dbg _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _outp
diff --git a/mingw-w64-crt/lib32/msvcr110.def.in b/mingw-w64-crt/lib32/msvcr110.def.in index a041054..089a865 100644 --- a/mingw-w64-crt/lib32/msvcr110.def.in +++ b/mingw-w64-crt/lib32/msvcr110.def.in
@@ -1378,7 +1378,7 @@ _mktime64 _msize _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _outp
diff --git a/mingw-w64-crt/lib32/msvcr110d.def.in b/mingw-w64-crt/lib32/msvcr110d.def.in index a0d3857..c68ee7b 100644 --- a/mingw-w64-crt/lib32/msvcr110d.def.in +++ b/mingw-w64-crt/lib32/msvcr110d.def.in
@@ -1437,7 +1437,7 @@ _msize _msize_dbg _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _outp
diff --git a/mingw-w64-crt/lib32/msvcr120.def.in b/mingw-w64-crt/lib32/msvcr120.def.in index 2551b30..25a271b 100644 --- a/mingw-w64-crt/lib32/msvcr120.def.in +++ b/mingw-w64-crt/lib32/msvcr120.def.in
@@ -1411,7 +1411,7 @@ _mktime64 _msize _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _outp
diff --git a/mingw-w64-crt/lib32/msvcr120d.def.in b/mingw-w64-crt/lib32/msvcr120d.def.in index d827260..e1bb5f4 100644 --- a/mingw-w64-crt/lib32/msvcr120d.def.in +++ b/mingw-w64-crt/lib32/msvcr120d.def.in
@@ -1470,7 +1470,7 @@ _msize _msize_dbg _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _outp
diff --git a/mingw-w64-crt/lib32/msvcr40d.def.in b/mingw-w64-crt/lib32/msvcr40d.def.in index 53ca088..544816d 100644 --- a/mingw-w64-crt/lib32/msvcr40d.def.in +++ b/mingw-w64-crt/lib32/msvcr40d.def.in
@@ -1299,7 +1299,7 @@ _mtlock _mtunlock _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/lib32/msvcr70.def.in b/mingw-w64-crt/lib32/msvcr70.def.in index 9ed6a5b..689f8f7 100644 --- a/mingw-w64-crt/lib32/msvcr70.def.in +++ b/mingw-w64-crt/lib32/msvcr70.def.in
@@ -503,7 +503,7 @@ _mktime64 _msize _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osplatform DATA
diff --git a/mingw-w64-crt/lib32/msvcr70d.def.in b/mingw-w64-crt/lib32/msvcr70d.def.in index ad7e14d..910b883 100644 --- a/mingw-w64-crt/lib32/msvcr70d.def.in +++ b/mingw-w64-crt/lib32/msvcr70d.def.in
@@ -546,7 +546,7 @@ _msize _msize_dbg _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osplatform DATA
diff --git a/mingw-w64-crt/lib32/msvcr71.def.in b/mingw-w64-crt/lib32/msvcr71.def.in index b6bbe0c..7904cf8 100644 --- a/mingw-w64-crt/lib32/msvcr71.def.in +++ b/mingw-w64-crt/lib32/msvcr71.def.in
@@ -496,7 +496,7 @@ _mktime64 _msize _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osplatform DATA
diff --git a/mingw-w64-crt/lib32/msvcr71d.def.in b/mingw-w64-crt/lib32/msvcr71d.def.in index f256199..d6bf80e 100644 --- a/mingw-w64-crt/lib32/msvcr71d.def.in +++ b/mingw-w64-crt/lib32/msvcr71d.def.in
@@ -539,7 +539,7 @@ _msize _msize_dbg _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osplatform DATA
diff --git a/mingw-w64-crt/lib32/msvcr80.def.in b/mingw-w64-crt/lib32/msvcr80.def.in index f15ea5d..ec463fb 100644 --- a/mingw-w64-crt/lib32/msvcr80.def.in +++ b/mingw-w64-crt/lib32/msvcr80.def.in
@@ -876,7 +876,7 @@ _mktime64 _msize _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osplatform DATA
diff --git a/mingw-w64-crt/lib32/msvcr80d.def.in b/mingw-w64-crt/lib32/msvcr80d.def.in index 3340a18..2711952 100644 --- a/mingw-w64-crt/lib32/msvcr80d.def.in +++ b/mingw-w64-crt/lib32/msvcr80d.def.in
@@ -951,7 +951,7 @@ _msize _msize_dbg _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osplatform DATA
diff --git a/mingw-w64-crt/lib32/msvcr90.def.in b/mingw-w64-crt/lib32/msvcr90.def.in index cf15aa6..c39b475 100644 --- a/mingw-w64-crt/lib32/msvcr90.def.in +++ b/mingw-w64-crt/lib32/msvcr90.def.in
@@ -873,7 +873,7 @@ _mktime64 _msize _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _outp
diff --git a/mingw-w64-crt/lib32/msvcr90d.def.in b/mingw-w64-crt/lib32/msvcr90d.def.in index 3267aa2..90e7cbd 100644 --- a/mingw-w64-crt/lib32/msvcr90d.def.in +++ b/mingw-w64-crt/lib32/msvcr90d.def.in
@@ -937,7 +937,7 @@ _msize _msize_dbg _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _outp
diff --git a/mingw-w64-crt/lib32/msvcrt10.def.in b/mingw-w64-crt/lib32/msvcrt10.def.in index c5ec604..0f99e6a 100644 --- a/mingw-w64-crt/lib32/msvcrt10.def.in +++ b/mingw-w64-crt/lib32/msvcrt10.def.in
@@ -1022,7 +1022,7 @@ _mtlockinit _mtunlock _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osver DATA
diff --git a/mingw-w64-crt/lib32/msvcrt20.def.in b/mingw-w64-crt/lib32/msvcrt20.def.in index d096781..781f86a 100644 --- a/mingw-w64-crt/lib32/msvcrt20.def.in +++ b/mingw-w64-crt/lib32/msvcrt20.def.in
@@ -1146,7 +1146,7 @@ _mtlock _mtunlock _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/lib32/msvcrt40.def.in b/mingw-w64-crt/lib32/msvcrt40.def.in index 6fad2dc..3122f0e 100644 --- a/mingw-w64-crt/lib32/msvcrt40.def.in +++ b/mingw-w64-crt/lib32/msvcrt40.def.in
@@ -1268,7 +1268,7 @@ _mtlock _mtunlock _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/lib32/msvcrtd.def.in b/mingw-w64-crt/lib32/msvcrtd.def.in index 0231821..04426ad 100644 --- a/mingw-w64-crt/lib32/msvcrtd.def.in +++ b/mingw-w64-crt/lib32/msvcrtd.def.in
@@ -473,7 +473,7 @@ _msize _msize_dbg _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osver DATA
diff --git a/mingw-w64-crt/lib64/msvcr100.def.in b/mingw-w64-crt/lib64/msvcr100.def.in index af3beef..f1f680f 100644 --- a/mingw-w64-crt/lib64/msvcr100.def.in +++ b/mingw-w64-crt/lib64/msvcr100.def.in
@@ -1197,7 +1197,7 @@ _msize _nextafter _nextafterf -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/lib64/msvcr100d.def.in b/mingw-w64-crt/lib64/msvcr100d.def.in index b8b54ee..d4d4040 100644 --- a/mingw-w64-crt/lib64/msvcr100d.def.in +++ b/mingw-w64-crt/lib64/msvcr100d.def.in
@@ -1254,7 +1254,7 @@ _msize_dbg _nextafter _nextafterf -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/lib64/msvcr110.def.in b/mingw-w64-crt/lib64/msvcr110.def.in index e39f93e..e7c3570 100644 --- a/mingw-w64-crt/lib64/msvcr110.def.in +++ b/mingw-w64-crt/lib64/msvcr110.def.in
@@ -1321,7 +1321,7 @@ _msize _nextafter _nextafterf -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/lib64/msvcr110d.def.in b/mingw-w64-crt/lib64/msvcr110d.def.in index dfcd603..e401c9d 100644 --- a/mingw-w64-crt/lib64/msvcr110d.def.in +++ b/mingw-w64-crt/lib64/msvcr110d.def.in
@@ -1378,7 +1378,7 @@ _msize_dbg _nextafter _nextafterf -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/lib64/msvcr120.def.in b/mingw-w64-crt/lib64/msvcr120.def.in index 3f517eb..0762aab 100644 --- a/mingw-w64-crt/lib64/msvcr120.def.in +++ b/mingw-w64-crt/lib64/msvcr120.def.in
@@ -1352,7 +1352,7 @@ _msize _nextafter _nextafterf -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/lib64/msvcr120d.def.in b/mingw-w64-crt/lib64/msvcr120d.def.in index 364cc1f..3af9c66 100644 --- a/mingw-w64-crt/lib64/msvcr120d.def.in +++ b/mingw-w64-crt/lib64/msvcr120d.def.in
@@ -1409,7 +1409,7 @@ _msize_dbg _nextafter _nextafterf -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/lib64/msvcr80.def.in b/mingw-w64-crt/lib64/msvcr80.def.in index a5690aa..1e66668 100644 --- a/mingw-w64-crt/lib64/msvcr80.def.in +++ b/mingw-w64-crt/lib64/msvcr80.def.in
@@ -814,7 +814,7 @@ _msize _nextafter _nextafterf -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osplatform DATA
diff --git a/mingw-w64-crt/lib64/msvcr80d.def.in b/mingw-w64-crt/lib64/msvcr80d.def.in index e829294..3228feb 100644 --- a/mingw-w64-crt/lib64/msvcr80d.def.in +++ b/mingw-w64-crt/lib64/msvcr80d.def.in
@@ -883,7 +883,7 @@ _msize_dbg _nextafter _nextafterf -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _osplatform DATA
diff --git a/mingw-w64-crt/lib64/msvcr90.def.in b/mingw-w64-crt/lib64/msvcr90.def.in index 8143378..73de424 100644 --- a/mingw-w64-crt/lib64/msvcr90.def.in +++ b/mingw-w64-crt/lib64/msvcr90.def.in
@@ -815,7 +815,7 @@ _msize _nextafter _nextafterf -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/lib64/msvcr90d.def.in b/mingw-w64-crt/lib64/msvcr90d.def.in index c066beb..87f8d48 100644 --- a/mingw-w64-crt/lib64/msvcr90d.def.in +++ b/mingw-w64-crt/lib64/msvcr90d.def.in
@@ -873,7 +873,7 @@ _msize_dbg _nextafter _nextafterf -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/libarm32/kernelbase.def b/mingw-w64-crt/libarm32/kernelbase.def index 90c91ab..62d7917 100644 --- a/mingw-w64-crt/libarm32/kernelbase.def +++ b/mingw-w64-crt/libarm32/kernelbase.def
@@ -1886,7 +1886,7 @@ _initterm _initterm_e _invalid_parameter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _purecall _time64 _crt_atexit == atexit ; rename atexit to _crt_atexit for compatibility with UCRT, real atexit function provided by mingw-w64
diff --git a/mingw-w64-crt/libarm32/msvcr110.def.in b/mingw-w64-crt/libarm32/msvcr110.def.in index 8bced22..d0af03f 100644 --- a/mingw-w64-crt/libarm32/msvcr110.def.in +++ b/mingw-w64-crt/libarm32/msvcr110.def.in
@@ -1308,7 +1308,7 @@ _mktime64 _msize _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/libarm32/msvcr110d.def.in b/mingw-w64-crt/libarm32/msvcr110d.def.in index 584bf08..2dd7f38 100644 --- a/mingw-w64-crt/libarm32/msvcr110d.def.in +++ b/mingw-w64-crt/libarm32/msvcr110d.def.in
@@ -1365,7 +1365,7 @@ _msize _msize_dbg _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/libarm32/msvcr120.def.in b/mingw-w64-crt/libarm32/msvcr120.def.in index a9e717d..c32ad49 100644 --- a/mingw-w64-crt/libarm32/msvcr120.def.in +++ b/mingw-w64-crt/libarm32/msvcr120.def.in
@@ -1321,7 +1321,7 @@ _mktime64 _msize _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/libarm32/msvcr120d.def.in b/mingw-w64-crt/libarm32/msvcr120d.def.in index b1a4eff..b30ad0e 100644 --- a/mingw-w64-crt/libarm32/msvcr120d.def.in +++ b/mingw-w64-crt/libarm32/msvcr120d.def.in
@@ -1378,7 +1378,7 @@ _msize _msize_dbg _nextafter -_onexit +; _onexit ; disable _onexit for compatibility with DLL builds, real _onexit function provided by mingw-w64 _open _open_osfhandle _pclose
diff --git a/mingw-w64-crt/misc/ucrt__onexit.c b/mingw-w64-crt/misc/_onexit.c similarity index 74% rename from mingw-w64-crt/misc/ucrt__onexit.c rename to mingw-w64-crt/misc/_onexit.c index 14e6cda..9caf0f7 100644 --- a/mingw-w64-crt/misc/ucrt__onexit.c +++ b/mingw-w64-crt/misc/_onexit.c
@@ -4,14 +4,10 @@ * No warranty is given; refer to the file DISCLAIMER.PD within this package. */ -#undef __MSVCRT_VERSION__ -#define _UCRT - #include <stdlib.h> -#include <corecrt_startup.h> _onexit_t __cdecl _onexit(_onexit_t func) { - return _crt_atexit((_PVFV)func) == 0 ? func : NULL; + return atexit((void (__cdecl *)(void))func) == 0 ? func : NULL; } _onexit_t __cdecl (*__MINGW_IMP_SYMBOL(_onexit))(_onexit_t func) = _onexit;