Perl / perl5

🐪 The Perl programming language
https://dev.perl.org/perl5/
Other
1.93k stars 549 forks source link

[PATCH] fix win32 with Ming.org GCC 3.4.5 build #16498

Closed p5pRT closed 6 years ago

p5pRT commented 6 years ago

Migrated from rt.perl.org#133084 (status was 'resolved')

Searchable as RT133084$

p5pRT commented 6 years ago

From @bulk88

Created by @bulk88

See attached patch. This is intended for 5.28. Maybe backport too. Although not addressed in https://rt-archive.perl.org/perl5/Ticket/Display.html?id=132860 some questions in the last month on the P5P ML over what CCs exactly work vs what the README says made me test very old GCCs.

Perl Info ``` --- Flags: category=core severity=low --- Site configuration information for perl 5.27.9: Configured by Administrator at Tue Jan 30 20:34:30 2018. Summary of my perl5 (revision 5 version 27 subversion 9) configuration: Platform: osname=MSWin32 osvers=5.2.3790 archname=MSWin32-x86-multi-thread uname='' config_args='undef' hint=recommended useposix=true d_sigaction=undef useithreads=define usemultiplicity=define use64bitint=undef use64bitall=undef uselongdouble=undef usemymalloc=n default_inc_excludes_dot=define bincompat5005=undef Compiler: cc='cl' ccflags ='-nologo -GF -W3 -O1 -MD -Zi -DNDEBUG -GL -DWIN32 -D_CONSOLE -DNO_STRICT -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DPERL_TEXTMODE_SCRIPTS -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DWIN32_NO_REGISTRY' optimize='-O1 -MD -Zi -DNDEBUG -GL' cppflags='-DWIN32' ccversion='15.00.30729.01' gccversion='' gccosandvers='' intsize=4 longsize=4 ptrsize=4 doublesize=8 byteorder=1234 doublekind=3 d_longlong=undef longlongsize=8 d_longdbl=define longdblsize=8 longdblkind=0 ivtype='long' ivsize=4 nvtype='double' nvsize=8 Off_t='__int64' lseeksize=8 alignbytes=8 prototype=define Linker and Libraries: ld='link' ldflags ='-nologo -nodefaultlib -debug -opt:ref,icf -ltcg -libpath:"c:\perl\lib\CORE" -machine:x86' libpth="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\lib" libs=oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib perllibs=oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib odbc32.lib odbccp32.lib comctl32.lib msvcrt.lib libc=msvcrt.lib so=dll useshrplib=true libperl=perl527.lib gnulibc_version='' Dynamic Linking: dlsrc=dl_win32.xs dlext=dll d_dlsymun=undef ccdlflags=' ' cccdlflags=' ' lddlflags='-dll -nologo -nodefaultlib -debug -opt:ref,icf -ltcg -libpath:"c:\perl\lib\CORE" -machine:x86' --- @INC for perl 5.27.9: lib C:/p527/srcnew/lib --- Environment for perl 5.27.9: CYGWIN=tty HOME (unset) LANG (unset) LANGUAGE (unset) LD_LIBRARY_PATH=/usr/lib/x86:/usr/X11R6/lib LOGDIR (unset) PATH=C:\WINDOWS\system32;C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\BIN;C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin;C:\Perl\bin;C:\WINDOWS;C:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\IDE;C:\Program Files (x86)\Git\bin;C:\sp3220\c\bin; PERL_BADLANG (unset) SHELL (unset) ```
p5pRT commented 6 years ago

From @bulk88

0001-fix-win32-with-Ming.org-GCC-3.4.5-build.patch ```diff From d29cee8acac409d714598b1e81c3494b22a16e30 Mon Sep 17 00:00:00 2001 From: Daniel Dragan Date: Fri, 6 Apr 2018 18:41:22 -0400 Subject: [PATCH] fix win32 with Ming.org GCC 3.4.5 build dlltool 2.20.51.20100123 from Strawberry 5.12 and dlltool 2.17.50 20060824 from Strawberry 5.8.9 were making a libperl527.a that caused perl.exe and all XS DLLs to import "perl527.exp.dll" while the disk file is called perl527.dll. This bug was eventually fixed, since in my testing dlltool 2.25 no date code, Copyright 2014 from Strawberry 5.22.1 doesn't have this problem. I suspect the bug was fixed in binutils commit 04276a0cf5 "2010-12-01 Kai Tietz " https://sourceware.org/bugzilla/show_bug.cgi?id=11065 in version "AM_INIT_AUTOMAKE(bfd, 2.21.51)" or 1 ver bump higher. Just always pass an explicit DLL name to dlltool instead of any kind of dlltool version checking at build time and then optional arg. The breakage for Mingw.org 3.4.5 was introduced in commit bf543eaf90d "add parallelness to win32/GNUmakefile" where I added parallelness by making the import lib .a file from just perldll.def, rather than the import lib being a build product coming out of g++ linking perl527.dll. The old serial build recipie passed --dllname to dlltool, my newer code didn't. Passing $(PERLDLL) to dlltool's -D causes this harmless but scary warning "dlltool: Path components stripped from dllname, '..\perl527.dll'." So create PERLDLLBASE to silence the warning. win32.h: In old GCCs, https://sourceforge.net/p/mingw/mailman/message/22184185/ a function marked declspec(dllimport) is not a constant. VC from day 1, and newer GCCs use the address of a 1 instruction jump stub function if a constant function pointer is needed to a function from a DLL that wont be known till runtime. This can be worked around in older GCCs by deoptimizing them to always use the jump stub for all references, and not the newer GCC and VC way where x86 call instructions directly read the import table in the caller, while constant functions ptrs in data or vars always refer to the jump stubs. Since these are old GCCs, performance isn't the highest priority and building at all is a more important goal. I suspect gcc 3.4.5 has been broken since 5.13.6 when the declspec(dllimport) code was added. --- win32/GNUmakefile | 3 ++- win32/makefile.mk | 3 ++- win32/win32.h | 43 +++++++++++++++++++++++++++++++------------ 3 files changed, 35 insertions(+), 14 deletions(-) diff --git a/win32/GNUmakefile b/win32/GNUmakefile index ac4632b..82bf593 100644 --- a/win32/GNUmakefile +++ b/win32/GNUmakefile @@ -963,6 +963,7 @@ PERLIMPLIBBASE ?= perl527$(a) PERLEXPLIB ?= $(COREDIR)\perl527.exp PERLSTATICLIB ?= ..\perl527s$(a) PERLDLL = ..\perl527.dll +PERLDLLBASE = perl527.dll # don't let "gmake -n all" try to run "miniperl.exe make_ext.pl" PLMAKE = gmake @@ -1478,7 +1479,7 @@ $(PERLEXPLIB) : $(PERLIMPLIB) $(PERLIMPLIB) : perldll.def ifeq ($(CCTYPE),GCC) - $(IMPLIB) -k -d perldll.def -l $(PERLIMPLIB) -e $(PERLEXPLIB) + $(IMPLIB) -k -d perldll.def -D $(PERLDLLBASE) -l $(PERLIMPLIB) -e $(PERLEXPLIB) else lib -def:perldll.def -machine:$(ARCHITECTURE) /OUT:$(PERLIMPLIB) endif diff --git a/win32/makefile.mk b/win32/makefile.mk index 57563c4..265e93b 100644 --- a/win32/makefile.mk +++ b/win32/makefile.mk @@ -937,6 +937,7 @@ PERLIMPLIB *= $(COREDIR)\perl527$(a) PERLEXPLIB *= $(COREDIR)\perl527.exp PERLSTATICLIB *= ..\perl527s$(a) PERLDLL = ..\perl527.dll +PERLDLLBASE = perl527.dll #EUMM on Win32 isn't ready for parallel make, so only allow this file to be parallel #$(MAKE) will contain the -P that this makefile was called with, which is bad for @@ -1427,7 +1428,7 @@ perldll.def : $(HAVEMINIPERL) $(CONFIGPM) ..\embed.fnc ..\makedef.pl $(PERLEXPLIB) $(PERLIMPLIB) .UPDATEALL : perldll.def .IF "$(CCTYPE)" == "GCC" - $(IMPLIB) -k -d perldll.def -l $(PERLIMPLIB) -e $(PERLEXPLIB) + $(IMPLIB) -k -d perldll.def -D $(PERLDLLBASE) -l $(PERLIMPLIB) -e $(PERLEXPLIB) .ELSE #VC family lib -def:perldll.def -machine:$(ARCHITECTURE) /OUT:$(PERLIMPLIB) .ENDIF diff --git a/win32/win32.h b/win32/win32.h index c3fbe9b..1f05a27 100644 --- a/win32/win32.h +++ b/win32/win32.h @@ -103,23 +103,42 @@ * The XS code in the re extension is special, in that it redefines * core APIs locally, so don't mark them as "dllimport" because GCC * cannot handle this situation. + * + * Certain old GCCs will not allow the function pointer of dllimport marked + * function to be "const". This was fixed later on. Since this is a + * deoptimization, target "gcc version 3.4.5 (mingw-vista special r3)" only, + * The GCC bug was fixed in GCC patch "varasm.c (initializer_constant_valid_p): + * Don't deny DECL_DLLIMPORT_P on functions", which probably was first released + * in GCC 4.3.0, this #if can be expanded upto but not including 4.3.0 if more + * deployed GCC are found that wont build with the follow error, initializer + * element is a PerlIO func exported from perl5xx.dll. + * + * encoding.xs:610: error: initializer element is not constant + * encoding.xs:610: error: (near initialization for `PerlIO_encode.Open') */ -#if !defined(PERLDLL) && !defined(PERL_EXT_RE_BUILD) -# ifdef __cplusplus -# define PERL_CALLCONV extern "C" __declspec(dllimport) -# ifdef _MSC_VER -# define PERL_CALLCONV_NO_RET extern "C" __declspec(dllimport) __declspec(noreturn) + +#if (defined(__GNUC__) && defined(__MINGW32__) && \ + !defined(__MINGW64_VERSION_MAJOR) && !defined(__clang__) && \ + ((__GNUC__ < 3) || ((__GNUC__ == 3) && (__GNUC_MINOR__ <= 5)))) +/* use default fallbacks from perl.h for this particular GCC */ +#else +# if !defined(PERLDLL) && !defined(PERL_EXT_RE_BUILD) +# ifdef __cplusplus +# define PERL_CALLCONV extern "C" __declspec(dllimport) +# ifdef _MSC_VER +# define PERL_CALLCONV_NO_RET extern "C" __declspec(dllimport) __declspec(noreturn) +# endif +# else +# define PERL_CALLCONV __declspec(dllimport) +# ifdef _MSC_VER +# define PERL_CALLCONV_NO_RET __declspec(dllimport) __declspec(noreturn) +# endif # endif -# else -# define PERL_CALLCONV __declspec(dllimport) +# else /* MSVC noreturn support inside the interp */ # ifdef _MSC_VER -# define PERL_CALLCONV_NO_RET __declspec(dllimport) __declspec(noreturn) +# define PERL_CALLCONV_NO_RET __declspec(noreturn) # endif # endif -#else /* MSVC noreturn support inside the interp */ -# ifdef _MSC_VER -# define PERL_CALLCONV_NO_RET __declspec(noreturn) -# endif #endif #ifdef _MSC_VER -- 2.5.0.windows.1 ```
p5pRT commented 6 years ago

From @steve-m-hay

On Sat\, 07 Apr 2018 15​:45​:42 -0700\, bulk88 wrote​:

This is a bug report for perl from bulk88@​hotmail.com\, generated with the help of perlbug 1.41 running under perl 5.27.9.

----------------------------------------------------------------- [Please describe your issue here]

See attached patch. This is intended for 5.28. Maybe backport too. Although not addressed in https://rt-archive.perl.org/perl5/Ticket/Display.html?id=132860 some questions in the last month on the P5P ML over what CCs exactly work vs what the README says made me test very old GCCs.

Thanks for the patch (and for spotting the breakage - I hadn't built with gcc 3.4.5 for quite a while).

I can confirm that without the patch blead currently doesn't build\, and with the patch all is well. But I have two test failures from that build. Do you see this too?

ext/XS-APItest/t/call_checker.t - fails one test ext/XS-APItest/t/win32.t - passes all tests but crashes on exit

C​:\Dev\Git\perl\t>.\perl harness -v ../ext/XS-APItest/t/call_checker.t ../ext/XS-APItest/t/call_checker.t .. 1..78 not ok 1# Failed (TODO) test at t/call_checker.t line 9.

# fail 67ac4520!=6478b0d8 at APItest.xs line 3210 at t/call_checker.t line 9. ok 2 ok 3 ok 4 ok 5 ok 6 ok 7 ok 8 ok 9 ok 10 ok 11 ok 12 ok 13 ok 14 ok 15 ok 16 ok 17 ok 18 ok 19 ok 20 ok 21 ok 22 ok 23 ok 24 ok 25# Looks like you failed 1 test of 78.

ok 26 ok 27 ok 28 ok 29 ok 30 ok 31 ok 32 ok 33 ok 34 ok 35 ok 36 ok 37 ok 38 ok 39 ok 40 ok 41 ok 42 ok 43 ok 44 ok 45 ok 46 ok 47 ok 48 ok 49 ok 50 ok 51 ok 52 ok 53 ok 54 ok 55 ok 56 ok 57 ok 58 ok 59 ok 60 ok 61 ok 62 ok 63 ok 64 ok 65 ok 66 ok 67 ok 68 ok 69 ok 70 ok 71 - undef clears call checkers ok 72 ok 73 ok 74 ok 75 ok 76 ok 77 ok 78 Dubious\, test returned 1 (wstat 256\, 0x100) Failed 1/78 subtests

Test Summary Report


../ext/XS-APItest/t/call_checker.t (Wstat​: 256 Tests​: 78 Failed​: 1)   Failed test​: 1   Non-zero exit status​: 1 Files=1\, Tests=78\, 0 wallclock secs ( 0.02 usr + 0.00 sys = 0.02 CPU) Result​: FAIL

C​:\Dev\Git\perl\t>.\perl harness -v ../ext/XS-APItest/t/win32.t ../ext/XS-APItest/t/win32.t .. ok 1 - check good drive A ok 2 - check a good drive (wide) ok 3 - check good drive B ok 4 - check a good drive (wide) ok 5 - check good drive C ok 6 - check a good drive (wide) ok 7 - check good drive D ok 8 - check a good drive (wide) ok 9 - check good drive E ok 10 - check a good drive (wide) ok 11 - check good drive F ok 12 - check a good drive (wide) ok 13 - check good drive G ok 14 - check a good drive (wide) ok 15 - check good drive H ok 16 - check a good drive (wide) ok 17 - check good drive I ok 18 - check a good drive (wide) ok 19 - check good drive J ok 20 - check a good drive (wide) ok 21 - check good drive K ok 22 - check a good drive (wide) ok 23 - check good drive L ok 24 - check a good drive (wide) ok 25 - check good drive M ok 26 - check a good drive (wide) ok 27 - check good drive N ok 28 - check a good drive (wide) ok 29 - check good drive O ok 30 - check a good drive (wide) ok 31 - check good drive P ok 32 - check a good drive (wide) ok 33 - check good drive Q ok 34 - check a good drive (wide) ok 35 - check good drive R ok 36 - check a good drive (wide) ok 37 - check good drive S ok 38 - check a good drive (wide) ok 39 - check good drive T ok 40 - check a good drive (wide) ok 41 - check good drive U ok 42 - check a good drive (wide) ok 43 - check good drive V ok 44 - check a good drive (wide) ok 45 - check good drive W ok 46 - check a good drive (wide) ok 47 - check good drive X ok 48 - check a good drive (wide) ok 49 - check good drive Y ok 50 - check a good drive (wide) ok 51 - check good drive Z ok 52 - check a good drive (wide) ok 53 - check good drive a ok 54 - check a good drive (wide) ok 55 - check good drive b ok 56 - check a good drive (wide) ok 57 - check good drive c ok 58 - check a good drive (wide) ok 59 - check good drive d ok 60 - check a good drive (wide) ok 61 - check good drive e ok 62 - check a good drive (wide) ok 63 - check good drive f ok 64 - check a good drive (wide) ok 65 - check good drive g ok 66 - check a good drive (wide) ok 67 - check good drive h ok 68 - check a good drive (wide) ok 69 - check good drive i ok 70 - check a good drive (wide) ok 71 - check good drive j ok 72 - check a good drive (wide) ok 73 - check good drive k ok 74 - check a good drive (wide) ok 75 - check good drive l ok 76 - check a good drive (wide) ok 77 - check good drive m ok 78 - check a good drive (wide) ok 79 - check good drive n ok 80 - check a good drive (wide) ok 81 - check good drive o ok 82 - check a good drive (wide) ok 83 - check good drive p ok 84 - check a good drive (wide) ok 85 - check good drive q ok 86 - check a good drive (wide) ok 87 - check good drive r ok 88 - check a good drive (wide) ok 89 - check good drive s ok 90 - check a good drive (wide) ok 91 - check good drive t ok 92 - check a good drive (wide) ok 93 - check good drive u ok 94 - check a good drive (wide) ok 95 - check good drive v ok 96 - check a good drive (wide) ok 97 - check good drive w ok 98 - check a good drive (wide) ok 99 - check good drive x ok 100 - check a good drive (wide) ok 101 - check good drive y ok 102 - check a good drive (wide) ok 103 - check good drive z ok 104 - check a good drive (wide) ok 105 - check bad drive @​​: ok 106 - check bad drive @​​: (wide) ok 107 - check bad drive [​: ok 108 - check bad drive [​: (wide) ok 109 - check bad drive !​: ok 110 - check bad drive !​: (wide) ok 111 - check bad drive ~​: ok 112 - check bad drive ~​: (wide) ok 113 - check bad drive `​: ok 114 - check bad drive `​: (wide) ok 115 - check bad drive {​: ok 116 - check bad drive {​: (wide) Dubious\, test returned 5 (wstat 1280\, 0x500) All 116 subtests passed

Test Summary Report


../ext/XS-APItest/t/win32.t (Wstat​: 1280 Tests​: 116 Failed​: 0)   Non-zero exit status​: 5   Parse errors​: No plan found in TAP output Files=1\, Tests=116\, 2 wallclock secs ( 0.02 usr + 0.00 sys = 0.02 CPU) Result​: FAIL

p5pRT commented 6 years ago

The RT System itself - Status changed from 'new' to 'open'

p5pRT commented 6 years ago

From @bulk88

On Wed\, 11 Apr 2018 05​:27​:39 -0700\, shay wrote​:

Thanks for the patch (and for spotting the breakage - I hadn't built with gcc 3.4.5 for quite a while).

I can confirm that without the patch blead currently doesn't build\, and with the patch all is well. But I have two test failures from that build. Do you see this too?

ext/XS-APItest/t/call_checker.t - fails one test ext/XS-APItest/t/win32.t - passes all tests but crashes on exit

C​:\Dev\Git\perl\t>.\perl harness -v ../ext/XS-APItest/t/call_checker.t ../ext/XS-APItest/t/call_checker.t .. 1..78 not ok 1# Failed (TODO) test at t/call_checker.t line 9.

# fail 67ac4520!=6478b0d8 at APItest.xs line 3210 at t/call_checker.t line 9.

Known problem\, https​://rt.perl.org/Ticket/Display.html?id=78502 https://perl5.git.perl.org/perl.git/commitdiff/ad6ab6c50 the declspec(dllimport) was added specifically 3 weeks after call_checker.t was commited. So the same symbol name func ptrs being != between libperl.dll and XS DLLs has always been there. I can imagine subtle bugs with XS libraries that patch function pointers in core and want to know if its the original p5p supplied func ptr in the var or a unk 3rd party func ptr or their own func ptr. You can't detect if its a p5p func ptr or not anymore. But I'd say for patch/hook chains\, dont devs save the old func ptr\, put in their own func ptr\, then call the old func ptr from the body of their new func\, not caring if the old func ptr is original to p5p or yet another hook?

On old Mingws\, either use declspec(dllimport) and get the same func ptrs\, but then you can't use those symbols in a const/static global data (a PerlIO vtable)\, or dont use declspec(dllimport) but now you can create const global data in a XS DLL with symbols from libperl.dll . I tried removing the "const" from the perlio vtable by commenting out #define PERLIO_FUNCS_CONST in perl.h\, still got the const initializer warning.


static PerlIO_funcs PerlIO_encode = {   sizeof(PerlIO_funcs)\,   "encoding"\,   sizeof(PerlIOEncode)\,   0x00000002|0x00010000\,   PerlIOEncode_pushed\,   PerlIOEncode_popped\,   PerlIOBuf_open\,   ((void *)0)\,   PerlIOEncode_getarg\,   PerlIOBase_fileno\,   PerlIOEncode_dup\,   PerlIOBuf_read\,   PerlIOBuf_unread\,   PerlIOEncode_write\,   PerlIOBuf_seek\,   PerlIOEncode_tell\,   PerlIOEncode_close\,   PerlIOEncode_flush\,   PerlIOEncode_fill\,   PerlIOBase_eof\,   PerlIOBase_error\,   PerlIOBase_clearerr\,   PerlIOBase_setlinebuf\,   PerlIOEncode_get_base\,   PerlIOBuf_bufsiz\,   PerlIOBuf_get_ptr\,   PerlIOBuf_get_cnt\,   PerlIOBuf_set_ptrcnt\, };


I also tried to move that var into the boot XSUB\, again const init error\, until I removed "static" which made it a C auto scoped to the boot XSUB and it stopped erroring.

Putting this in the boot XSUB also works.

  PerlIO_encode.fsize = sizeof(PerlIO_funcs);   PerlIO_encode.name = "encoding";   PerlIO_encode.size = sizeof(PerlIOEncode);   PerlIO_encode.kind = PERLIO_K_BUFFERED|PERLIO_K_DESTRUCT;   PerlIO_encode.Pushed = PerlIOEncode_pushed;   PerlIO_encode.Popped = PerlIOEncode_popped;   PerlIO_encode.Open = PerlIOBuf_open; etc

Commit https://perl5.git.perl.org/perl.git/commitdiff/ad6ab6c50 did break Mingw 3.4.5 like this


Running Makefile.PL in ext/Win32CORE C​:\perl521\srcnew\win32\..\miniperl.exe Makefile.PL INSTALLDIRS=perl INSTALLMAN1 DIR=none INSTALLMAN3DIR=none PERL_CORE=1 LINKTYPE=static Writing Makefile for Win32CORE Writing MYMETA.yml Making all in ext/Win32CORE b88dmake -S all PERL_CORE=1 LINKTYPE=static cp Win32CORE.pm ..\..\lib\Win32CORE.pm gcc -c -s -O2 -DWIN32 -DHAVE_DES_FCRYPT -DPERL_IMPLICIT_CONTEXT -DPERL_ IMPLICIT_SYS -fno-strict-aliasing -mms-bitfields -DPERL_MSVCRT_READFIX -DPERLDLL -UUSEIMPORTLIB -s -O2 -DVERSION=\"0.02\" -DXS_VERSION=\"0.02\" "-I..\..\ lib\CORE" Win32CORE.c C​:\perl521\srcnew\miniperl.exe "-I..\..\lib" "-I..\..\lib" -MExtUtils​::Command - e "rm_rf" -- ..\..\lib\auto\Win32CORE\Win32CORE.a ar -ru ..\..\lib\auto\Win32CORE\Win32CORE.a Win32CORE.o ar​: creating ..\..\lib\auto\Win32CORE\Win32CORE.a C​:\perl521\srcnew\miniperl.exe "-I..\..\lib" "-I..\..\lib" -MExtUtils​::Command - e "chmod" -- 755 ..\..\lib\auto\Win32CORE\Win32CORE.a ..\miniperl.exe -I..\lib list_static_libs.pl > Extensions_static g++ -mdll -o ..\perl513.dll -Wl\,--base-file -Wl\,perl.base -s -L"c​:\perl\lib\COR E" -L"C​:\MinGW\lib" \   C​:\WINDOWS\TEMP\mk7036_2030_4 ..\DynaLoader.o​:DynaLoader.c​:(.text+0x32)​: undefined reference to `_imp__Perl_vm ess' ..\DynaLoader.o​:DynaLoader.c​:(.text+0x60)​: undefined reference to `_imp__Perl_sv _setpvn' ..\DynaLoader.o​:DynaLoader.c​:(.text+0x89)​: undefined reference to `_imp__Perl_sv _2pv_flags' ..\DynaLoader.o​:DynaLoader.c​:(.text+0xa9)​: undefined reference to `_imp__Perl_sv _setpvn' ..\DynaLoader.o​:DynaLoader.c​:(.text+0x13c)​: undefined reference to `_imp__Perl_n ewSVpvn' ..\DynaLoader.o​:DynaLoader.c​:(.text+0x18c)​: undefined reference to `_imp__Perl_s v_2pv_flags' ..\DynaLoader.o​:DynaLoader.c​:(.text+0xaa3)​: undefined reference to `_imp__Perl_x s_apiversion_bootcheck' ..\DynaLoader.o​:DynaLoader.c​:(.text+0xacb)​: undefined reference to `_imp__Perl_x s_version_bootcheck' ..\DynaLoader.o​:DynaLoader.c​:(.text+0xaef)​: undefined reference to `_imp__Perl_n ewXS' ..\DynaLoader.o​:DynaLoader.c​:(.text+0xb13)​: undefined reference to `_imp__Perl_n ewXS' ..\DynaLoader.o​:DynaLoader.c​:(.text+0xb37)​: undefined reference to `_imp__Perl_n ewXS' ..\DynaLoader.o​:DynaLoader.c​:(.text+0xb5b)​: undefined reference to `_imp__Perl_n ewXS' ..\DynaLoader.o​:DynaLoader.c​:(.text+0xb7f)​: undefined reference to `_imp__Perl_n ewXS' ..\DynaLoader.o​:DynaLoader.c​:(.text+0xb9e)​: more undefined references to `_imp__ Perl_newXS' follow ..\DynaLoader.o​:DynaLoader.c​:(.text+0xbdd)​: undefined reference to `_imp__Perl_m y_cxt_init' ..\DynaLoader.o​:DynaLoader.c​:(.text+0xbf7)​: undefined reference to `_imp__Perl_n ewSVpvn' ..\DynaLoader.o​:DynaLoader.c​:(.text+0xc60)​: undefined reference to `_imp__Perl_c all_list' ..\lib\auto\Win32CORE\Win32CORE.a(Win32CORE.o)​:Win32CORE.c​:(.text+0xe)​: undefine d reference to `_imp__Perl_get_context' ..\lib\auto\Win32CORE\Win32CORE.a(Win32CORE.o)​:Win32CORE.c​:(.text+0x16)​: undefin ed reference to `_imp__Perl_get_context' ..\lib\auto\Win32CORE\Win32CORE.a(Win32CORE.o)​:Win32CORE.c​:(.text+0x27)​: undefin ed reference to `_imp__Perl_get_context' ..\lib\auto\Win32CORE\Win32CORE.a(Win32CORE.o)​:Win32CORE.c​:(.text+0x45)​: undefin ed reference to `_imp__Perl_get_context' ..\lib\auto\Win32CORE\Win32CORE.a(Win32CORE.o)​:Win32CORE.c​:(.text+0x58)​: undefin ..\lib\auto\Win32CORE\Win32CORE.a(Win32CORE.o)​:Win32CORE.c​:(.text+0x76a)​: undefi ned reference to `_imp__Perl_newXS' collect2​: ld returned 1 exit status b88dmake​: Error code 129\, while making '..\perl513.dll'

C​:\perl521\srcnew\win32>


This was fixed in https://perl5.git.perl.org/perl.git/50fd59617d035069f1af09e538c403b3e05768b3 and perl built sucessfully (other problems seem to exist at this point\, Carp.pm syntax errors).

I tried more bisecting but I ran into build bugs I fixed 2014-2015 so not much builds around that era for me.

Test Summary Report ------------------- ../ext/XS-APItest/t/win32.t (Wstat​: 1280 Tests​: 116 Failed​: 0) Non-zero exit status​: 5 Parse errors​: No plan found in TAP output Files=1\, Tests=116\, 2 wallclock secs ( 0.02 usr + 0.00 sys = 0.02 CPU) Result​: FAIL

If you comment out the last test in ../ext/XS-APItest/t/win32.t\, the Comctl32Version() test does it still crash? I disable the comctrl DLL with a private patch so I get\, note exit code "2"\, not your "5" which is a truncated 0xC0000005.

My run of the test


ok 95 - check good drive v ok 96 - check a good drive (wide) Comctl32Version​: comctl32.dll not in process??? at t/win32.t line 42. # Tests were run but no plan was declared and done_testing() was not seen. # Looks like your test exited with 2 just after 116. ok 97 - check good drive w ok 98 - check a good drive (wide) ok 99 - check good drive x ok 100 - check a good drive (wide) ok 101 - check good drive y ok 102 - check a good drive (wide) ok 103 - check good drive z ok 104 - check a good drive (wide) ok 105 - check bad drive @​​: ok 106 - check bad drive @​​: (wide) ok 107 - check bad drive [​: ok 108 - check bad drive [​: (wide) ok 109 - check bad drive !​: ok 110 - check bad drive !​: (wide) ok 111 - check bad drive ~​: ok 112 - check bad drive ~​: (wide) ok 113 - check bad drive `​: ok 114 - check bad drive `​: (wide) ok 115 - check bad drive {​: ok 116 - check bad drive {​: (wide) Dubious\, test returned 2 (wstat 512\, 0x200) All 116 subtests passed

Test Summary Report


../ext/XS-APItest/t/win32.t (Wstat​: 512 Tests​: 116 Failed​: 0)   Non-zero exit status​: 2   Parse errors​: No plan found in TAP output Files=1\, Tests=116\, 1 wallclock secs ( 0.02 usr + 0.00 sys = 0.02 CPU) Result​: FAIL


-- bulk88 ~ bulk88 at hotmail.com

p5pRT commented 6 years ago

From @steve-m-hay

On 11 April 2018 at 17​:38\, bulk88 via RT \perlbug\-followup@&#8203;perl\.org wrote​:

On Wed\, 11 Apr 2018 05​:27​:39 -0700\, shay wrote​:

Test Summary Report ------------------- ../ext/XS-APItest/t/win32.t (Wstat​: 1280 Tests​: 116 Failed​: 0) Non-zero exit status​: 5 Parse errors​: No plan found in TAP output Files=1\, Tests=116\, 2 wallclock secs ( 0.02 usr + 0.00 sys = 0.02 CPU) Result​: FAIL

If you comment out the last test in ../ext/XS-APItest/t/win32.t\, the Comctl32Version() test does it still crash? I disable the comctrl DLL with a private patch so I get\, note exit code "2"\, not your "5" which is a truncated 0xC0000005.

With the last test removed (specifically\, with the Comctl32Version() call removed) the crash goes away.

p5pRT commented 6 years ago

From @steve-m-hay

Thanks again - the patch is now applied in blead commit 1b30b4a8259a74c5ffaee362bc1d881c40fc5279.

(I tried some later MinGW gccs (4.4.0\, 4.5.0 and 4.8.1) and found the win32.h part was not necessary for them so I left the version check exactly as you had it.)

p5pRT commented 6 years ago

From [Unknown Contact. See original ticket]

Thanks again - the patch is now applied in blead commit 1b30b4a8259a74c5ffaee362bc1d881c40fc5279.

(I tried some later MinGW gccs (4.4.0\, 4.5.0 and 4.8.1) and found the win32.h part was not necessary for them so I left the version check exactly as you had it.)

p5pRT commented 6 years ago

@steve-m-hay - Status changed from 'open' to 'resolved'