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