You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[WSLg / D3D12] D3D12GetInterface() in /usr/lib/wsl/lib/libd3d12.so recurses into itself until the stack overflows (SIGSEGV) #42286
$ gdb -batch -ex run -ex 'bt 8' ./getif_probe
Program received signal SIGSEGV, Segmentation fault.
#0 pthread_mutex_lock () from /lib/x86_64-linux-gnu/libc.so.6
#1 ?? () from /usr/lib/wsl/lib/libd3d12.so
#2 ?? () from /usr/lib/wsl/lib/libd3d12.so
#3 D3D12GetInterface () from /usr/lib/wsl/lib/libd3d12.so
#4 D3D12GetInterface () from /usr/lib/wsl/lib/libd3d12.so
#5 D3D12GetInterface () from /usr/lib/wsl/lib/libd3d12.so
...
The full backtrace has 130,912 D3D12GetInterface frames; the faulting frame's
stack pointer is at the bottom of the 8 MB main-thread stack. In the disassembly
the recursive call is the indirect call *0x58(%rax) at libd3d12.so+0xbbadc, returning to +0xbbadf.
On WSL2, D3D12GetInterface() from /usr/lib/wsl/lib/libd3d12.so crashes the
process for most CLSIDs: the function calls itself about 130,000 times and the
process dies with SIGSEGV when the stack runs out, with or without a device
created first. A plain Linux program reproduces it; no Wine/Proton involved.
libd3d12core.so exports a D3D12GetInterface of its own, and calling that one
directly (dlsym on a dlopen handle for libd3d12core.so) does not crash. So libd3d12.so seems to forward to a pointer that resolves to its own export
instead of the core's (both are D3D12GetInterface@@VER_1).
CLSID
libd3d12.so export
libd3d12core.so export
CLSID_D3D12Tools
SIGSEGV
S_OK
CLSID_D3D12DeviceRemovedExtendedData
SIGSEGV
S_OK
CLSID_D3D12DeviceFactory
SIGSEGV
S_OK after a device was created, E_NOINTERFACE before
CLSID_D3D12Debug
SIGSEGV
DXGI_ERROR_SDK_COMPONENT_MISSING (no debug layer installed)
CLSID_D3D12SDKConfiguration
E_NOINTERFACE
E_NOINTERFACE
Consequence: on WSL, applications cannot use ID3D12DeviceFactory, ID3D12Tools, or the DRED settings reached through D3D12GetInterface()
without crashing.
Activity
github-actions commentedon Nov 15, 2026
No logs.etl found in the archive. Make sure that you ran
collect-wsl-logs.ps1as administrator and that thelogs.etlfile is in the archive.Diagnostic information
chaoyen1980 commentedon Nov 15, 2026
On WSL2,
D3D12GetInterface()from/usr/lib/wsl/lib/libd3d12.socrashes theprocess for most CLSIDs: the function calls itself about 130,000 times and the
process dies with SIGSEGV when the stack runs out, with or without a device
created first. A plain Linux program reproduces it; no Wine/Proton involved.
libd3d12core.soexports aD3D12GetInterfaceof its own, and calling that onedirectly (
dlsymon adlopenhandle forlibd3d12core.so) does not crash. Solibd3d12.soseems to forward to a pointer that resolves to its own exportinstead of the core's (both are
D3D12GetInterface@@VER_1).libd3d12.soexportlibd3d12core.soexportCLSID_D3D12ToolsS_OKCLSID_D3D12DeviceRemovedExtendedDataS_OKCLSID_D3D12DeviceFactoryS_OKafter a device was created,E_NOINTERFACEbeforeCLSID_D3D12DebugDXGI_ERROR_SDK_COMPONENT_MISSING(no debug layer installed)CLSID_D3D12SDKConfigurationE_NOINTERFACEE_NOINTERFACEConsequence: on WSL, applications cannot use
ID3D12DeviceFactory,ID3D12Tools, or the DRED settings reached throughD3D12GetInterface()without crashing.