pressure-vessel: Look for internal Nvidia helper libraries by name
The Nvidia drivers have various helper libraries that get loaded as dependencies. Some of them are hard dependencies via `DT_NEEDED`, but others are loaded dynamically with `dlopen()`: for example, at the time of writing, `libGLX_nvidia.so.0` has a `DT_NEEDED` dependency on `libnvidia-glcore.so.VERSION` which is sufficient for OpenGL, but dlopens `libnvidia-glvkspirv.so.VERSION` when asked to act as a Vulkan driver. Normally, we can find these libraries by their entry in `soname_globs_even_if_older[]`, by using the `soname-match:` syntax to search `/etc/ld.so.cache` for SONAMEs matching a glob pattern like `libnvidia-glvkspirv.so.*`. This works because OS distributions normally install these libraries into the default system library directory `/usr/lib{,32,64}` or `/usr/lib/MULTIARCH`, which is indexed by ldconfig(8). However, when using Canonical's Snap apps, the Nvidia drivers can only be found in the `LD_LIBRARY_PATH`, and `soname-match:` does not implement `LD_LIBRARY_PATH` search. This leads to a situation similar to https://github.com/ValveSoftware/steam-runtime/issues/632 where these libraries are not found. The result is that the Nvidia Vulkan driver is present, but fails to load. If we can read `/sys/module/nvidia/version` (which Flatpak also relies on as its way to discover the current Nvidia driver version), then we can resolve this by looking for each of the known libraries by name. This takes into account `LD_LIBRARY_PATH` and `DT_RUNPATH`, not just the `ld.so.cache`. Making this effective will require a snapd change, to make `/sys/module/nvidia/version` readable. Helps: https://github.com/ValveSoftware/steam-runtime/issues/586 Signed-off-by:Simon McVittie <smcv@collabora.com>
parent
37c764a8
No related branches found
No related tags found
Loading
Please register or sign in to comment