Short version:
Start steam in the terminal using:
LD_PRELOAD='/usr/$LIB/libstdc++.so.6' DISPLAY=:0 steam
instead of just steam
Long version:
Steam can’t open nouveau_dri.so
, the shared library responsible for communicating with the graphics driver. To check if the driver is OpenGL enabled run:
DISPLAY=:0 glxinfo | grep -i direct
The output should be:
direct rendering: Yes
Running steam in debug mode:
DISPLAY=:0 LIBGL_DEBUG=verbose steam
Gives us the output where the following lines gives us hint:
libGL: OpenDriver: trying /usr/lib/i386-linux-gnu/dri/nouveau_dri.so
libGL: dlopen /usr/lib/i386-linux-gnu/dri/nouveau_dri.so failed (/home/user/.local/share/Steam/ubuntu12_32/steam-runtime/i386/usr/lib/i386-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /usr/lib/i386-linux-gnu/dri/nouveau_dri.so))
It seems that steam uses different version of libstdc++.so.6
. Lets check which version steam uses:
ls -l ~/.local/share/Steam/ubuntu12_32/steam-runtime/i386/usr/lib/i386-linux-gnu/libstdc++.so.6
lrwxrwxrwx 1 user user 19 Jul 18 2014 /home/user/.local/share/Steam/ubuntu12_32/steam-runtime/i386/usr/lib/i386-linux-gnu/libstdc++.so.6 -> libstdc++.so.6.0.18
So Steam loaded LibC6 with ABI version 18 where driver expects version 20.The solution is to tell OS to preload the proper LibC6 version using
LD_PRELOAD
variable:
LD_PRELOAD='/usr/$LIB/libstdc++.so.6' DISPLAY=:0 steam
The somewhat non-intuitive $LIB parameter gets expanded in ld.so to the right path based on the platform of the process being started (man 8 ld.so for details).
You can create script with the following content to run it instead of steam
:
#!/bin/bash
# Export so all child processes are affected as well
export LD_PRELOAD='/usr/$LIB/libstdc++.so.6'
export DISPLAY=:0
#export LIBGL_DEBUG=verbose
steam
A better script could check if the global LibC6 version is newer than the one in STEAM_RUNTIME
and only then LD_PRELOAD
’s.
More details can be found on here. Note that I tested it on Debian and now it has been tested on Ubuntu vivid 15.04 and works fine.