Global variable _sys_nerr is present in every CRT library except UCRT.
Function __sys_nerr() is present since msvcr80.dll and returns pointer to
the global variable _sys_nerr. This function is not present in any
msvcrt.dll library version, but is present in UCRT library.

Same applies for global array _sys_errlist[] and function __sys_errlist()
which returns pointer to the first member of __sys_errlist[] array.

For all pre-msvcr80 CRT import libraries provides mingw-w64 functions
__sys_errlist() and __sys_nerr(). And change stdlib.h header file to
define _sys_nerr and _sys_errlist via __sys_errlist() and __sys_nerr()
functions. With this change, definitions will be compatible for all CRT
versions (crtdll, msvcrt, msvcr80+, UCRT).
---
 mingw-w64-crt/Makefile.am          | 14 ++++++++++++++
 mingw-w64-crt/misc/__sys_errlist.c | 16 ++++++++++++++++
 mingw-w64-crt/misc/__sys_nerr.c    | 16 ++++++++++++++++
 mingw-w64-headers/crt/stdlib.h     | 10 ----------
 4 files changed, 46 insertions(+), 10 deletions(-)
 create mode 100644 mingw-w64-crt/misc/__sys_errlist.c
 create mode 100644 mingw-w64-crt/misc/__sys_nerr.c

diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am
index b83490a34d58..9b896a713e28 100644
--- a/mingw-w64-crt/Makefile.am
+++ b/mingw-w64-crt/Makefile.am
@@ -294,6 +294,8 @@ src_msvcrt_commonarm64=\
 
 # Files included in libmsvcrt-os.a (for msvcrt.dll) on all archs
 src_msvcrt=\
+  misc/__sys_errlist.c \
+  misc/__sys_nerr.c \
   misc/_configthreadlocale.c \
   misc/imaxdiv.c \
   misc/invalid_parameter_handler.c \
@@ -598,6 +600,8 @@ src_crtdll=\
   misc/__pctype_func.c \
   misc/__pwctype_func.c \
   misc/__set_app_type.c \
+  misc/__sys_errlist.c \
+  misc/__sys_nerr.c \
   misc/dummy__setusermatherr.c \
   misc/imaxabs.c \
   misc/imaxdiv.c \
@@ -628,6 +632,8 @@ src_msvcrt10=\
   misc/__pctype_func.c \
   misc/__pwctype_func.c \
   misc/__set_app_type.c \
+  misc/__sys_errlist.c \
+  misc/__sys_nerr.c \
   misc/dummy__setusermatherr.c \
   misc/imaxabs.c \
   misc/imaxdiv.c \
@@ -650,6 +656,8 @@ src_msvcrt20=\
   misc/__pctype_func.c \
   misc/__pwctype_func.c \
   misc/__set_app_type.c \
+  misc/__sys_errlist.c \
+  misc/__sys_nerr.c \
   misc/dummy__setusermatherr.c \
   misc/imaxabs.c \
   misc/imaxdiv.c \
@@ -668,6 +676,8 @@ src_msvcrt40=\
   misc/___mb_cur_max_func.c \
   misc/__pctype_func.c \
   misc/__pwctype_func.c \
+  misc/__sys_errlist.c \
+  misc/__sys_nerr.c \
   misc/imaxabs.c \
   misc/imaxdiv.c \
   misc/invalid_parameter_handler.c \
@@ -682,6 +692,8 @@ src_msvcrt40=\
   stdio/mingw_lock.c
 
 src_msvcr70=\
+  misc/__sys_errlist.c \
+  misc/__sys_nerr.c \
   misc/imaxabs.c \
   misc/imaxdiv.c \
   misc/invalid_parameter_handler.c \
@@ -689,6 +701,8 @@ src_msvcr70=\
   stdio/mingw_lock.c
 
 src_msvcr71=\
+  misc/__sys_errlist.c \
+  misc/__sys_nerr.c \
   misc/imaxabs.c \
   misc/imaxdiv.c \
   misc/invalid_parameter_handler.c \
diff --git a/mingw-w64-crt/misc/__sys_errlist.c 
b/mingw-w64-crt/misc/__sys_errlist.c
new file mode 100644
index 000000000000..2ee5412f6656
--- /dev/null
+++ b/mingw-w64-crt/misc/__sys_errlist.c
@@ -0,0 +1,16 @@
+/**
+ * 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 <_mingw.h>
+
+extern char** __MINGW_IMP_SYMBOL(_sys_errlist);
+
+char** __cdecl __sys_errlist(void);
+char** __cdecl __sys_errlist(void)
+{
+    return __MINGW_IMP_SYMBOL(_sys_errlist);
+}
+char** (__cdecl *__MINGW_IMP_SYMBOL(__sys_errlist))(void) = __sys_errlist;
diff --git a/mingw-w64-crt/misc/__sys_nerr.c b/mingw-w64-crt/misc/__sys_nerr.c
new file mode 100644
index 000000000000..87abe8d7b4ca
--- /dev/null
+++ b/mingw-w64-crt/misc/__sys_nerr.c
@@ -0,0 +1,16 @@
+/**
+ * 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 <_mingw.h>
+
+extern int* __MINGW_IMP_SYMBOL(_sys_nerr);
+
+int* __cdecl __sys_nerr(void);
+int* __cdecl __sys_nerr(void)
+{
+    return __MINGW_IMP_SYMBOL(_sys_nerr);
+}
+int* (__cdecl *__MINGW_IMP_SYMBOL(__sys_nerr))(void) = __sys_nerr;
diff --git a/mingw-w64-headers/crt/stdlib.h b/mingw-w64-headers/crt/stdlib.h
index b4e5e0ac7614..4b3d643c3b69 100644
--- a/mingw-w64-headers/crt/stdlib.h
+++ b/mingw-w64-headers/crt/stdlib.h
@@ -152,20 +152,10 @@ _CRTIMP int __cdecl ___mb_cur_max_func(void);
 #define _doserrno (*__doserrno())
   errno_t __cdecl _set_doserrno(unsigned long _Value);
   errno_t __cdecl _get_doserrno(unsigned long *_Value);
-#ifdef _MSVCRT_
-  extern char *_sys_errlist[];
-  extern int _sys_nerr;
-#else
-#ifdef _UCRT
   _CRTIMP char **__cdecl __sys_errlist(void);
   _CRTIMP int *__cdecl __sys_nerr(void);
 #define _sys_nerr (*__sys_nerr())
 #define _sys_errlist (__sys_errlist())
-#else
-  extern __declspec(dllimport) char *_sys_errlist[1];
-  extern __declspec(dllimport) int _sys_nerr;
-#endif /* !_UCRT */
-#endif
 
   /* We have a fallback definition of __p___argv and __p__fmode for
      msvcrt versions that lack it. */
-- 
2.20.1



_______________________________________________
Mingw-w64-public mailing list
Mingw-w64-public@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public

Reply via email to