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