https://bugs.winehq.org/show_bug.cgi?id=47226
Bug ID: 47226 Summary: Incorrect crash information displayed for unimplemented function stubs when 64-bit Wine builtins are cross-compiled in PE format (Mingw-w64, MS x64 calling convention) Product: Wine Version: 4.8 Hardware: x86-64 OS: Linux Status: NEW Severity: normal Priority: P2 Component: build-env Assignee: wine-bugs@winehq.org Reporter: focht@gmx.net Distribution: ---
Hello folks,
as it says. Example from bug 47220 which is dupe of bug 43546
https://web.archive.org/web/20190518075044/https://www.easyhdr.com/download/...
With Wine builtins cross-compiled in PE-format:
--- snip --- $ pwd /home/focht/.wine/drive_c/Program Files/easyHDR 3 Demo
$ wine ./easyHDR3.exe ...
wine: Call from 0x7b452f3c to unimplemented function (null).932, aborting wine: Call from 0x7b452f3c to unimplemented function (null).932, aborting wine: Call from 0x7b452f3c to unimplemented function (null).932, aborting wine: Call from 0x7b452f3c to unimplemented function (null).932, aborting wine: Call from 0x7b452f3c to unimplemented function (null).932, aborting wine: Call from 0x7b452f3c to unimplemented function (null).932, aborting wine: Call from 0x7b452f3c to unimplemented function (null).932, aborting wine: Call from 0x7b452f3c to unimplemented function (null).932, aborting wine: Unimplemented function (null).932 called at address 0x7b452f3c (thread 006d), starting debugger... Unhandled exception: unimplemented function .932 called in 64-bit code (0x000000007b452f3c). ... Register dump: rip:000000007b452f3c rsp:000000001bf8faa0 rbp:000000001bf8fb70 eflags:00000206 ( - -- I - -P- ) rax:000000001bf8fac0 rbx:0000000080000100 rcx:000000001bf8fac0 rdx:000000001bf8fae0 rsi:000000001bf8fbb0 rdi:000000001bf8faf0 r8:0000000000000002 r9:000000001bf8fba0 r10:0000000000000000 r11:000000001bf8fc98 r12:000000001ba7f874 r13:0000000017ef5680 r14:0000000000000002 r15:0000000000000002 Stack dump: ... Backtrace: =>0 0x000000007b452f3c RaiseException+0x6c(code=<is not available>, flags=<is not available>, nbargs=<is not available>, args=<is not available>) [/home/focht/projects/wine/mainline-src/dlls/kernel32/except.c:86] in kernel32 (0x000000001bf8fb70) 0x000000007b452f3c RaiseException+0x6c [/home/focht/projects/wine/mainline-src/dlls/kernel32/except.c:86] in kernel32: leaq 0xfffffffffffffff0(%rbp),%rsp 86 } Modules: Module Address Debug info Name (160 modules) PE 130000- 13d000 Deferred ilmthread-2_2 PE 250000- 29b000 Deferred qt5winextras PE 2a0000- 6f7000 Deferred qt5gui PE 700000- 8f3000 Deferred libglesv2 PE 900000- e51000 Deferred qt5widgets PE e60000- e7e000 Deferred zlibwapi PE e80000- ef6000 Deferred lcms2 PE f00000- 11c2000 Deferred ilmimf-2_2 PE 11d0000- 1219000 Deferred half PE 1220000- 1236000 Deferred iex-2_2 PE 1240000- 1258000 Deferred imath-2_2 PE 1260000- 1389000 Deferred libraw PE 15f0000- 1721000 Deferred qwindows PE 1840000- 184d000 Deferred qico PE 1850000- 1890000 Deferred qjpeg PE 1890000- 18ec000 Deferred qtiff PE 61000000- 61034000 Deferred qt5xml PE 64000000- 640d3000 Deferred qt5network PE 65100000- 651a7000 Deferred msvcp110 PE 66500000- 66523000 Deferred vcomp110 PE 67000000- 67551000 Deferred qt5core ELF 7a800000- 7aa10000 Deferred opengl32<elf> -PE 7a850000- 7aa10000 \ opengl32 ELF 7b400000- 7b85b000 Dwarf kernel32<elf> -PE 7b420000- 7b85b000 \ kernel32 ELF 7bc00000- 7bd54000 Deferred ntdll<elf> -PE 7bc20000- 7bd54000 \ ntdll ELF 7c000000- 7c004000 Deferred <wine-loader> PE 140000000- 1403ee000 Deferred easyhdr3 PE 180000000- 18004a000 Deferred openjp2 ... ELF 7f86d5ec7000- 7f86d5ef3000 Deferred version<elf> -PE 7f86d5ed0000- 7f86d5ef3000 \ version ELF 7f86d5ef3000- 7f86d6298000 Dwarf libwine.so.1 ELF 7f86d629a000- 7f86d64c3000 Deferred ld-linux-x86-64.so.2 ELF 7ffc37f2a000- 7ffc37f2b000 Deferred [vdso].so Threads: process tid prio (all id:s are in hex) ... 00000058 (D) C:\Program Files\easyHDR 3 Demo\easyHDR3.exe ... 00000070 0 <== ... --- snip ---
--- snip --- PE 66500000- 66523000 Deferred vcomp110 --- snip ---
Same thing without builtins cross-compiled to PE:
--- snip --- $ pwd /home/focht/.wine/drive_c/Program Files/easyHDR 3 Demo
$ wine ./easyHDR3.exe ... wine: Call from 0x7b452d3c to unimplemented function vcomp110.dll._vcomp_for_static_simple_init_i8, aborting wine: Call from 0x7b452d3c to unimplemented function vcomp110.dll._vcomp_for_static_simple_init_i8, aborting wine: Call from 0x7b452d3c to unimplemented function vcomp110.dll._vcomp_for_static_simple_init_i8, aborting wine: Unimplemented function vcomp110.dll._vcomp_for_static_simple_init_i8 called at address 0x7b452d3c (thread 0076), starting debugger... wine: Call from 0x7b452d3c to unimplemented function vcomp110.dll._vcomp_for_static_simple_init_i8, aborting wine: Call from 0x7b452d3c to unimplemented function vcomp110.dll._vcomp_for_static_simple_init_i8, aborting wine: Call from 0x7b452d3c to unimplemented function vcomp110.dll._vcomp_for_static_simple_init_i8, aborting wine: Call from 0x7b452d3c to unimplemented function vcomp110.dll._vcomp_for_static_simple_init_i8, aborting wine: Call from 0x7b452d3c to unimplemented function vcomp110.dll._vcomp_for_static_simple_init_i8, aborting Unhandled exception: unimplemented function vcomp110.dll._vcomp_for_static_simple_init_i8 called in 64-bit code (0x000000007b452d3c). Register dump: rip:000000007b452d3c rsp:000000002136faa0 rbp:000000002136fb70 eflags:00000206 ( - -- I - -P- ) rax:000000002136fac0 rbx:0000000080000100 rcx:000000002136fac0 rdx:000000002136fae0 rsi:000000002136fbb0 rdi:000000002136faf0 r8:0000000000000002 r9:000000002136fba0 r10:0000000000000000 r11:000000002136fc98 r12:0000000020a1f874 r13:000000001cdf9630 r14:0000000000000002 r15:0000000000000002 Stack dump: ... Backtrace: =>0 0x000000007b452d3c RaiseException+0x6c(code=<is not available>, flags=<is not available>, nbargs=<is not available>, args=<is not available>) [/home/focht/projects/wine/mainline-src/dlls/kernel32/except.c:86] in kernel32 (0x000000002136fb70) 1 0x00007f1600587499 __wine_spec_unimplemented_stub+0x38(module=<is not available>, function=<is not available>) [/home/focht/projects/wine/mainline-src/dlls/winecrt0/stub.c:34] in vcomp110 (0x000000002136fba0) 2 0x00007f16005871e7 __wine_stub__vcomp_for_static_simple_init_i8+0x16() in vcomp110 (0x000000002136fcf0) 3 0x0000000140181145 in easyhdr3 (+0x181144) (0x000000002136fcf0) 4 0x00007f15f09b7b34 _vcomp_fork_call_wrapper+0x43() in vcomp (0x000000002136fcf0) 5 0x00007f15f09b861d _vcomp_fork_worker+0xcc(param=0x1cdf9600) [/home/focht/projects/wine/mainline-src/dlls/vcomp/main.c:1422] in vcomp (0x000000002136fdf0) 6 0x000000007bca7018 call_thread_func+0xe7(entry=0x7f15f09b8550, arg=0x1cdf9600) [/home/focht/projects/wine/mainline-src/dlls/ntdll/signal_x86_64.c:4454] in ntdll (0x000000002136ffd0) 0x000000007b452d3c RaiseException+0x6c [/home/focht/projects/wine/mainline-src/dlls/kernel32/except.c:86] in kernel32: leaq 0xfffffffffffffff0(%rbp),%rsp 86 } Modules: Module Address Debug info Name (160 modules) PE 240000- 28b000 Deferred qt5winextras PE 290000- 6e7000 Deferred qt5gui PE 6f0000- 8e3000 Deferred libglesv2 PE 8f0000- 90e000 Deferred zlibwapi PE 910000- 986000 Deferred lcms2 PE 990000- c52000 Deferred ilmimf-2_2 PE c60000- ca9000 Deferred half PE cb0000- cc6000 Deferred iex-2_2 PE cd0000- ce8000 Deferred imath-2_2 PE cf0000- cfd000 Deferred ilmthread-2_2 PE d00000- e29000 Deferred libraw PE f80000- 10b1000 Deferred qwindows PE 11d0000- 11dd000 Deferred qico PE 11e0000- 1220000 Deferred qjpeg PE 1220000- 127c000 Deferred qtiff PE 61000000- 61034000 Deferred qt5xml PE 64000000- 640d3000 Deferred qt5network PE 65000000- 65551000 Deferred qt5widgets PE 67000000- 67551000 Deferred qt5core ELF 7a800000- 7aa10000 Deferred opengl32<elf> -PE 7a850000- 7aa10000 \ opengl32 ELF 7b400000- 7b85b000 Dwarf kernel32<elf> -PE 7b420000- 7b85b000 \ kernel32 ELF 7bc00000- 7bd51000 Dwarf ntdll<elf> -PE 7bc20000- 7bd51000 \ ntdll ELF 7c000000- 7c004000 Deferred <wine-loader> PE 140000000- 1403ee000 Export easyhdr3 PE 180000000- 18004a000 Deferred openjp2 ... ELF 7f15f21e1000- 7f15f2305000 Deferred msvcr110<elf> -PE 7f15f2200000- 7f15f2305000 \ msvcr110 ... ELF 7f1600575000- 7f160058b000 Dwarf vcomp110<elf> -PE 7f1600580000- 7f160058b000 \ vcomp110 ELF 7f160058b000- 7f16005b7000 Deferred version<elf> -PE 7f1600590000- 7f16005b7000 \ version ELF 7f16005b7000- 7f160095c000 Dwarf libwine.so.1 ELF 7f160095e000- 7f1600b87000 Deferred ld-linux-x86-64.so.2 ELF 7ffcb794a000- 7ffcb794b000 Deferred [vdso].so Threads: process tid prio (all id:s are in hex) ... 0000005c (D) C:\Program Files\easyHDR 3 Demo\easyHDR3.exe 0000007d 0 <== ... Host version: 5.0.13-100.fc28.x86_64 --- snip ---
--- snip --- ELF 7f1600575000- 7f160058b000 Dwarf vcomp110<elf> -PE 7f1600580000- 7f160058b000 \ vcomp110 --- snip ---
Generated code for '__wine_stub__vcomp_for_static_simple_init_i8':
--- snip --- 00000000665014C0 sub rsp, 8 00000000665014C4 lea rdi, module ; "vcomp110.dll" 00000000665014CB lea rsi, a_vcomp_for_s_0 ; "_vcomp_for_static_simple_init_i8" 00000000665014D2 call __wine_spec_unimplemented_stub 00000000665014D7 nop --- snip ---
Wine source for reference:
https://source.winehq.org/git/wine.git/blob/HEAD:/tools/winebuild/import.c#l...
--- snip --- 1184 /******************************************************************* 1185 * output_stubs 1186 * 1187 * Output the functions for stub entry points 1188 */ 1189 void output_stubs( DLLSPEC *spec ) 1190 { 1191 const char *name, *exp_name; 1192 int i; 1193 1194 if (!has_stubs( spec )) return; 1195 1196 output( "\n/* stub functions */\n\n" ); 1197 output( "\t.text\n" ); 1198 1199 for (i = 0; i < spec->nb_entry_points; i++) 1200 { 1201 ORDDEF *odp = &spec->entry_points[i]; 1202 if (odp->type != TYPE_STUB) continue; 1203 1204 name = get_stub_name( odp, spec ); 1205 exp_name = odp->name ? odp->name : odp->export_name; 1206 output( "\t.align %d\n", get_alignment(4) ); 1207 output( "\t%s\n", func_declaration(name) ); 1208 output( "%s:\n", asm_name(name) ); 1209 output_cfi( ".cfi_startproc" ); 1210 1211 switch (target_cpu) 1212 { ... 1252 case CPU_x86_64: 1253 output( "\tsubq $8,%%rsp\n" ); 1254 output_cfi( ".cfi_adjust_cfa_offset 8" ); 1255 output( "\tleaq .L__wine_spec_file_name(%%rip),%%rdi\n" ); 1256 if (exp_name) 1257 output( "leaq .L%s_string(%%rip),%%rsi\n", name ); 1258 else 1259 output( "\tmovq $%d,%%rsi\n", odp->ordinal ); 1260 output( "\tcall %s\n", asm_name("__wine_spec_unimplemented_stub") ); 1261 break; ... --- snip ---
Generated code for '__wine_spec_unimplemented_stub' (cross-compiled with MinGW):
--- snip --- 0000000066501580 args = qword ptr -28h 0000000066501580 0000000066501580 module = rcx ; const char * 0000000066501580 function = rdx ; const char * 0000000066501580 push rsi 0000000066501581 push rbx 0000000066501582 sub rsp, 38h 0000000066501586 mov ebx, 80000100h 000000006650158B lea rsi, [rsp+48h+args] ; dwExceptionFlags 0000000066501590 mov [rsp+48h+args], module 0000000066501595 mov [rsp+48h+args+8], function 000000006650159A nop word ptr [rax+rax+00h] 00000000665015A0 mov r9, rsi 00000000665015A3 mov r8d, 2 00000000665015A9 mov edx, 1 ; nNumberOfArguments 00000000665015AE mov ecx, ebx ; lpArguments 00000000665015B0 call RaiseException 00000000665015B5 jmp short loc_665015A0 --- snip ---
Wine source for reference:
https://source.winehq.org/git/wine.git/blob/HEAD:/dlls/winecrt0/stub.c#l26
--- snip --- 26 void DECLSPEC_HIDDEN __wine_spec_unimplemented_stub( const char *module, const char *function ) 27 { 28 ULONG_PTR args[2]; 29 30 args[0] = (ULONG_PTR)module; 31 args[1] = (ULONG_PTR)function; 32 for (;;) RaiseException( EXCEPTION_WINE_STUB, EXCEPTION_NONCONTINUABLE, 2, args ); 33 } --- snip ---
MinGW assumes the caller passed the two arguments via RCX and RDX (MS x64 ABI).
Although unnecessary, debugger session for completeness:
--- snip --- Wine-gdb> bt
#0 0x0000000066501580 in ?? () ; __wine_spec_unimplemented_stub #1 0x00000000665014d7 in ?? () ; __wine_stub__vcomp_for_static_simple_init_i8 #2 0x0000000000000000 in ?? ()
Wine-gdb> x/10i $pc
=> 0x66501580: push %rsi 0x66501581: push %rbx 0x66501582: sub $0x38,%rsp 0x66501586: mov $0x80000100,%ebx 0x6650158b: lea 0x20(%rsp),%rsi 0x66501590: mov %rcx,0x20(%rsp) ; args[0] 0x66501595: mov %rdx,0x28(%rsp) ; args[1] 0x6650159a: nopw 0x0(%rax,%rax,1) 0x665015a0: mov %rsi,%r9 0x665015a3: mov $0x2,%r8d
Wine-gdb> info reg rax 0x2108f560 554235232 rbx 0x2108f898 554236056 rcx 0x0 0 rdx 0x3a4 932 rsi 0x665040a4 1716535460 rdi 0x66504000 1716535296 rbp 0x2108f620 0x2108f620 rsp 0x2108f4f8 0x2108f4f8 r8 0x2 2 r9 0x1 1 r10 0x0 0 r11 0x2108f5c8 554235336 r12 0x2108f874 554236020 r13 0x1100c0 1114304 r14 0x2 2 r15 0x2 2 rip 0x66501580 0x66501580 eflags 0x206 [ PF IF ] cs 0x33 51 ss 0x2b 43 ds 0x0 0 es 0x0 0 fs 0x0 0 gs 0x0 0 --- snip ---
Mingw-w64 specs:
--- snip --- $ (mingw64-env && $CC -v)
Using built-in specs. COLLECT_GCC=/usr/bin/x86_64-w64-mingw32-gcc COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-w64-mingw32/7.3.0/lto-wrapper Target: x86_64-w64-mingw32 Configured with: ../configure --prefix=/usr --bindir=/usr/bin --includedir=/usr/include --mandir=/usr/share/man --infodir=/usr/share/info --datadir=/usr/share --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --with-gnu-as --with-gnu-ld --verbose --without-newlib --disable-multilib --disable-plugin --with-system-zlib --disable-nls --without-included-gettext --disable-win32-registry --enable-languages=c,c++,objc,obj-c++,fortran --with-bugurl=http://bugzilla.redhat.com/bugzilla --with-cloog --enable-threads=posix --enable-libgomp --target=x86_64-w64-mingw32 --with-sysroot=/usr/x86_64-w64-mingw32/sys-root --with-gxx-include-dir=/usr/x86_64-w64-mingw32/sys-root/mingw/include/c++ Thread model: posix gcc version 7.3.0 20180125 (Fedora MinGW 7.3.0-1.fc28) (GCC) --- snip ---
$ sha1sum easyHDR_3130_setup-demo.exe 2002238e64859a290abdd523cb0755262ffa8e4e easyHDR_3130_setup-demo.exe
$ du -sh easyHDR_3130_setup-demo.exe 34M easyHDR_3130_setup-demo.exe
$ wine --version wine-4.8-202-g61aea5a987
Regards
https://bugs.winehq.org/show_bug.cgi?id=47226
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Keywords| |download URL| |https://web.archive.org/web | |/20190518075044/https://www | |.easyhdr.com/download/easyH | |DR_3130_setup-demo.exe
https://bugs.winehq.org/show_bug.cgi?id=47226
Austin English austinenglish@gmail.com changed:
What |Removed |Added ---------------------------------------------------------------------------- CC| |austinenglish@gmail.com
https://bugs.winehq.org/show_bug.cgi?id=47226
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Resolution|--- |FIXED Status|NEW |RESOLVED Fixed by SHA1| |1f6681f474fe2c626428752068c | |8e68ebfd44202
--- Comment #1 from Anastasius Focht focht@gmx.net --- Hello folks,
this is fixed by commit https://source.winehq.org/git/wine.git/commitdiff/1f6681f474fe2c626428752068... ("winebuild: Use cdecl calling convention for stub exceptions.")
Thanks Alexandre
--- snip --- Unhandled exception: unimplemented function vcomp110.dll._vcomp_for_static_simple_init_i8 called in 64-bit code (0x000000007b45314c). Register dump: rip:000000007b45314c rsp:00000000219dfa80 rbp:00000000219dfb50 eflags:00000202 ( - -- I - - - ) rax:00000000219dfaa0 rbx:0000000080000100 rcx:00000000219dfaa0 rdx:00000000219dfac0 rsi:00000000219dfb90 rdi:00000000219dfad0 r8:0000000000000002 r9:00000000219dfb80 r10:0000000000000000 r11:00000000219dfc98 r12:000000002108f874 r13:000000001d368170 r14:0000000000000002 r15:0000000000000002 ... Backtrace: =>0 0x000000007b45314c RaiseException+0x6c(code=<is not available>, flags=<is not available>, nbargs=<is not available>, args=<is not available>) [/home/focht/projects/wine/mainline-src/dlls/kernel32/except.c:86] in kernel32 (0x00000000219dfb50) 0x000000007b45314c RaiseException+0x6c [/home/focht/projects/wine/mainline-src/dlls/kernel32/except.c:86] in kernel32: leaq 0xfffffffffffffff0(%rbp),%rsp 86 } Modules: Module Address Debug info Name (160 modules) PE 130000- 13d000 Deferred ilmthread-2_2 PE 250000- 29b000 Deferred qt5winextras PE 2a0000- 6f7000 Deferred qt5gui PE 700000- 8f3000 Deferred libglesv2 PE 900000- e51000 Deferred qt5widgets PE e60000- e7e000 Deferred zlibwapi PE e80000- ef6000 Deferred lcms2 PE f00000- 11c2000 Deferred ilmimf-2_2 PE 11d0000- 1219000 Deferred half PE 1220000- 1236000 Deferred iex-2_2 PE 1240000- 1258000 Deferred imath-2_2 PE 1260000- 1389000 Deferred libraw PE 15f0000- 1721000 Deferred qwindows PE 1840000- 184d000 Deferred qico PE 1850000- 1890000 Deferred qjpeg PE 1890000- 18ec000 Deferred qtiff PE 61000000- 61034000 Deferred qt5xml PE 64000000- 640d3000 Deferred qt5network PE 65100000- 651a7000 Deferred msvcp110 PE 66500000- 66523000 Deferred vcomp110 PE 67000000- 67551000 Deferred qt5core ELF 7a800000- 7aa10000 Deferred opengl32<elf> -PE 7a850000- 7aa10000 \ opengl32 ELF 7b400000- 7b868000 Dwarf kernel32<elf> -PE 7b420000- 7b868000 \ kernel32 ELF 7bc00000- 7bd55000 Deferred ntdll<elf> -PE 7bc20000- 7bd55000 \ ntdll ELF 7c000000- 7c004000 Deferred <wine-loader> PE 140000000- 1403ee000 Deferred easyhdr3 ... ELF 7f765770a000- 7f7657aaf000 Dwarf libwine.so.1 ELF 7f7657ab1000- 7f7657cda000 Deferred ld-linux-x86-64.so.2 ELF 7ffe71326000- 7ffe71327000 Deferred [vdso].so Threads: process tid prio (all id:s are in hex) ... 00000029 (D) C:\Program Files\easyHDR 3 Demo\easyHDR3.exe 00000045 0 <== ... --- snip ---
$ wine --version wine-4.8-245-g21ae9ba1ba
Regards
https://bugs.winehq.org/show_bug.cgi?id=47226
Alexandre Julliard julliard@winehq.org changed:
What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |CLOSED
--- Comment #2 from Alexandre Julliard julliard@winehq.org --- Closing bugs fixed in 4.9.