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

Reply via email to