[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