This patch comes from https://bugs.winehq.org/show_bug.cgi?id=41703 by xw897002528 on 2017-07-29 04:23:37 CDT as attachment 58819 --- a/configure.ac +++ b/configure.ac @@ -1206,6 +1206,12 @@ dnl *** End of X11/Xlib.h check + dnl Check for the unload_after_dlclose libc + AC_RUN_IFELSE( + [AC_LANG_PROGRAM([[#include ]], [[dlclose(dlopen("./conftest", 0)); return 0;]])], + ac_save_CPPFLAGS="$ac_save_CPPFLAGS -DNO_UNLOAD_AFTER_DLCLOSE", + []) + dnl Check for the presence of OpenGL opengl_msg="" if test "x$with_opengl" != "xno" --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -2213,6 +2213,13 @@ if (mod->Flags & LDR_WINE_INTERNAL && mod->SectionHandle == handle) { info.wm = CONTAINING_RECORD(mod, WINE_MODREF, ldr); +#ifdef NO_UNLOAD_AFTER_DLCLOSE + if (info.wm->ldr.LoadCount == 0) { + RtlEnterCriticalSection( &loader_section ); + info.wm->ldr.LoadCount = 1; + RtlLeaveCriticalSection( &loader_section ); + } +#endif TRACE( "Found %s at %p for builtin %s\n", debugstr_w(info.wm->ldr.FullDllName.Buffer), info.wm->ldr.BaseAddress, debugstr_w(path) ); break; @@ -3009,9 +3016,18 @@ * LdrShutdownProcess (NTDLL.@) * */ +#ifdef NO_UNLOAD_AFTER_DLCLOSE +static void MODULE_FlushModrefs(void); +#endif void WINAPI LdrShutdownProcess(void) { TRACE("()\n"); +#ifdef NO_UNLOAD_AFTER_DLCLOSE + RtlEnterCriticalSection( &loader_section ); + process_detach(); + MODULE_FlushModrefs(); + RtlLeaveCriticalSection( &loader_section ); +#endif process_detaching = TRUE; process_detach(); } @@ -3202,8 +3218,12 @@ /* Call process detach notifications */ if ( free_lib_count <= 1 ) { +#ifdef NO_UNLOAD_AFTER_DLCLOSE + TRACE("apply no-op dlclose hacks on this platform\n"); +#else process_detach(); MODULE_FlushModrefs(); +#endif } TRACE("END\n");