Repository navigation
Conversation
Modernizes the Windows native-extension loader from legacy LoadLibraryW to LoadLibraryExW with LOAD_WITH_ALTERED_SEARCH_PATH. The .so's own directory is searched first for its transitive DLL imports — gems that bundle DLLs alongside the .so are found without walking PATH. Wall-clock impact in this setup is noise (deps for gtk3 live in ucrt64/bin via PATH, not next to the .so). Kept anyway as the recommended form on Win10+.
Adds a RUBY_DLL_PATH environment variable that, when set, switches the process from legacy PATH-walking DLL search to the Win10+ AddDllDirectory + LOAD_LIBRARY_SEARCH_DEFAULT_DIRS mechanism. The named directory is registered as a user dir, ruby.exe's own dir is also registered, and dln.c's LoadLibraryExW uses LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR to skip PATH walking entirely. Without RUBY_DLL_PATH the legacy behavior is unchanged (dln.c uses LOAD_WITH_ALTERED_SEARCH_PATH, the modern equivalent of LoadLibraryW that searches the .so's own directory first for transitive imports). Measured wall-clock impact on gtk3/tzinfo/sqlite3 require is noise (~0 ms either way). The cost in modern Windows LoadLibrary is not in the path search — it's in PE relocation and DllMain execution. Kept the change as the recommended form on Win10+; turn on per-installation if desired.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Adds an opt-in
RUBY_DLL_PATHenvironment variable. When set, the process switches from legacyPATH-walking DLL search to the Win10+AddDllDirectory+LOAD_LIBRARY_SEARCH_DEFAULT_DIRSmechanism: the named directory is registered as a user dir,ruby.exe's own directory is registered too, anddln.cusesLOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIRto skipPATHwalking entirely.Without
RUBY_DLL_PATHbehavior is unchanged.Measured wall-clock impact on gtk3/tzinfo/sqlite3 requires is ~0 ms either way; the cost in modern Windows
LoadLibraryis not in the search. The value is determinism — a Ruby install can point at its own DLL directory instead of depending onPATHorder.Depends on the
dln-loadlibraryexbranch, whoseLoadLibraryExWcall this builds on; that commit is included here as the first of the two.Windows-only. Not built or tested on Windows CI — measured in a local MSYS2/UCRT64 VM.