I've looked at the assembly (I'm not an expert...). When using the microsoft compiler both main() and f() have this code at the start: 00401000 push ebp 00401001 mov ebp,esp 00401003 and esp,0FFFFFFF0h 00401006 sub esp,10h .. But with gcc main() has this: 0x4012e2 <main>: push %ebp 0x4012e3 <main+1>: mov %esp,%ebp 0x4012e5 <main+3>: sub $0x28,%esp 0x4012e8 <main+6>: and $0xfffffff0,%esp 0x4012eb <main+9>: mov $0x0,%eax .. and f() has: 0x4012ce <f>: push %ebp 0x4012cf <f+1>: mov %esp,%ebp 0x4012d1 <f+3>: sub $0x8,%esp 0x4012d4 <f+6>: call 0x401290 <g> 0x4012d9 <f+11>: mov $0x0,%eax .. I'm guessing that the 'and 0xfffffff0' is aligning the stack pointer? So gcc isn't aligning the stack pointer for f(), maybe assuming that it will already be aligned somehow (which it isn't when it's the entry point of the thread)? Jon