crt: Use __acrt_iob_func for accessing __iob in all msvcrt versions

This makes sure that all code in libmingwex that refers to stderr
etc will work correctly even if linked to ucrtbase.

Signed-off-by: Martin Storsjö <martin@martin.st>
Signed-off-by: Jacek Caban <jacek@codeweavers.com>
diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index 3683521..54a28e3 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -153,7 +153,11 @@
   libsrc/wspiapi/WspiapiLoad.c               libsrc/wspiapi/WspiapiGetAddrInfo.c       libsrc/wspiapi/WspiapiGetNameInfo.c        \
   libsrc/wspiapi/WspiapiFreeAddrInfo.c
 
+src_msvcrt_common=\
+  stdio/acrt_iob_func.c
+
 src_msvcrt=\
+  $(src_msvcrt_common) \
   misc/_configthreadlocale.c \
   misc/_get_current_locale.c \
   misc/invalid_parameter_handler.c \
@@ -224,6 +228,7 @@
   misc/__p___argv.c
 
 src_msvcr80_64=\
+  $(src_msvcrt_common) \
   misc/__p___argv.c
 
 # These mingwex sources are target independent:
@@ -635,9 +640,60 @@
 include lib32/Makefile.am
 
 if !W32API
-lib32_DATA += lib32/libglut.a lib32/libmsvcp60.a lib32/libmsvcr80.a lib32/libmsvcr90.a lib32/libmsvcr90d.a lib32/libmsvcr100.a \
-			  lib32/libmsvcr110.a lib32/libmsvcr120.a lib32/libmsvcr120d.a lib32/libcrtdll.a \
-			  lib32/libmsvcr120_app.a lib32/libmsvcp120_app.a
+lib32_DATA += lib32/libglut.a lib32/libmsvcp60.a lib32/libmsvcp120_app.a
+
+lib32_LIBRARIES += lib32/libcrtdll.a
+lib32_libcrtdll_a_SOURCES = $(src_msvcrt_common)
+lib32_libcrtdll_a_AR = $(DTDEF32) $(top_srcdir)/lib32/crtdll.def && $(AR) $(ARFLAGS)
+lib32_libcrtdll_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+
+lib32_LIBRARIES += lib32/libmsvcr80.a
+lib32_libmsvcr80_a_SOURCES = $(src_msvcrt_common) lib32/msvcr80.def.in
+lib32_libmsvcr80_a_AR = $(DTDEF32) lib32/msvcr80.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr80_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib32_libmsvcr80_a_DEPENDENCIES=lib32/msvcr80.def
+
+lib32_LIBRARIES += lib32/libmsvcr90.a
+lib32_libmsvcr90_a_SOURCES = $(src_msvcrt_common) lib32/msvcr90.def.in
+lib32_libmsvcr90_a_AR = $(DTDEF32) lib32/msvcr90.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr90_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib32_libmsvcr90_a_DEPENDENCIES=lib32/msvcr90.def
+
+lib32_LIBRARIES += lib32/libmsvcr90d.a
+lib32_libmsvcr90d_a_SOURCES = $(src_msvcrt_common) lib32/msvcr90d.def.in
+lib32_libmsvcr90d_a_AR = $(DTDEF32) lib32/msvcr90d.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr90d_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib32_libmsvcr90d_a_DEPENDENCIES=lib32/msvcr90d.def
+
+lib32_LIBRARIES += lib32/libmsvcr100.a
+lib32_libmsvcr100_a_SOURCES = $(src_msvcrt_common) lib32/msvcr100.def.in
+lib32_libmsvcr100_a_AR = $(DTDEF32) lib32/msvcr100.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr100_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib32_libmsvcr100_a_DEPENDENCIES=lib32/msvcr100.def
+
+lib32_LIBRARIES += lib32/libmsvcr110.a
+lib32_libmsvcr110_a_SOURCES = $(src_msvcrt_common) lib32/msvcr110.def.in
+lib32_libmsvcr110_a_AR = $(DTDEF32) lib32/msvcr110.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr110_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib32_libmsvcr110_a_DEPENDENCIES=lib32/msvcr110.def
+
+lib32_LIBRARIES += lib32/libmsvcr120.a
+lib32_libmsvcr120_a_SOURCES = $(src_msvcrt_common) lib32/msvcr120.def.in
+lib32_libmsvcr120_a_AR = $(DTDEF32) lib32/msvcr120.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr120_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib32_libmsvcr120_a_DEPENDENCIES=lib32/msvcr120.def
+
+lib32_LIBRARIES += lib32/libmsvcr120d.a
+lib32_libmsvcr120d_a_SOURCES = $(src_msvcrt_common) lib32/msvcr120d.def.in
+lib32_libmsvcr120d_a_AR = $(DTDEF32) lib32/msvcr120d.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr120d_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib32_libmsvcr120d_a_DEPENDENCIES=lib32/msvcr120d.def
+
+lib32_LIBRARIES += lib32/libmsvcr120_app.a
+lib32_libmsvcr120_app_a_SOURCES = $(src_msvcrt_common) lib32/msvcr120_app.def.in
+lib32_libmsvcr120_app_a_AR = $(DTDEF32) lib32/msvcr120_app.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr120_app_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib32_libmsvcr120_app_a_DEPENDENCIES=lib32/msvcr120_app.def
 
 lib32_LIBRARIES += lib32/libucrtbase.a
 lib32_libucrtbase_a_SOURCES = $(src_ucrtbase) lib-common/ucrtbase.def.in
@@ -941,9 +997,12 @@
 include lib64/Makefile.am
 
 if !W32API
-lib64_DATA += lib64/libmsvcp60.a lib64/libmsvcr90.a lib64/libmsvcr100.a lib64/libmsvcr90d.a \
-			  lib64/libmsvcr110.a lib64/libmsvcr120.a lib64/libmsvcr120d.a lib64/libcrtdll.a \
-			  lib64/libmsvcr120_app.a lib64/libmsvcp120_app.a
+lib64_DATA += lib64/libmsvcp60.a lib64/libmsvcp120_app.a
+
+lib64_LIBRARIES += lib64/libcrtdll.a
+lib64_libcrtdll_a_SOURCES = $(src_msvcrt_common)
+lib64_libcrtdll_a_AR = $(DTDEF64) $(top_srcdir)/lib64/crtdll.def && $(AR) $(ARFLAGS)
+lib64_libcrtdll_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
 
 lib64_LIBRARIES += lib64/libmsvcr80.a
 lib64_libmsvcr80_a_SOURCES = $(src_msvcr80_64) lib64/msvcr80.def.in
@@ -951,6 +1010,48 @@
 lib64_libmsvcr80_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
 EXTRA_lib64_libmsvcr80_a_DEPENDENCIES=lib64/msvcr80.def
 
+lib64_LIBRARIES += lib64/libmsvcr90.a
+lib64_libmsvcr90_a_SOURCES = $(src_msvcrt_common) lib64/msvcr90.def.in
+lib64_libmsvcr90_a_AR = $(DTDEF64) lib64/msvcr90.def && $(AR) $(ARFLAGS)
+lib64_libmsvcr90_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib64_libmsvcr90_a_DEPENDENCIES=lib64/msvcr90.def
+
+lib64_LIBRARIES += lib64/libmsvcr90d.a
+lib64_libmsvcr90d_a_SOURCES = $(src_msvcrt_common) lib64/msvcr90d.def.in
+lib64_libmsvcr90d_a_AR = $(DTDEF64) lib64/msvcr90d.def && $(AR) $(ARFLAGS)
+lib64_libmsvcr90d_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib64_libmsvcr90d_a_DEPENDENCIES=lib64/msvcr90d.def
+
+lib64_LIBRARIES += lib64/libmsvcr100.a
+lib64_libmsvcr100_a_SOURCES = $(src_msvcrt_common) lib64/msvcr100.def.in
+lib64_libmsvcr100_a_AR = $(DTDEF64) lib64/msvcr100.def && $(AR) $(ARFLAGS)
+lib64_libmsvcr100_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib64_libmsvcr100_a_DEPENDENCIES=lib64/msvcr100.def
+
+lib64_LIBRARIES += lib64/libmsvcr110.a
+lib64_libmsvcr110_a_SOURCES = $(src_msvcrt_common) lib64/msvcr110.def.in
+lib64_libmsvcr110_a_AR = $(DTDEF64) lib64/msvcr110.def && $(AR) $(ARFLAGS)
+lib64_libmsvcr110_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib64_libmsvcr110_a_DEPENDENCIES=lib64/msvcr110.def
+
+lib64_LIBRARIES += lib64/libmsvcr120.a
+lib64_libmsvcr120_a_SOURCES = $(src_msvcrt_common) lib64/msvcr120.def.in
+lib64_libmsvcr120_a_AR = $(DTDEF64) lib64/msvcr120.def && $(AR) $(ARFLAGS)
+lib64_libmsvcr120_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib64_libmsvcr120_a_DEPENDENCIES=lib64/msvcr120.def
+
+lib64_LIBRARIES += lib64/libmsvcr120d.a
+lib64_libmsvcr120d_a_SOURCES = $(src_msvcrt_common) lib64/msvcr120d.def.in
+lib64_libmsvcr120d_a_AR = $(DTDEF64) lib64/msvcr120d.def && $(AR) $(ARFLAGS)
+lib64_libmsvcr120d_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib64_libmsvcr120d_a_DEPENDENCIES=lib64/msvcr120d.def
+
+lib64_LIBRARIES += lib64/libmsvcr120_app.a
+lib64_libmsvcr120_app_a_SOURCES = $(src_msvcrt_common) lib64/msvcr120_app.def.in
+lib64_libmsvcr120_app_a_AR = $(DTDEF64) lib64/msvcr120_app.def && $(AR) $(ARFLAGS)
+lib64_libmsvcr120_app_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
+EXTRA_lib64_libmsvcr120_app_a_DEPENDENCIES=lib64/msvcr120_app.def
+
 lib64_LIBRARIES += lib64/libucrtbase.a
 lib64_libucrtbase_a_SOURCES = $(src_ucrtbase) lib-common/ucrtbase.def.in
 lib64_libucrtbase_a_AR = $(DTDEF64) lib64/ucrtbase.def && $(AR) $(ARFLAGS)
@@ -1248,7 +1349,12 @@
 include libarm32/Makefile.am
 
 if !W32API
-libarm32_DATA += libarm32/libmsvcp60.a libarm32/libmsvcr110.a
+libarm32_DATA += libarm32/libmsvcp60.a
+
+libarm32_LIBRARIES += libarm32/libmsvcr110.a
+libarm32_libmsvcr110_a_SOURCES = $(src_msvcrt_common)
+libarm32_libmsvcr110_a_AR = $(DTDEFARM32) $(top_srcdir)/libarm32/msvcr110.def && $(AR) $(ARFLAGS)
+libarm32_libmsvcr110_a_CPPFLAGS=$(CPPFLAGSARM32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes)
 
 libarm32_LIBRARIES += libarm32/libucrtbase.a
 libarm32_libucrtbase_a_SOURCES = $(src_ucrtbase) lib-common/ucrtbase.def.in
diff --git a/mingw-w64-crt/crt/ucrtbase_compat.c b/mingw-w64-crt/crt/ucrtbase_compat.c
index 359bba0..92e13bf 100644
--- a/mingw-w64-crt/crt/ucrtbase_compat.c
+++ b/mingw-w64-crt/crt/ucrtbase_compat.c
@@ -33,7 +33,6 @@
 #undef _amsg_exit
 #undef _get_output_format
 
-#undef __iob_func
 
 
 // Declarations of non-static functions implemented within this file (that aren't
@@ -50,7 +49,6 @@
 
 int fprintf(FILE* ptr, const char* fmt, ...);
 int vfprintf(FILE* ptr, const char* fmt, va_list ap);
-FILE *__cdecl __iob_func(void);
 int __cdecl fwprintf(FILE *ptr, const wchar_t *fmt, ...);
 int __cdecl _snwprintf(wchar_t * restrict _Dest, size_t _Count, const wchar_t * restrict _Format, ...);
 
@@ -177,40 +175,20 @@
     LeaveCriticalSection(&exit_lock);
 }
 
-// Dummy iob array for the cases in CRT startup objects and libmingwex that link
-// directly to legacy-msvcrt style stdio - this is only meant to support use with
-// stderr below.
-// Since this array is an array of concrete FILE structs (not FILE pointers),
-// we can't easily make this a proper alias for the real FILE objects within
-// ucrtbase.dll (we'd need to sync the FILE struct content back and forth
-// after each operation). Instead use this as a dummy, and check that FILE pointers
-// are equal to &local_iob[2], indicating stderr.
-static FILE local_iob[3];
-FILE (* __MINGW_IMP_SYMBOL(_iob))[] = &local_iob;
-
-FILE *__cdecl __iob_func(void)
-{
-  return local_iob;
-}
-
 // This is only supposed to handle the stray calls to
 // fprintf(stderr,) within libmingwex and the CRT startup
 // files.
 int __cdecl vfprintf(FILE *ptr, const char *fmt, va_list ap)
 {
-  if (ptr != &local_iob[2])
-    abort();
-  return real_vfprintf(stderr, fmt, ap);
+  return real_vfprintf(ptr, fmt, ap);
 }
 
 int __cdecl fprintf(FILE *ptr, const char *fmt, ...)
 {
   va_list ap;
   int ret;
-  if (ptr != &local_iob[2])
-    abort();
   va_start(ap, fmt);
-  ret = real_vfprintf(stderr, fmt, ap);
+  ret = real_vfprintf(ptr, fmt, ap);
   va_end(ap);
   return ret;
 }
@@ -220,10 +198,8 @@
 {
   va_list ap;
   int ret;
-  if (ptr != &local_iob[2])
-    abort();
   va_start(ap, fmt);
-  ret = vfwprintf(stderr, fmt, ap);
+  ret = vfwprintf(ptr, fmt, ap);
   va_end(ap);
   return ret;
 }
diff --git a/mingw-w64-crt/stdio/acrt_iob_func.c b/mingw-w64-crt/stdio/acrt_iob_func.c
new file mode 100644
index 0000000..e8eb077
--- /dev/null
+++ b/mingw-w64-crt/stdio/acrt_iob_func.c
@@ -0,0 +1,15 @@
+/**
+ * This file has no copyright assigned and is placed in the Public Domain.
+ * This file is part of the mingw-w64 runtime package.
+ * No warranty is given; refer to the file DISCLAIMER.PD within this package.
+ */
+
+#include <stdio.h>
+
+static FILE *__cdecl local__acrt_iob_func(unsigned index)
+{
+    return &(__iob_func()[index]);
+}
+
+typedef FILE *__cdecl (*_f__acrt_iob_func)(unsigned index);
+_f__acrt_iob_func __MINGW_IMP_SYMBOL(__acrt_iob_func) = local__acrt_iob_func;
diff --git a/mingw-w64-crt/stdio/mingw_lock.c b/mingw-w64-crt/stdio/mingw_lock.c
index aaa9223..ebc3c25 100644
--- a/mingw-w64-crt/stdio/mingw_lock.c
+++ b/mingw-w64-crt/stdio/mingw_lock.c
@@ -39,12 +39,12 @@
      * The way the FILE (pointed to by pf) is locked depends on whether
      * it is part of _iob[] or not
      */
-    if ( (pf >= (&__iob_func()[0])) && (pf <= (&__iob_func()[_IOB_ENTRIES-1])) )
+    if ( (pf >= __acrt_iob_func(0)) && (pf <= __acrt_iob_func(_IOB_ENTRIES-1)) )
     {
         /*
          * FILE lies in _iob[] so the lock lies in _locktable[].
          */
-        _lock( _STREAM_LOCKS + (int)(pf - (&__iob_func()[0])) );
+        _lock( _STREAM_LOCKS + (int)(pf - __acrt_iob_func(0)) );
         /* We set _IOLOCKED to indicate we locked the stream */
         pf->_flag |= _IOLOCKED;
     }
@@ -81,14 +81,14 @@
      * The way the FILE (pointed to by pf) is unlocked depends on whether
      * it is part of _iob[] or not
      */
-    if ( (pf >= (&__iob_func()[0])) && (pf <= (&__iob_func()[_IOB_ENTRIES-1])) )
+    if ( (pf >= __acrt_iob_func(0)) && (pf <= __acrt_iob_func(_IOB_ENTRIES-1)) )
     {
         /*
          * FILE lies in _iob[] so the lock lies in _locktable[].
          * We reset _IOLOCKED to indicate we unlock the stream.
          */
         pf->_flag &= ~_IOLOCKED;
-        _unlock( _STREAM_LOCKS + (int)(pf - (&__iob_func()[0])) );
+        _unlock( _STREAM_LOCKS + (int)(pf - __acrt_iob_func(0)) );
     }
     else
         /*
diff --git a/mingw-w64-headers/crt/stdio.h b/mingw-w64-headers/crt/stdio.h
index fcad9e2..96311e3 100644
--- a/mingw-w64-headers/crt/stdio.h
+++ b/mingw-w64-headers/crt/stdio.h
@@ -79,9 +79,7 @@
 
 #include <_mingw_off_t.h>
 
-#if __MSVCRT_VERSION__ >= 0x1400
 _CRTIMP FILE *__cdecl __acrt_iob_func(unsigned index);
-#else
 #ifndef _STDIO_DEFINED
 #ifdef _WIN64
   _CRTIMP FILE *__cdecl __iob_func(void);
@@ -97,7 +95,6 @@
 #endif
 #endif
 #endif
-#endif
 
 #ifndef _FPOS_T_DEFINED
 #define _FPOS_T_DEFINED
@@ -116,15 +113,9 @@
 #ifndef _STDSTREAM_DEFINED
 #define _STDSTREAM_DEFINED
 
-#if __MSVCRT_VERSION__ >= 0x1400
 #define stdin (__acrt_iob_func(0))
 #define stdout (__acrt_iob_func(1))
 #define stderr (__acrt_iob_func(2))
-#else
-#define stdin (&__iob_func()[0])
-#define stdout (&__iob_func()[1])
-#define stderr (&__iob_func()[2])
-#endif
 #endif
 
 #define _IOREAD 0x0001
diff --git a/mingw-w64-headers/crt/wchar.h b/mingw-w64-headers/crt/wchar.h
index a5bfbb8..77fc734 100644
--- a/mingw-w64-headers/crt/wchar.h
+++ b/mingw-w64-headers/crt/wchar.h
@@ -52,9 +52,7 @@
 #define _FILE_DEFINED
 #endif
 
-#if __MSVCRT_VERSION__ >= 0x1400
 _CRTIMP FILE *__cdecl __acrt_iob_func(unsigned index);
-#else
 #ifndef _STDIO_DEFINED
 #ifdef _WIN64
   _CRTIMP FILE *__cdecl __iob_func(void);
@@ -71,18 +69,11 @@
 
 #define _iob __iob_func()
 #endif
-#endif
 
 #ifndef _STDSTREAM_DEFINED
-#if __MSVCRT_VERSION__ >= 0x1400
 #define stdin (__acrt_iob_func(0))
 #define stdout (__acrt_iob_func(1))
 #define stderr (__acrt_iob_func(2))
-#else
-#define stdin (&__iob_func()[0])
-#define stdout (&__iob_func()[1])
-#define stderr (&__iob_func()[2])
-#endif
 #define _STDSTREAM_DEFINED
 #endif