Import library libcrtdll.a (for crtdll.dll runtime library) compiled during mingw-w64 build process is currently broken and cannot be used for linking executable applications.
Trying to do it results in following linker errors: /usr/bin/i686-w64-mingw32-ld: .../i686-w64-mingw32/lib/crt2.o: in function `pre_c_init': .../mingw-w64-crt/crt/crtexe.c:142: undefined reference to `__set_app_type' /usr/bin/i686-w64-mingw32-ld: .../mingw-w64-crt/crt/crtexe.c:146: undefined reference to `__p__fmode' /usr/bin/i686-w64-mingw32-ld: .../mingw-w64-crt/crt/crtexe.c:144: undefined reference to `__set_app_type' /usr/bin/i686-w64-mingw32-ld: .../i686-w64-mingw32/lib/crt2.o: in function `pre_cpp_init': .../mingw-w64-crt/crt/crtexe.c:173: undefined reference to `__getmainargs' /usr/bin/i686-w64-mingw32-ld: .../i686-w64-mingw32/lib/crt2.o: in function `_tmainCRTStartup': .../mingw-w64-crt/crt/crtexe.c:290: undefined reference to `_set_invalid_parameter_handler' /usr/bin/i686-w64-mingw32-ld: .../mingw-w64-crt/crt/crtexe.c:299: undefined reference to `__p__acmdln' /usr/bin/i686-w64-mingw32-ld: .../mingw-w64-crt/crt/crtexe.c:337: undefined reference to `_imp____initenv' /usr/bin/i686-w64-mingw32-ld: .../i686-w64-mingw32/lib/libmingw32.a(lib32_libmingw32_a-charmax.o): in function `my_lconv_init': .../mingw-w64-crt/crt/charmax.c:19: undefined reference to `_imp____lconv_init' /usr/bin/i686-w64-mingw32-ld: .../i686-w64-mingw32/lib/libmingw32.a(lib32_libmingw32_a-merr.o): in function `_mingw_setusermatherr': .../mingw-w64-crt/crt/merr.c:33: undefined reference to `__setusermatherr' /usr/bin/i686-w64-mingw32-ld: .../i686-w64-mingw32/lib/libmingwex.a(lib32_libmingwex_a-getopt.o): in function `vwarnx': .../mingw-w64-crt/misc/getopt.c:119: undefined reference to `__p___argv' Reason is that this crtdll.dll library has some symbols with _dll suffix as opposite of the msvcrt.dll library which has it without any suffix. mingw-w64 startup code expects that these symbols are without any suffix too. And some symbols are not present in crtdll.dll at all. Most required functions are already provided by mingw-w64 in misc/ subdirectory and they are already linked into msvcrt import library. But they are compiled into into crtdll import library yet. This patch fixes all these issues. Add required misc/ files into import library and adds a new helper file crtdll_compat.c with remaining missing functions for mingw-w64 startup and links it into libcrtdll.a import library. Missing symbols which exists with _dll suffix are defined in crtdll.def file as aliases. This allows to produce working 32-bit executable binaries by i686-w64-mingw32-gcc compiler and mingw-w64 toolchain which will use crtdll.dll runtime library. --- Changes in v2: * Define aliases in crtdll.def file instead in source code --- mingw-w64-crt/Makefile.am | 18 +++++++++++++++-- mingw-w64-crt/crt/crtdll_compat.c | 32 +++++++++++++++++++++++++++++++ mingw-w64-crt/lib32/crtdll.def | 20 +++++++++++++++++++ mingw-w64-crt/lib32/crtdll.mri | 1 + 4 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 mingw-w64-crt/crt/crtdll_compat.c diff --git a/mingw-w64-crt/Makefile.am b/mingw-w64-crt/Makefile.am index 07531c12ddc2..ee3321a546b6 100644 --- a/mingw-w64-crt/Makefile.am +++ b/mingw-w64-crt/Makefile.am @@ -415,6 +415,18 @@ src_msvcr80_64=\ misc/__p__fmode.c \ misc/__p__wcmdln.c +src_crtdll=\ + crt/crtdll_compat.c \ + misc/___mb_cur_max_func.c \ + misc/__p___argv.c \ + misc/__p__acmdln.c \ + misc/__p__commode.c \ + misc/__p__fmode.c \ + misc/__set_app_type.c \ + misc/invalid_parameter_handler.c \ + misc/lc_locale_func.c \ + stdio/mingw_lock.c + src_msvcr120_app=\ misc/__set_app_type.c \ misc/_getpid.c @@ -852,7 +864,7 @@ if !W32API lib32_DATA += lib32/libglut.a lib32/libmsvcp60.a lib32/libmsvcp120_app.a lib32_DATA += lib32/libcrtdll.a -lib32/libcrtdll.a: lib32/crtdll.mri lib32/libcrtdll_def.a lib32/libmsvcrt_common.a +lib32/libcrtdll.a: lib32/crtdll.mri lib32/libcrtdll_def.a lib32/libmsvcrt_common.a lib32/libcrtdll_extra.a cd $(dir $@) && $(AR) -M < $(abspath $<) lib32_DATA += lib32/libmsvcr80.a @@ -892,7 +904,9 @@ lib32/libucrtbase.a: lib-common/ucrtbase.mri lib32/libucrtbase_def.a lib32/libuc cd $(dir $@) && $(AR) -M < $(abspath $<) lib32_DATA += lib32/libucrt.a lib32/libucrtapp.a -noinst_LIBRARIES += lib32/libmsvcrt_common.a lib32/libmsvcrt_extra.a lib32/libmsvcr120_app_extra.a lib32/libucrt_extra.a lib32/libucrtapp_extra.a +noinst_LIBRARIES += lib32/libcrtdll_extra.a lib32/libmsvcrt_common.a lib32/libmsvcrt_extra.a lib32/libmsvcr120_app_extra.a lib32/libucrt_extra.a lib32/libucrtapp_extra.a +lib32_libcrtdll_extra_a_SOURCES = $(src_crtdll) +lib32_libcrtdll_extra_a_CPPFLAGS = $(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes) lib32_libmsvcrt_common_a_SOURCES = $(src_msvcrt_common) lib32_libmsvcrt_common_a_CPPFLAGS=$(CPPFLAGS32) -D__LIBMSVCRT__ $(extra_include) $(sysincludes) lib32_libmsvcrt_extra_a_SOURCES = $(src_msvcrt32) diff --git a/mingw-w64-crt/crt/crtdll_compat.c b/mingw-w64-crt/crt/crtdll_compat.c new file mode 100644 index 000000000000..9bb48bd84095 --- /dev/null +++ b/mingw-w64-crt/crt/crtdll_compat.c @@ -0,0 +1,32 @@ +/** + * 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 <internal.h> +#include <math.h> + +/* Define __initenv and __winitenv as crtdll.dll does not provide them */ +static char ** local__initenv; +static wchar_t ** local__winitenv; +char *** __MINGW_IMP_SYMBOL(__initenv) = &local__initenv; +wchar_t *** __MINGW_IMP_SYMBOL(__winitenv) = &local__winitenv; + +/* Define dummy __setusermatherr() function as crtdll.dll does not provide it */ +#undef __setusermatherr +void __setusermatherr(__UNUSED_PARAM(int (__cdecl *f)(struct _exception *))) { } + +/* Define dummy _lock() and _unlock() functions as crtdll.dll does not provide them */ +void __cdecl _lock(int locknum); +void __cdecl _unlock(int locknum); +void __cdecl _lock(__UNUSED_PARAM(int locknum)) { } +void __cdecl _unlock(__UNUSED_PARAM(int locknum)) { } + +/* Define __getmainargs() function via crtdll.dll __GetMainArgs() function */ +extern void __GetMainArgs(int *argc, char ***argv, char ***envp, int expand_wildcards); +int __cdecl __getmainargs(int *argc, char ***argv, char ***envp, int expand_wildcards, __UNUSED_PARAM(_startupinfo *startup_info)) +{ + __GetMainArgs(argc, argv, envp, expand_wildcards); + return 0; +} diff --git a/mingw-w64-crt/lib32/crtdll.def b/mingw-w64-crt/lib32/crtdll.def index 8eec5480a18c..fed70ffa6148 100644 --- a/mingw-w64-crt/lib32/crtdll.def +++ b/mingw-w64-crt/lib32/crtdll.def @@ -191,10 +191,13 @@ _CIsqrt _CItan _CItanh _HUGE_dll DATA +_HUGE DATA == _HUGE_dll _XcptFilter __GetMainArgs __argc_dll DATA +__argc DATA == __argc_dll __argv_dll DATA +__argv DATA == __argv_dll __dllonexit __doserrno __fpecode @@ -202,6 +205,7 @@ __isascii __iscsym __iscsymf __mb_cur_max_dll DATA +__mb_cur_max DATA == __mb_cur_max_dll __pxcptinfoptrs __threadhandle __threadid @@ -209,7 +213,9 @@ __toascii _abnormal_termination _access _acmdln_dll DATA +_acmdln DATA == _acmdln_dll _aexit_rtn_dll DATA +_aexit_rtn DATA == _aexit_rtn_dll _amsg_exit _assert _basemajor_dll DATA @@ -230,6 +236,7 @@ _clearfp _close _commit _commode_dll DATA +_commode DATA == _commode_dll _control87 _controlfp _copysign @@ -241,11 +248,13 @@ _cscanf _ctype _cwait _daylight_dll DATA +_daylight DATA == _daylight_dll _dup _dup2 _ecvt _endthread _environ_dll DATA +_environ DATA == _environ_dll _eof _errno _except_handler2 @@ -266,6 +275,7 @@ _fgetchar _fgetwchar _filbuf _fileinfo_dll DATA +_fileinfo DATA == _fileinfo_dll _filelength _fileno _findclose @@ -275,6 +285,7 @@ _finite _flsbuf _flushall _fmode_dll DATA +_fmode DATA == _fmode_dll _fpclass _fpieee_flt _fpreset DATA @@ -416,10 +427,13 @@ _osmajor_dll DATA _osminor_dll DATA _osmode_dll DATA _osver_dll DATA +_osver DATA == _osver_dll _osversion_dll DATA _pclose _pctype_dll DATA +_pctype DATA == _pctype_dll _pgmptr_dll DATA +_pgmptr DATA == _pgmptr_dll _pipe _popen _purecall @@ -427,6 +441,7 @@ _putch _putenv _putw _pwctype_dll DATA +_pwctype DATA == _pwctype_dll _read _rmdir _rmtmp @@ -476,9 +491,11 @@ _strupr _swab _sys_errlist DATA _sys_nerr_dll DATA +_sys_nerr DATA == _sys_nerr_dll _tell _tempnam _timezone_dll DATA +_timezone DATA == _timezone_dll _tolower _toupper _tzname DATA @@ -502,8 +519,11 @@ _wcsrev _wcsset _wcsupr _winmajor_dll DATA +_winmajor DATA == _winmajor_dll _winminor_dll DATA +_winminor DATA == _winminor_dll _winver_dll DATA +_winver DATA == _winver_dll _write _wtoi _wtol diff --git a/mingw-w64-crt/lib32/crtdll.mri b/mingw-w64-crt/lib32/crtdll.mri index 7ad3b777b041..8cf2ccf889e3 100644 --- a/mingw-w64-crt/lib32/crtdll.mri +++ b/mingw-w64-crt/lib32/crtdll.mri @@ -1,5 +1,6 @@ CREATE libcrtdll.a ADDLIB libcrtdll_def.a ADDLIB libmsvcrt_common.a +ADDLIB libcrtdll_extra.a SAVE END -- 2.20.1 _______________________________________________ Mingw-w64-public mailing list Mingw-w64-public@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/mingw-w64-public