Patch looks better now. Please go ahead. Thanks, Kai
2017-11-09 11:02 GMT+01:00 Martin Storsjö <mar...@martin.st>: > In msvcrt.dll, it only existed on i386. In the numbered msvcr* DLLs, > it was present in all of them except msvcr80.dll for x86_64. > > Define __argv to use __p___argv(). > > This makes sure that code in libmingwex (getopt.c) that references > __argv will work regardless of which msvcrt/ucrtbase it ends up > linked to. > > Signed-off-by: Martin Storsjö <mar...@martin.st> > --- > Updated the implementation of __p___argv to refer to > __MINGW_IMP_SYMBOL(__argv) instead of __argv, since the latter > now refers back to __p___argv and recurses infinitely. Made the > function static and with a different name, to avoid warnings about > inconsistent dllimport attributes. > --- > mingw-w64-crt/Makefile.am | 29 +++++++++++++++++++++++++---- > mingw-w64-crt/misc/__p___argv.c | 15 +++++++++++++++ > mingw-w64-headers/crt/stdlib.h | 6 ++++-- > 3 files changed, 44 insertions(+), 6 deletions(-) > create mode 100644 mingw-w64-crt/misc/__p___argv.c > > diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am > index 2ce1f83..3683521 100644 > --- a/mingw-w64-crt/Makefile.am > +++ b/mingw-w64-crt/Makefile.am > @@ -211,6 +211,21 @@ src_msvcrt32=\ > $(src_msvcrt) \ > misc/lc_locale_func.c > > +src_msvcrt64=\ > + $(src_msvcrt) \ > + misc/__p___argv.c > + > +src_msvcrtarm32=\ > + $(src_msvcrt) \ > + misc/__p___argv.c > + > +src_msvcrtarm64=\ > + $(src_msvcrt) \ > + misc/__p___argv.c > + > +src_msvcr80_64=\ > + misc/__p___argv.c > + > # These mingwex sources are target independent: > src_libmingwex=\ > crt/dllentry.c crt/dllmain.c \ > @@ -764,7 +779,7 @@ EXTRA_lib64_libkernel32_a_DEPENDENCIES=lib64/kernel32.def > > if !W32API > lib64_LIBRARIES += lib64/libmsvcrt.a > -lib64_libmsvcrt_a_SOURCES = $(src_msvcrt) lib-common/msvcrt.def.in > +lib64_libmsvcrt_a_SOURCES = $(src_msvcrt64) lib-common/msvcrt.def.in > lib64_libmsvcrt_a_AR = $(DTDEF64) lib64/msvcrt.def && $(AR) $(ARFLAGS) > lib64_libmsvcrt_a_CPPFLAGS=$(CPPFLAGS64) -D__LIBMSVCRT__ $(extra_include) > $(sysincludes) > EXTRA_lib64_libmsvcrt_a_DEPENDENCIES=lib64/msvcrt.def > @@ -926,10 +941,16 @@ endif > include lib64/Makefile.am > > if !W32API > -lib64_DATA += lib64/libmsvcp60.a lib64/libmsvcr80.a lib64/libmsvcr90.a > lib64/libmsvcr100.a lib64/libmsvcr90d.a \ > +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_LIBRARIES += lib64/libmsvcr80.a > +lib64_libmsvcr80_a_SOURCES = $(src_msvcr80_64) lib64/msvcr80.def.in > +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/libucrtbase.a > lib64_libucrtbase_a_SOURCES = $(src_ucrtbase) lib-common/ucrtbase.def.in > lib64_libucrtbase_a_AR = $(DTDEF64) lib64/ucrtbase.def && $(AR) $(ARFLAGS) > @@ -1081,7 +1102,7 @@ > EXTRA_libarm32_libkernel32_a_DEPENDENCIES=libarm32/kernel32.def > > if !W32API > libarm32_LIBRARIES += libarm32/libmsvcrt.a > -libarm32_libmsvcrt_a_SOURCES = $(src_msvcrt) lib-common/msvcrt.def.in > +libarm32_libmsvcrt_a_SOURCES = $(src_msvcrtarm32) lib-common/msvcrt.def.in > libarm32_libmsvcrt_a_AR = $(DTDEFARM32) libarm32/msvcrt.def && $(AR) > $(ARFLAGS) > libarm32_libmsvcrt_a_CPPFLAGS=$(CPPFLAGSARM32) -D__LIBMSVCRT__ > $(extra_include) $(sysincludes) > EXTRA_libarm32_libmsvcrt_a_DEPENDENCIES=libarm32/msvcrt.def > @@ -1334,7 +1355,7 @@ > EXTRA_libarm64_libkernel32_a_DEPENDENCIES=libarm64/kernel32.def > > if !W32API > libarm64_LIBRARIES += libarm64/libmsvcrt.a > -libarm64_libmsvcrt_a_SOURCES = $(src_msvcrt) lib-common/msvcrt.def.in > +libarm64_libmsvcrt_a_SOURCES = $(src_msvcrtarm64) lib-common/msvcrt.def.in > libarm64_libmsvcrt_a_AR = $(DTDEFARM64) libarm64/msvcrt.def && $(AR) > $(ARFLAGS) > libarm64_libmsvcrt_a_CPPFLAGS=$(CPPFLAGSARM64) -D__LIBMSVCRT__ > $(extra_include) $(sysincludes) > EXTRA_libarm64_libmsvcrt_a_DEPENDENCIES=libarm64/msvcrt.def > diff --git a/mingw-w64-crt/misc/__p___argv.c b/mingw-w64-crt/misc/__p___argv.c > new file mode 100644 > index 0000000..06b348a > --- /dev/null > +++ b/mingw-w64-crt/misc/__p___argv.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 <stdlib.h> > + > +static char ***__cdecl local__p___argv(void) > +{ > + return __MINGW_IMP_SYMBOL(__argv); > +} > + > +typedef char ***__cdecl (*_f__p___argv)(void); > +_f__p___argv __MINGW_IMP_SYMBOL(__p___argv) = local__p___argv; > diff --git a/mingw-w64-headers/crt/stdlib.h b/mingw-w64-headers/crt/stdlib.h > index e46ea8c..6ccf1a8 100644 > --- a/mingw-w64-headers/crt/stdlib.h > +++ b/mingw-w64-headers/crt/stdlib.h > @@ -172,9 +172,11 @@ _CRTIMP int __cdecl ___mb_cur_max_func(void); > #endif /* __MSVCRT_VERSION__ < 0x1400 */ > #endif > > + // We have a fallback definition of __p___argv for msvcrt versions that > + // lack it. > + _CRTIMP char ***__cdecl __p___argv(void); > #if (defined(_X86_) && !defined(__x86_64)) || (__MSVCRT_VERSION__ >= 0x1400) > _CRTIMP int *__cdecl __p___argc(void); > - _CRTIMP char ***__cdecl __p___argv(void); > _CRTIMP wchar_t ***__cdecl __p___wargv(void); > _CRTIMP char ***__cdecl __p__environ(void); > _CRTIMP wchar_t ***__cdecl __p__wenviron(void); > @@ -281,7 +283,7 @@ _CRTIMP int __cdecl ___mb_cur_max_func(void); > #endif > #ifndef __argv > extern char *** __MINGW_IMP_SYMBOL(__argv); > -#define __argv (* __MINGW_IMP_SYMBOL(__argv)) > +#define __argv (* __p___argv()) > #endif > #ifndef __wargv > extern wchar_t *** __MINGW_IMP_SYMBOL(__wargv); > -- > 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 ------------------------------------------------------------------------------ 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