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> --- Now with an __MINGW_IMP_SYMBOL and redefining __argv, as suggested by Jacek. --- 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..ab37c48 --- /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> + +char ***__cdecl __p___argv(void) +{ + return &__argv; +} + +typedef char *** (*_f__p___argv)(void); +_f__p___argv __MINGW_IMP_SYMBOL(__p___argv) = __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