diff --git a/winsup/cygwin/dcrt0.cc b/winsup/cygwin/dcrt0.cc index 11edcdf0d..fb726a739 100644 --- a/winsup/cygwin/dcrt0.cc +++ b/winsup/cygwin/dcrt0.cc @@ -632,6 +632,12 @@ child_info_fork::handle_fork () if (fixup_mmaps_after_fork (parent)) api_fatal ("recreate_mmaps_after_fork_failed"); + + /* We need to occupy the address space for dynamically loaded dlls + before we allocate any dynamic object, or we may end up with + error "address space needed by is already occupied" + for no good reason (seen with some relocated dll). */ + dlls.reserve_space (); } bool diff --git a/winsup/cygwin/fork.cc b/winsup/cygwin/fork.cc index 74ee9acf4..7e1c08990 100644 --- a/winsup/cygwin/fork.cc +++ b/winsup/cygwin/fork.cc @@ -136,12 +136,6 @@ frok::child (volatile char * volatile here) { HANDLE& hParent = ch.parent; - /* NOTE: Logically this belongs in dll_list::load_after_fork, but by - doing it here, before the first sync_with_parent, we can exploit - the existing retry mechanism in hopes of getting a more favorable - address space layout next time. */ - dlls.reserve_space (); - sync_with_parent ("after longjmp", true); debug_printf ("child is running. pid %d, ppid %d, stack here %p", myself->pid, myself->ppid, __builtin_frame_address (0));