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ö <mar...@martin.st>
---
 mingw-w64-crt/Makefile.am           | 121 +++++++++++++++++++++++++++++++++---
 mingw-w64-crt/crt/ucrtbase_compat.c |  30 +--------
 mingw-w64-crt/stdio/mingw_lock.c    |   8 +--
 mingw-w64-headers/crt/stdio.h       |   9 ---
 mingw-w64-headers/crt/wchar.h       |   9 ---
 5 files changed, 121 insertions(+), 56 deletions(-)

diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index 72e0fdd..ee82d78 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -153,7 +153,11 @@ src_libws2_32=libsrc/ws2_32.c \
   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 @@ src_msvcrtarm64=\
   misc/__p___argv.c
 
 src_msvcr80_64=\
+  $(src_msvcrt_common) \
   misc/__p___argv.c
 
 # These mingwex sources are target independent:
@@ -640,9 +645,60 @@ endif
 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 = $(DTDEF64) $(top_srcdir)/lib32/crtdll.def && $(AR) 
$(ARFLAGS)
+lib32_libcrtdll_a_CPPFLAGS=$(CPPFLAGS64) -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 = $(DTDEF64) lib32/msvcr80.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr80_a_CPPFLAGS=$(CPPFLAGS64) -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 = $(DTDEF64) lib32/msvcr90.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr90_a_CPPFLAGS=$(CPPFLAGS64) -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 = $(DTDEF64) lib32/msvcr90d.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr90d_a_CPPFLAGS=$(CPPFLAGS64) -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 = $(DTDEF64) lib32/msvcr100.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr100_a_CPPFLAGS=$(CPPFLAGS64) -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 = $(DTDEF64) lib32/msvcr110.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr110_a_CPPFLAGS=$(CPPFLAGS64) -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 = $(DTDEF64) lib32/msvcr120.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr120_a_CPPFLAGS=$(CPPFLAGS64) -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 = $(DTDEF64) lib32/msvcr120d.def && $(AR) $(ARFLAGS)
+lib32_libmsvcr120d_a_CPPFLAGS=$(CPPFLAGS64) -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 = $(DTDEF64) lib32/msvcr120_app.def && $(AR) 
$(ARFLAGS)
+lib32_libmsvcr120_app_a_CPPFLAGS=$(CPPFLAGS64) -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
@@ -951,9 +1007,12 @@ endif
 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
@@ -961,6 +1020,48 @@ lib64_libmsvcr80_a_AR = $(DTDEF64) lib64/msvcr80.def && 
$(AR) $(ARFLAGS)
 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)
@@ -1263,7 +1364,13 @@ endif
 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/msvcr110.def.in
+libarm32_libmsvcr110_a_AR = $(DTDEF64) libarm32/msvcr110.def && $(AR) 
$(ARFLAGS)
+libarm32_libmsvcr110_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) 
$(sysincludes)
+EXTRA_libarm32_libmsvcr110_a_DEPENDENCIES=libarm32/msvcr110.def
 
 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 b4d630b..749fc62 100644
--- a/mingw-w64-crt/crt/ucrtbase_compat.c
+++ b/mingw-w64-crt/crt/ucrtbase_compat.c
@@ -35,7 +35,6 @@
 #undef _amsg_exit
 #undef _get_output_format
 
-#undef __iob_func
 
 
 // Declarations of non-static functions implemented within this file (that 
aren't
@@ -52,7 +51,6 @@ _onexit_t __dllonexit(_onexit_t func, _PVFV** begin, _PVFV** 
end);
 
 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, ...);
 
@@ -189,40 +187,20 @@ void __cdecl _unlock(int _File)
     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;
 }
@@ -232,10 +210,8 @@ int __cdecl fwprintf(FILE *ptr, const wchar_t *fmt, ...)
 {
   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/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 @@ void __cdecl _lock_file( FILE *pf )
      * 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 @@ void __cdecl _unlock_file( FILE *pf )
      * 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 @@ extern "C" {
 
 #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 @@ extern FILE (* __MINGW_IMP_SYMBOL(_iob))[];   /* A pointer to 
an array of FILE */
 #endif
 #endif
 #endif
-#endif
 
 #ifndef _FPOS_T_DEFINED
 #define _FPOS_T_DEFINED
@@ -116,15 +113,9 @@ extern FILE (* __MINGW_IMP_SYMBOL(_iob))[];        /* A 
pointer to an array of FILE */
 #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 @@ extern "C" {
 #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 @@ extern FILE (* __MINGW_IMP_SYMBOL(_iob))[]; /* A pointer to 
an array of FILE */
 
 #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
 
-- 
2.7.4


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to