[prev in list] [next in list] [prev in thread] [next in thread] 

List:       wine-devel
Subject:    Re: Thunking crash in 990731
From:       Ian Schmidt <ischmidt () cfl ! rr ! com>
Date:       1999-07-31 23:35:38
[Download RAW message or body]

Ulrich Weigand wrote:

> Can you post the disassembly of the complete __regs_FT_PrologPrime
> routine?   This does look suspiciously like a compiler bug; at that
> line in the source code:
>     _write_qtthunk( relayCode, *(DWORD **)(relayCode+targetTableOffset) );
> you have to add *two different* values, not twice the same  ...
>
> My compiler (gcc-2.7.2.3) renders the (probably) equivalent line as:
> 0x4030b1fd <__regs_FT_PrologPrime+61>:  mov    (%edx,%edi,1),%eax

Ok.  Here's the full disassembly up to that point from gcc-2.95 (release) using
Wine's normal default compiler switches:

0x08255514 (__regs_FT_PrologPrime [kernel32.c:767]): pushl      %ebp
0x08255515 (__regs_FT_PrologPrime+0x1 [kernel32.c:767]): movl   %esp,%ebp
0x08255517 (__regs_FT_PrologPrime+0x3 [kernel32.c:767]): subl   $16,%esp
0x0825551a (__regs_FT_PrologPrime+0x6 [kernel32.c:767]): pushl  %esi
0x0825551b (__regs_FT_PrologPrime+0x7 [kernel32.c:767]): pushl  %ebx
0x0825551c (__regs_FT_PrologPrime+0x8 [kernel32.c:767]): movl   0x8(%ebp),%ebx
0x0825551f (__regs_FT_PrologPrime+0xb [kernel32.c:779]): addl   $-8,%esp
0x08255522 (__regs_FT_PrologPrime+0xe [kernel32.c:774]): movl   0xc4(%ebx),%eax
0x08255528 (__regs_FT_PrologPrime+0x14 [kernel32.c:774]): leal
0xfffffffc(%eax),%edx
0x0825552b (__regs_FT_PrologPrime+0x17 [kernel32.c:774]): movl  %edx,0xc4(%ebx)
0x08255531 (__regs_FT_PrologPrime+0x1d [kernel32.c:777]): movl
0xfffffffc(%eax),%esi
0x08255534 (__regs_FT_PrologPrime+0x20 [kernel32.c:777]): addl  $4,0xc4(%ebx)
0x0825553b (__regs_FT_PrologPrime+0x27 [kernel32.c:778]): addl  $4,0xc4(%ebx)
0x08255542 (__regs_FT_PrologPrime+0x2e [kernel32.c:779]): movl
0x0(%esi,%esi,1),%eax
0x08255545 (__regs_FT_PrologPrime+0x31 [kernel32.c:779]): pushl %eax
0x08255546 (__regs_FT_PrologPrime+0x32 [kernel32.c:779]): pushl %esi
0x08255547 (__regs_FT_PrologPrime+0x33 [kernel32.c:779]): call  0x082546f0
(_write_ftprolog [kernel32.c:88])

When adding the new -fno-strict-aliasing switch (which turns off enforcement of ISO
aliasing rules - see http://egcs.cygnus.com/faq.html#linuxkernel for details) Wine
works properly.  Here's the generated code in that case:

0x08255528 (__regs_FT_PrologPrime [kernel32.c:767]): pushl      %ebp
0x08255529 (__regs_FT_PrologPrime+0x1 [kernel32.c:767]): movl   %esp,%ebp
0x0825552b (__regs_FT_PrologPrime+0x3 [kernel32.c:767]): subl   $16,%esp
0x0825552e (__regs_FT_PrologPrime+0x6 [kernel32.c:767]): pushl  %esi
0x0825552f (__regs_FT_PrologPrime+0x7 [kernel32.c:767]): pushl  %ebx
0x08255530 (__regs_FT_PrologPrime+0x8 [kernel32.c:767]): movl   0x8(%ebp),%ebx
0x08255533 (__regs_FT_PrologPrime+0xb [kernel32.c:774]): movl   0xc4(%ebx),%eax
0x08255539 (__regs_FT_PrologPrime+0x11 [kernel32.c:774]): leal
0xfffffffc(%eax),%edx
0x0825553c (__regs_FT_PrologPrime+0x14 [kernel32.c:774]): movl  %edx,0xc4(%ebx)
0x08255542 (__regs_FT_PrologPrime+0x1a [kernel32.c:777]): movl
0xfffffffc(%eax),%edx
0x08255545 (__regs_FT_PrologPrime+0x1d [kernel32.c:777]): addl  $4,0xc4(%ebx)
0x0825554c (__regs_FT_PrologPrime+0x24 [kernel32.c:778]): movl  0xc4(%ebx),%eax
0x08255552 (__regs_FT_PrologPrime+0x2a [kernel32.c:778]): movl  0x0(%eax),%esi
0x08255554 (__regs_FT_PrologPrime+0x2c [kernel32.c:779]): addl  $-8,%esp
0x08255557 (__regs_FT_PrologPrime+0x2f [kernel32.c:778]): addl  $4,0xc4(%ebx)
0x0825555e (__regs_FT_PrologPrime+0x36 [kernel32.c:779]): movl
0x0(%edx,%esi,1),%eax
0x08255561 (__regs_FT_PrologPrime+0x39 [kernel32.c:779]): pushl %eax
0x08255562 (__regs_FT_PrologPrime+0x3a [kernel32.c:779]): pushl %esi
0x08255563 (__regs_FT_PrologPrime+0x3b [kernel32.c:779]): call  0x082546f0
(_write_ftprolog [kernel32.c:88])

Hope this helps,
-Ian



=========================================================================

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic