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
[email protected]
https://lists.sourceforge.net/lists/listinfo/mingw-w64-public