------- Comment #10 from pluto at agmk dot net  2009-03-22 21:17 -------
finally, not a gcc bug.

the mingw-w64-crt/misc/mingw_getsp.S has bugs:
- it forces .code64 even for 32-bit mode.
- it jumps directly into data segement -> jmp (_fctMsvcrtLongJmp)

i've tested following patch:

@@ -3,8 +3,6 @@
  * This file is part of the w64 mingw-runtime package.
  * No warranty is given; refer to the file DISCLAIMER within this package.
  */
-       .file   "ceill.S"
-       .code64
        .text
        .align 4
 .globl _mingw_getsp
@@ -26,5 +24,5 @@
   leaq _fctMsvcrtLongJmp(%rip), %rax
   jmpq *(%rax)
 #else
-  jmp (_fctMsvcrtLongJmp)
+  jmp *(_fctMsvcrtLongJmp)
 #endif

but it crashes later in msvcrt.dll:

Breakpoint 1, 0x004023a5 in longjmp ()
(gdb) disassemble
Dump of assembler code for function longjmp:
0x004023a5 <longjmp+0>: jmp    *0x405460
0x004023ab <longjmp+6>: nop

(gdb) disassemble *0x405460
Dump of assembler code for function msvcrt!longjmp:
0x77bc7e18 <msvcrt!longjmp+0>:  mov    0x4(%esp),%ebx
0x77bc7e1c <msvcrt!longjmp+4>:  mov    (%ebx),%ebp
0x77bc7e1e <msvcrt!longjmp+6>:  mov    0x18(%ebx),%esi
(...)

(gdb) c
Continuing.

Program received signal SIGSEGV, Segmentation fault.
0x77bc6481 in msvcrt!_local_unwind2 () from C:\WINDOWS\syswow64\msvcrt.dll
(gdb) disassemble
Dump of assembler code for function msvcrt!_local_unwind2:
0x77bc645f <msvcrt!_local_unwind2+0>:   push   %ebx
0x77bc6460 <msvcrt!_local_unwind2+1>:   push   %esi
0x77bc6461 <msvcrt!_local_unwind2+2>:   push   %edi
0x77bc6462 <msvcrt!_local_unwind2+3>:   mov    0x10(%esp),%eax
0x77bc6466 <msvcrt!_local_unwind2+7>:   push   %ebp
0x77bc6467 <msvcrt!_local_unwind2+8>:   push   %eax
0x77bc6468 <msvcrt!_local_unwind2+9>:   push   $0xfffffffe
0x77bc646a <msvcrt!_local_unwind2+11>:  push   $0x77bc6424
0x77bc646f <msvcrt!_local_unwind2+16>:  pushl  %fs:0x0
0x77bc6476 <msvcrt!_local_unwind2+23>:  mov    %esp,%fs:0x0
0x77bc647d <msvcrt!_local_unwind2+30>:  mov    0x24(%esp),%eax
0x77bc6481 <msvcrt!_local_unwind2+34>:  mov    0x8(%eax),%ebx
0x77bc6484 <msvcrt!_local_unwind2+37>:  mov    0xc(%eax),%esi
0x77bc6487 <msvcrt!_local_unwind2+40>:  cmp    $0xffffffff,%esi
0x77bc648a <msvcrt!_local_unwind2+43>:  je     0x77bc64c1
<msvcrt!_local_unwind2+98>
0x77bc648c <msvcrt!_local_unwind2+45>:  cmpl   $0xffffffff,0x28(%esp)
0x77bc6491 <msvcrt!_local_unwind2+50>:  je     0x77bc6499
<msvcrt!_local_unwind2+58>
0x77bc6493 <msvcrt!_local_unwind2+52>:  cmp    0x28(%esp),%esi
0x77bc6497 <msvcrt!_local_unwind2+56>:  jbe    0x77bc64c1
<msvcrt!_local_unwind2+98>
0x77bc6499 <msvcrt!_local_unwind2+58>:  lea    (%esi,%esi,2),%esi
0x77bc649c <msvcrt!_local_unwind2+61>:  mov    (%ebx,%esi,4),%ecx
0x77bc649f <msvcrt!_local_unwind2+64>:  mov    %ecx,0x8(%esp)
0x77bc64a3 <msvcrt!_local_unwind2+68>:  mov    %ecx,0xc(%eax)
0x77bc64a6 <msvcrt!_local_unwind2+71>:  cmpl   $0x0,0x4(%ebx,%esi,4)
0x77bc64ab <msvcrt!_local_unwind2+76>:  jne    0x77bc64bf
<msvcrt!_local_unwind2+96>
0x77bc64ad <msvcrt!_local_unwind2+78>:  push   $0x101
0x77bc64b2 <msvcrt!_local_unwind2+83>:  mov    0x8(%ebx,%esi,4),%eax
0x77bc64b6 <msvcrt!_local_unwind2+87>:  call   0x77bc64fb
<msvcrt!_abnormal_termination+44>
0x77bc64bb <msvcrt!_local_unwind2+92>:  call   *0x8(%ebx,%esi,4)
0x77bc64bf <msvcrt!_local_unwind2+96>:  jmp    0x77bc647d
<msvcrt!_local_unwind2+30>
0x77bc64c1 <msvcrt!_local_unwind2+98>:  popl   %fs:0x0
0x77bc64c8 <msvcrt!_local_unwind2+105>: add    $0x10,%esp
0x77bc64cb <msvcrt!_local_unwind2+108>: pop    %edi
0x77bc64cc <msvcrt!_local_unwind2+109>: pop    %esi
0x77bc64cd <msvcrt!_local_unwind2+110>: pop    %ebx
0x77bc64ce <msvcrt!_local_unwind2+111>: ret


-- 

pluto at agmk dot net changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
         Resolution|                            |INVALID


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39291

Reply via email to