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;