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

Reply via email to