https://bugs.winehq.org/show_bug.cgi?id=48891
--- Comment #7 from Damjan Jovanovic damjan.jov@gmail.com --- fork() was breaking in several places. The first problem was that a thread that's involved in freezing all other threads and copying their memory to the child never gets started, and it doesn't get started because Cygwin expects an APC to fire during process startup, and on Wine it doesn't. That's fixed now.
I only vaguely remember the current fork() problem, where the child is created, the parent's memory is copied to it, but then some sanity checks are performed, and in file winsup/cygwin/cygheap.h, it expects to find the symbol _cygheap_start at the same address in both parent and child:
extern char _cygheap_start[] __attribute__((section(".idata")));
but on Wine they're at different addresses, which is detected by get_cygwin_startup_info() in dcrt0.cc, and causes fork() to fail. Maybe Wine doesn't lay out .idata sections in binaries at their correct addresses.