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