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

Reply via email to