Skip to content

win32+dln: opt-in AddDllDirectory / User-Dirs LoadLibrary search - #8

Open
Largo wants to merge 2 commits into
masterfrom
win32-dll-search-path
Open

Largo wants to merge 2 commits into
masterfrom
win32-dll-search-path

Conversation

@Largo

@Largo Largo commented Aug 9, 2026

Copy link
Copy Markdown
Owner

Adds an opt-in RUBY_DLL_PATH environment variable. When set, the process switches 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 directory is registered too, and dln.c uses LOAD_LIBRARY_SEARCH_DEFAULT_DIRS | LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR to skip PATH walking entirely.

Without RUBY_DLL_PATH behavior is unchanged.

Measured wall-clock impact on gtk3/tzinfo/sqlite3 requires is ~0 ms either way; the cost in modern Windows LoadLibrary is not in the search. The value is determinism — a Ruby install can point at its own DLL directory instead of depending on PATH order.

Depends on the dln-loadlibraryex branch, whose LoadLibraryExW call 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.

Largo added 2 commits August 10, 2026 00:27
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant