Bug: 装了 graphics 栈之后,GLX 程序仍拿不到 FBConfig —— vendor 库在 SubOS 里但 payload libGLX 够不到
现象
隔离 home(自己的 HOME/MCPP_HOME/XLINGS_HOME)里 xlings install -y graphics 成功:
[xim:xpkg]: graphics stack installed. On this host:
[xim:xpkg]: NVIDIA proprietary driver 550.144.03 — GL renders on the GPU
✓ 35 package(s) installed
同一 home 里用 mcpp 构建一个 GLFW + OpenGL 程序(compat.glfw@3.4、
compat.opengl@2026.05.31、compat.glx-runtime@2026.08.08),在 DISPLAY=:1
(宿主 glxinfo -B 正常,direct rendering: Yes,NVIDIA 550.144.03)上运行:
GLFW_ERROR 65542: GLX: No GLXFBConfigs returned
GLFW_ERROR 65545: GLX: Failed to find a suitable GLXFBConfig
已经确认的部分
程序拿到的环境是对的——SubOS 的图形变量确实被应用了:
__EGL_VENDOR_LIBRARY_DIRS=[<subos>/share/glvnd/egl_vendor.d]
LIBGL_DRIVERS_PATH=[<subos>/usr/lib/dri]
__GLX_VENDOR_LIBRARY_NAME=[]
LD_LIBRARY_PATH=[<xpkgs>/compat-x-glx-runtime/2026.08.08/mcpp_generated/glx_runtime/lib]
GLX vendor 库也确实装好了:
<subos>/lib/libGLX_nvidia.so.0
<subos>/lib/libGLX_nvidia.so.550.144.03
<subos>/lib/libGLX_mesa.so.0
<subos>/lib/libGLX.so.0
<subos>/share/glvnd/egl_vendor.d/10_nvidia.json 指向
<xpkgs>/xim-x-nvidia-gl-host-link/0.1.1/lib/libEGL_nvidia.so.0。
缺口
SubOS 声明的是 EGL vendor 目录,没有任何东西让 GLX 侧的 vendor 库可达:
程序加载的 libGLX.so.0 来自 compat.glx-runtime payload,它在 dlopen
libGLX_nvidia.so.0 时只会查自己的 RUNPATH,而 <subos>/lib 不在里面。
设 __GLX_VENDOR_LIBRARY_NAME=nvidia 也没用——名字对了,库仍然找不到。
为什么不能用 LD_LIBRARY_PATH 兜
把 <subos>/lib 放进 LD_LIBRARY_PATH 会立刻杀死宿主二进制:
$ LD_LIBRARY_PATH=<subos>/lib timeout 600 mcpp run
timeout: symbol lookup error: <subos>/lib/libc.so.6:
undefined symbol: __pointer_chk_guard, version GLIBC_PRIVATE
<subos>/lib 同时含私有 glibc,而 timeout 由宿主 loader 加载
(见 mcpp-community/mcpp#401)。
这恰好就是 xim 自己在安装时打印的那条警告说的事:
This variable can load code from our payload into processes we do not own,
including host binaries running under the host loader.
Prefer RPATH on the consumer; use this only where RPATH cannot reach.
建议方向
按同一条规则收口:让 compat.glx-runtime 的 libGLX.so.0 通过 RPATH
(而不是环境变量)够到 SubOS 的 GLX vendor 目录,或者由 graphics 栈提供一个
GLX 侧等价于 egl_vendor.d 的声明。
环境
- xlings
2026.8.9.2,隔离 home(HOME/MCPP_HOME/XLINGS_HOME 全部指向临时目录)
- mcpp
2026.8.10.1(mcpp-community/mcpp#400)
- 宿主:X11
:1,NVIDIA 550.144.03,宿主 GL 正常
mcpp 侧的边界
mcpp 这边已核对无误:requirement / provider / provenance / link intent /
SubOS 图形环境 / post-link 闭包校验都正确并已存档,mcpp why runtime 直接读存档、
不重新探测宿主。按冻结的设计边界,driver/ICD 归 xlings/xim,所以这条报到这里。
Bug: 装了 graphics 栈之后,GLX 程序仍拿不到 FBConfig —— vendor 库在 SubOS 里但 payload libGLX 够不到
现象
隔离 home(自己的
HOME/MCPP_HOME/XLINGS_HOME)里xlings install -y graphics成功:同一 home 里用 mcpp 构建一个 GLFW + OpenGL 程序(
compat.glfw@3.4、compat.opengl@2026.05.31、compat.glx-runtime@2026.08.08),在DISPLAY=:1(宿主
glxinfo -B正常,direct rendering: Yes,NVIDIA 550.144.03)上运行:已经确认的部分
程序拿到的环境是对的——SubOS 的图形变量确实被应用了:
GLX vendor 库也确实装好了:
<subos>/share/glvnd/egl_vendor.d/10_nvidia.json指向<xpkgs>/xim-x-nvidia-gl-host-link/0.1.1/lib/libEGL_nvidia.so.0。缺口
SubOS 声明的是 EGL vendor 目录,没有任何东西让 GLX 侧的 vendor 库可达:
程序加载的
libGLX.so.0来自compat.glx-runtimepayload,它在dlopenlibGLX_nvidia.so.0时只会查自己的 RUNPATH,而<subos>/lib不在里面。设
__GLX_VENDOR_LIBRARY_NAME=nvidia也没用——名字对了,库仍然找不到。为什么不能用 LD_LIBRARY_PATH 兜
把
<subos>/lib放进LD_LIBRARY_PATH会立刻杀死宿主二进制:<subos>/lib同时含私有 glibc,而timeout由宿主 loader 加载(见 mcpp-community/mcpp#401)。
这恰好就是 xim 自己在安装时打印的那条警告说的事:
建议方向
按同一条规则收口:让
compat.glx-runtime的libGLX.so.0通过 RPATH(而不是环境变量)够到 SubOS 的 GLX vendor 目录,或者由 graphics 栈提供一个
GLX 侧等价于
egl_vendor.d的声明。环境
2026.8.9.2,隔离 home(HOME/MCPP_HOME/XLINGS_HOME全部指向临时目录)2026.8.10.1(mcpp-community/mcpp#400):1,NVIDIA 550.144.03,宿主 GL 正常mcpp 侧的边界
mcpp 这边已核对无误:requirement / provider / provenance / link intent /
SubOS 图形环境 / post-link 闭包校验都正确并已存档,
mcpp why runtime直接读存档、不重新探测宿主。按冻结的设计边界,driver/ICD 归 xlings/xim,所以这条报到这里。