icd_shim: key thunks by target, not by name
Dishonored DE (Epic, D3D9 through DXVK 1.10.3, Proton 11.0-2-x86_64-7 under box64, AYN Thor on Turnip) dies ~11 s into a gamescope session with err:vulkan:vkResetQueryPoolEXT Exception 0xc0000005 in Unix call; with BOX64_SHOWSEGV it is a branch to PC 0 below the bridge for that function. The same container runs on X11.
The process creates two Vulkan devices. zink comes first (API 1.2+, no VK_EXT_host_query_reset): the device-GDPA gate from #11 says the EXT name does not exist on it, the alias hop asks for vkResetQueryPool, the gate passes, and dlsym on the adrenotools handle (Android's libvulkan namespace) answers with Android's exported core trampoline, which is valid for that device. DXVK's device comes second (apiVersion 1.1, the extension enabled, since D3D9 in DXVK 1.10 requires host query reset): the gate says the EXT name exists and GDPA returns Turnip's own function. But thunk_for kept one thunk per name per process, with the target fixed at the first emission, so DXVK's device got zink's thunk and jumped through an Android dispatch slot that is NULL for a 1.1 device. Every promoted alias in a multi-device process has the same hazard.
Change:
- thunk.rs: the thunk cache is keyed by the target address. The emitted code depends only on the target, so the same target still shares one thunk and a name that resolves to a different target for another device gets its own.
- Diagnostics: every new thunk is logged with its target (dladdr symbol or library+offset), with no cap; a name coming back with a different target logs
thunk retarget; thereal proc ... viaand GDPA-miss logs are per device (1024 names each, cleared on vkDestroyDevice) and carrydev=; theproxy deviceline carries the instance'sapi=. The 128/64 per-process caps had been exhausted by the first device in both user logs, which is why the decisive line was missing twice. The GDPA-miss comment and label are corrected: a NULL from the ICD reaches the app as NULL; what jumps through an empty slot is a loader instance trampoline. - Left as is: the RW/RX flip of the live thunk page during emission (a separate change).
Verified: on an Odin 3 (Adreno 830, Turnip Gen8 V37, gamescope): Vampire Survivors (64-bit DXVK, two devices in one process) 60 fps, Blazing Chrome (32-bit) 60 fps, Balatro (zink) ~277 fps, splash hides within 20 ms of the first-map note, no exceptions, no thunk retarget lines, and each device now logs its full resolution table (91 names per DXVK device). Not run on the Thor itself; BrainBeat's next log should show thunk retarget vkResetQueryPoolEXT followed by a second thunk -> line pointing into libvulkan_freedreno.so.