Ruby ships the libraries its runtime library imports (libgmp-10.dll and
libwinpthread-1.dll) as a private assembly, ruby_builtin_dlls, in a folder of
that name beside the program, and names it in the runtime library's own
manifest (resource 2). Raven looked for assemblies only in the side-by-side
store and applied a library's own manifest only to libraries loaded later,
so the program could not start. An assembly without a public key token is
now looked for as Windows looks for a private assembly: <name>.manifest in
the program's folder, then <name>\<name>.manifest, with its files beside the
manifest. The libraries a program starts with resolve their imports through
their own manifest first, as later loads already did, and a library found
that way keeps its file for GetModuleFileName. Ruby gets past its libraries
and then stops on its own check of the C runtime (see the session report).
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: private assembly lookup and the start-up use of library manifests
(cherry picked from commit 03b2f65f8289b394126f58e94f8b4126f35d57d6)
On Windows only the KnownDLLs are protected from a copy in the program's
folder; graphics wrappers, overlays and plugin loaders ship their own
winmm.dll, version.dll, dinput8.dll, d3d9.dll or dxgi.dll there and
forward to the system copy. Raven served every system library itself.
A short core list (ntdll, kernel32, kernelbase, user32, gdi32, comctl32,
advapi32, msvcrt, ucrtbase, ole32, oleaut32, combase, rpcrt4, shell32,
shlwapi, setupapi, comdlg32) is still always Raven's. For any other
system library a copy beside the program loads, and Raven's own
implementation stays reachable under its System32 or SysWOW64 path and
through LOAD_LIBRARY_SEARCH_SYSTEM32. Copies an installer leaves in the
prefix's system directory are still ignored. The x86 path shares the
program-folder scan, which replaces the d3d9.dll special case.
Assisted-by: Claude Code:claude-opus-5-5
AI-Scope: Wrote the loader, provider and dependency changes and the new
dependencies_test case, after a program's own winmm.dll was found to be
replaced by Raven's. Prompt: find what stops the program's own DLL
from loading and fix it in Raven.