[Bug 28140] Theatre of War 3: Korea demo 1.2.0 crashes on startup ( hook engine can't cope with GOT/PIC register load code at API entry, needs DECLSPEC_HOTPATCH for kernel32.SizeofResource)

wine-bugs at winehq.org wine-bugs at winehq.org
Tue Apr 2 13:25:35 CDT 2019


https://bugs.winehq.org/show_bug.cgi?id=28140

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|REOPENED                    |NEW
          Component|comctl32                    |kernel32

--- Comment #16 from Anastasius Focht <focht at gmx.net> ---
Hello Paul,

--- quote ---
Must be compiler version and / or optimization flags. Looks like in my case
compiler correctly deduced it doesn't need PIC prolog in this function.
--- quote ---

the only case for '-fPIC' where a load of GOT register is emitted into prolog
code is indeed "no optimization". Gcc seems to intentionally generate "bad"
code here, including a redundant load of GOT register.

https://source.winehq.org/git/wine.git/blob/HEAD:/dlls/kernel32/resource.c#l617

--- snip ---
 617 /**********************************************************************
 618  *          SizeofResource   (KERNEL32.@)
 619  */
 620 DWORD WINAPI SizeofResource( HINSTANCE hModule, HRSRC hRsrc )
 621 {
 622     if (!hRsrc) return 0;
 623     return ((PIMAGE_RESOURCE_DATA_ENTRY)hRsrc)->Size;
 624 }
--- snip ---

Quick check:

--- snip ---
$ echo "" | gcc -E -m32 -v - 2>&1 | grep -i cc
COLLECT_GCC=/usr/bin/gcc
Configured with: ../configure --enable-bootstrap
--enable-languages=c,c++,fortran,objc,obj-c++,ada,go,lto --prefix=/usr
--mandir=/usr/share/man --infodir=/usr/share/info
--with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-shared
--enable-threads=posix --enable-checking=release --enable-multilib
--with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions
--enable-gnu-unique-object --enable-linker-build-id
--with-gcc-major-version-only --with-linker-hash-style=gnu --enable-plugin
--enable-initfini-array --with-isl --enable-libmpx
--enable-offload-targets=nvptx-none --without-cuda-driver
--enable-gnu-indirect-function --enable-cet --with-tune=generic
--with-arch_32=i686 --build=x86_64-redhat-linux
gcc version 8.3.1 20190223 (Red Hat 8.3.1-2) (GCC) 
COLLECT_GCC_OPTIONS='-E' '-m32' '-v' '-mtune=generic' '-march=i686'
 /usr/libexec/gcc/x86_64-redhat-linux/8/cc1 -E -quiet -v -imultilib 32 - -m32
-mtune=generic -march=i686
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-redhat-linux/8/include-fixed"
ignoring nonexistent directory
"/usr/lib/gcc/x86_64-redhat-linux/8/../../../../x86_64-redhat-linux/include"
 /usr/lib/gcc/x86_64-redhat-linux/8/include
COMPILER_PATH=/usr/libexec/gcc/x86_64-redhat-linux/8/:/usr/libexec/gcc/x86_64-redhat-linux/8/:/usr/libexec/gcc/x86_64-redhat-linux/:/usr/lib/gcc/x86_64-redhat-linux/8/:/usr/lib/gcc/x86_64-redhat-linux/
LIBRARY_PATH=/usr/lib/gcc/x86_64-redhat-linux/8/32/:/usr/lib/gcc/x86_64-redhat-linux/8/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-redhat-linux/8/:/usr/lib/gcc/x86_64-redhat-linux/8/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-E' '-m32' '-v' '-mtune=generic' '-march=i686' 
--- snip ---

--- snip ---
$ pwd
/home/focht/projects/wine/mainline-build-i686/dlls/kernel32

$ rm resource.o

$ gcc -m32 -c -o resource.o
/home/focht/projects/wine/mainline-src/dlls/kernel32/resource.c -I. \
  -I/home/focht/projects/wine/mainline-src/dlls/kernel32 -I../../include \
  -I/home/focht/projects/wine/mainline-src/include -D__WINESRC__ -D_KERNEL32_
-D_NORMALIZE_  \
  -D_REENTRANT -fPIC -Wall -pipe -fno-strict-aliasing
-Wdeclaration-after-statement -Wempty-body \
  -Wignored-qualifiers -Wno-packed-not-aligned -Wshift-overflow=2
-Wstrict-prototypes -Wtype-limits \
  -Wunused-but-set-parameter -Wvla -Wwrite-strings -Wpointer-arith -Wlogical-op
\
  -gdwarf-2   -gstrict-dwarf -fno-omit-frame-pointer -g

$ /home/focht/projects/wine/mainline-build-x86_64/tools/winegcc/winegcc -o
kernel32.dll.so \
  -B/home/focht/projects/wine/mainline-build-x86_64/tools/winebuild
--sysroot=../.. -m32 \
  -fasynchronous-unwind-tables -shared
/home/focht/projects/wine/mainline-src/dlls/kernel32/kernel32.spec \
  -nodefaultlibs -Wb,-F,KERNEL32.dll -Wl,--image-base,0x7b400000 actctx.o
atom.o change.o comm.o \
  computername.o console.o cpu.o debugger.o editline.o environ.o except.o
fiber.o file.o \
  format_msg.o heap.o kernel_main.o lcformat.o locale.o lzexpand.o module.o
nameprep.o oldconfig.o \
  path.o powermgnt.o process.o profile.o resource.o string.o sync.o tape.o
term.o thread.o time.o \
  toolhelp.o version.o virtual.o volume.o wer.o locale_rc.res version.res
winerror.res \
  ../../dlls/winecrt0/libwinecrt0.a -lntdll ../../libs/port/libwine_port.a
--- snip ---

With '-O0':

--- snip ---
$ gdb kernel32.dll.so -batch -ex 'disassemble SizeofResource'
Dump of assembler code for function SizeofResource:
   0x7b47a0b5 <+0>:    push   %ebp
   0x7b47a0b6 <+1>:    mov    %esp,%ebp
   0x7b47a0b8 <+3>:    call   0x7b42f028 <__x86.get_pc_thunk.ax>
   0x7b47a0bd <+8>:    add    $0x1e6f43,%eax
   0x7b47a0c2 <+13>:    cmpl   $0x0,0xc(%ebp)
   0x7b47a0c6 <+17>:    jne    0x7b47a0cf <SizeofResource+26>
   0x7b47a0c8 <+19>:    mov    $0x0,%eax
   0x7b47a0cd <+24>:    jmp    0x7b47a0d5 <SizeofResource+32>
   0x7b47a0cf <+26>:    mov    0xc(%ebp),%eax
   0x7b47a0d2 <+29>:    mov    0x4(%eax),%eax
   0x7b47a0d5 <+32>:    pop    %ebp
   0x7b47a0d6 <+33>:    ret    $0x8
End of assembler dump.
--- snip ---

With '-O1':

--- snip ---
$ gdb kernel32.dll.so -batch -ex 'disassemble SizeofResource'
Dump of assembler code for function SizeofResource:
   0x7b47b9e2 <+0>:    push   %ebp
   0x7b47b9e3 <+1>:    mov    %esp,%ebp
   0x7b47b9e5 <+3>:    mov    0xc(%ebp),%eax
   0x7b47b9e8 <+6>:    test   %eax,%eax
   0x7b47b9ea <+8>:    je     0x7b47b9f3 <SizeofResource+17>
   0x7b47b9ec <+10>:    mov    0x4(%eax),%eax
   0x7b47b9ef <+13>:    pop    %ebp
   0x7b47b9f0 <+14>:    ret    $0x8
   0x7b47b9f3 <+17>:    mov    $0x0,%eax
   0x7b47b9f8 <+22>:    jmp    0x7b47b9ef <SizeofResource+13>
End of assembler dump.
--- snip ---

With '-O2':

--- snip ---
$ gdb kernel32.dll.so -batch -ex 'disassemble SizeofResource'
Dump of assembler code for function SizeofResource:
   0x7b47c010 <+0>:    push   %ebp
   0x7b47c011 <+1>:    mov    %esp,%ebp
   0x7b47c013 <+3>:    mov    0xc(%ebp),%eax
   0x7b47c016 <+6>:    test   %eax,%eax
   0x7b47c018 <+8>:    je     0x7b47c028 <SizeofResource+24>
   0x7b47c01a <+10>:    mov    0x4(%eax),%eax
   0x7b47c01d <+13>:    pop    %ebp
   0x7b47c01e <+14>:    ret    $0x8
   0x7b47c021 <+17>:    lea    0x0(%esi,%eiz,1),%esi
   0x7b47c028 <+24>:    xor    %eax,%eax
   0x7b47c02a <+26>:    pop    %ebp
   0x7b47c02b <+27>:    ret    $0x8
End of assembler dump.

--- snip ---

With '-O3'

--- snip ---
$ gdb kernel32.dll.so -batch -ex 'disassemble SizeofResource'
Dump of assembler code for function SizeofResource:
   0x7b47cd30 <+0>:    push   %ebp
   0x7b47cd31 <+1>:    mov    %esp,%ebp
   0x7b47cd33 <+3>:    mov    0xc(%ebp),%eax
   0x7b47cd36 <+6>:    test   %eax,%eax
   0x7b47cd38 <+8>:    je     0x7b47cd48 <SizeofResource+24>
   0x7b47cd3a <+10>:    mov    0x4(%eax),%eax
   0x7b47cd3d <+13>:    pop    %ebp
   0x7b47cd3e <+14>:    ret    $0x8
   0x7b47cd41 <+17>:    lea    0x0(%esi,%eiz,1),%esi
   0x7b47cd48 <+24>:    xor    %eax,%eax
   0x7b47cd4a <+26>:    pop    %ebp
   0x7b47cd4b <+27>:    ret    $0x8
End of assembler dump.
--- snip ---

With '-Os'

--- snip ---
$ gdb kernel32.dll.so -batch -ex 'disassemble SizeofResource'
Dump of assembler code for function SizeofResource:
   0x7b47b4c3 <+0>:    push   %ebp
   0x7b47b4c4 <+1>:    xor    %eax,%eax
   0x7b47b4c6 <+3>:    mov    %esp,%ebp
   0x7b47b4c8 <+5>:    mov    0xc(%ebp),%edx
   0x7b47b4cb <+8>:    test   %edx,%edx
   0x7b47b4cd <+10>:    je     0x7b47b4d2 <SizeofResource+15>
   0x7b47b4cf <+12>:    mov    0x4(%edx),%eax
   0x7b47b4d2 <+15>:    pop    %ebp
   0x7b47b4d3 <+16>:    ret    $0x8
End of assembler dump.
--- snip ---

Regards

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list