Se busca instalar el juego Trine 2 comprado en GOG.
Se instala gog_trine_2_complete_story_2.0.0.5.sh ejecutando como root en
/opt.
Al ejecutar el programa llegamos al siguiente error:
$ export LD_LIBRARY_PATH="/opt/GOG Games/Trine 2 Complete Story/game/lib/lib32"
$ "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"
-bash: /opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit: No such file or directory
Revisando el archivo:
$ file "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"
/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 3.2.32, BuildID[sha1]=35c6e71eb1d64dc34c2177bd7c0fc89b7fd0c065, not stripped
$ ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"
not a dynamic executable
encontramos que es un ejecutable de 32 bits y para ejecutarlo en debian debemos agregar la arquitectura de 32 bits utilizando Multiarch. Para esto se siguen los pasos descriptos en la wiki de debian:
$ sudo dpkg --add-architecture i386
$ sudo apt-get update
$ sudo apt-get install -V libc6:i386
Ahora ya podemos ver que librerías están faltando:
$ export LD_LIBRARY_PATH="/opt/GOG Games/Trine 2 Complete Story/game/lib/lib32"
$ { ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"; \
ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_32bit"; \
} | sed -n 's/\s*\([^ ]*\) => not found/\1/p' | LC_ALL=C sort -u | tee /tmp/libs
libGL.so.1
libGLU.so.1
libX11.so.6
libasound.so.2
libatk-1.0.so.0
libdbus-1.so.3
libexpat.so.1
libfontconfig.so.1
libfreetype.so.6
libgdk-x11-2.0.so.0
libgdk_pixbuf-2.0.so.0
libgio-2.0.so.0
libglib-2.0.so.0
libgobject-2.0.so.0
libgthread-2.0.so.0
libgtk-x11-2.0.so.0
libopenal.so.1
libpango-1.0.so.0
libpangoft2-1.0.so.0
libpng12.so.0
libstdc++.so.6
libuuid.so.1
libvorbisfile.so.3
libz.so.1
Para buscar los paquetes que contienen los archivos anteriores se utiliza el
comando apt-file (del paquete apt-file):
$ sudo apt-file update
$ for i in $(cat /tmp/libs); do apt-file search -a i386 -x $i'$'; done | tee /tmp/packages
Y aquí hay que hacer una elección manual, ya que revisando los primeros resultados se encuentra que varios paquetes instalan una misma librería:
$ head /tmp/packages
libgl1: /usr/lib/i386-linux-gnu/libGL.so.1
libgl1-nvidia-legacy-340xx-glx: /usr/lib/i386-linux-gnu/nvidia/legacy-340xx/libGL.so.1
libgl1-nvidia-legacy-390xx-glx: /usr/lib/i386-linux-gnu/nvidia/legacy-390xx/libGL.so.1
libgl1-nvidia-tesla-418-glx: /usr/lib/i386-linux-gnu/nvidia/tesla-418/libGL.so.1
primus-libs: /usr/lib/i386-linux-gnu/primus/libGL.so.1
libglu1-mesa: /usr/lib/i386-linux-gnu/libGLU.so.1
libx11-6: /usr/lib/i386-linux-gnu/libX11.so.6
nxagent: /usr/lib/i386-linux-gnu/nx/X11/libX11.so.6
libasound2: /usr/lib/i386-linux-gnu/libasound.so.2
libatk1.0-0: /usr/lib/i386-linux-gnu/libatk-1.0.so.0
En el caso anterior, la librería libGL.so.1 y libX11.so.6 es instalada por
varios paquetes.
Lo que se hará a continuación es editar manualmente el archivo anterior,
eliminando la linea con los paquetes que no se desea instalar. En el ejemplo
anterior, se desea instalar libGL.so.1 del paquete libgl1, por lo que se
borran las lineas correspondientes a los paquetes
libgl1-nvidia-legacy-340xx-glx, libgl1-nvidia-legacy-390xx-glx,
libgl1-nvidia-tesla-418-glx y primus-libs. Esto se hace hasta dejar un
solo paquete por librería.
Luego de editar el archivo nos queda:
$ cat /tmp/packages
libgl1: /usr/lib/i386-linux-gnu/libGL.so.1
libglu1-mesa: /usr/lib/i386-linux-gnu/libGLU.so.1
libx11-6: /usr/lib/i386-linux-gnu/libX11.so.6
libasound2: /usr/lib/i386-linux-gnu/libasound.so.2
libatk1.0-0: /usr/lib/i386-linux-gnu/libatk-1.0.so.0
libdbus-1-3: /lib/i386-linux-gnu/libdbus-1.so.3
libexpat1: /lib/i386-linux-gnu/libexpat.so.1
libfontconfig1: /usr/lib/i386-linux-gnu/libfontconfig.so.1
libfreetype6: /usr/lib/i386-linux-gnu/libfreetype.so.6
libgtk2.0-0: /usr/lib/i386-linux-gnu/libgdk-x11-2.0.so.0
libgdk-pixbuf-2.0-0: /usr/lib/i386-linux-gnu/libgdk_pixbuf-2.0.so.0
libglib2.0-0: /usr/lib/i386-linux-gnu/libgio-2.0.so.0
libglib2.0-0: /usr/lib/i386-linux-gnu/libglib-2.0.so.0
libglib2.0-0: /usr/lib/i386-linux-gnu/libgobject-2.0.so.0
libglib2.0-0: /usr/lib/i386-linux-gnu/libgthread-2.0.so.0
libgtk2.0-0: /usr/lib/i386-linux-gnu/libgtk-x11-2.0.so.0
libopenal1: /usr/lib/i386-linux-gnu/libopenal.so.1
libpango-1.0-0: /usr/lib/i386-linux-gnu/libpango-1.0.so.0
libpangoft2-1.0-0: /usr/lib/i386-linux-gnu/libpangoft2-1.0.so.0
libuuid1: /usr/lib/i386-linux-gnu/libuuid.so.1
libvorbisfile3: /usr/lib/i386-linux-gnu/libvorbisfile.so.3
zlib1g: /lib/i386-linux-gnu/libz.so.1
Ahora pasamos a instalar los paquetes para la arquitectura i386:
$ sudo apt-get install -V $(sed 's/^\([^:]*\):.*$/\1:i386/' /tmp/packages | LC_ALL=C sort -u)
A pesar de lo anterior, ejecutando el programa obtenemos el siguiente mensaje:
$ "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"
/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit: error while loading shared libraries: libpng12.so.0: cannot open shared object file: No such file or directory
Esto es, hubo archivo que apt-file no encontró, pero tampoco nos avisó de
ello. Volviendo a ver las librerías faltantes:
$ { ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"; \
ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_32bit"; \
} | sed -n 's/\s*\([^ ]*\) => not found/\1/p' | LC_ALL=C sort -u | tee /tmp/libs
libpng12.so.0
En el caso de libpng12, la versión utilizada por debian actualmente es
libpng16. Buscando por nombre de paquetes en la web de debian,
https://packages.debian.org/search?keywords=libpng12, encontramos que el
paquete corresponde a libpng12-0 de debian jessie.
Siguiendo links, se descarga el paquete de la web:
- https://packages.debian.org/jessie/libpng12-0
- https://packages.debian.org/jessie/i386/libpng12-0/download
- http://ftp.us.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u3_i386.deb
$ wget 'http://ftp.us.debian.org/debian/pool/main/libp/libpng/libpng12-0_1.2.50-2+deb8u3_i386.deb'
Aquí revisamos:
- Si el paquete contiene efectivamente el archivo
libpng12.so.0 - Las dependencias del paquete, para asegurarnos de que la librería pueda ser utilizada sin problemas o si es necesario descargar más paquetes:
$ dpkg -c libpng12-0_1.2.50-2+deb8u3_i386.deb | grep libpng12.so
-rw-r--r-- root/root 177984 2017-01-07 00:23 ./lib/i386-linux-gnu/libpng12.so.0.50.0
lrwxrwxrwx root/root 0 2017-01-07 00:23 ./lib/i386-linux-gnu/libpng12.so.0 -> libpng12.so.0.50.0
lrwxrwxrwx root/root 0 2017-01-07 00:23 ./usr/lib/i386-linux-gnu/libpng12.so.0 -> /lib/i386-linux-gnu/libpng12.so.0
$ dpkg -I libpng12-0_1.2.50-2+deb8u3_i386.deb | grep Depends:
Pre-Depends: multiarch-support
Depends: libc6 (>= 2.11), zlib1g (>= 1:1.1.4)
De lo anterior podemos obtener la librería del paquete.
Ya que es un paquete correspondiente a una versión vieja de debian, no se
instalará en el sistema con dpkg, sinó que se copiará la librería en el
directorio de librerías del juego,
"/opt/GOG Games/Trine 2 Complete Story/game/lib/lib32/":
$ dpkg -x libpng12-0_1.2.50-2+deb8u3_i386.deb /tmp/libpng12-0
$ sudo cp /tmp/libpng12-0/lib/i386-linux-gnu/libpng12.so.* "/opt/GOG Games/Trine 2 Complete Story/game/lib/lib32/"
Corroboramos que se encuentren todas las librerías de 32bits que utilizan los binarios del juego:
$ { ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"; \
ldd "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_32bit"; \
} | grep "not found"
y vemos que no hay coincidencias.
Volvemos a ejecutar el binario y esta vez si ya tenemos andando el juego:
$ export LD_LIBRARY_PATH="/opt/GOG Games/Trine 2 Complete Story/game/lib/lib32"
$ "/opt/GOG Games/Trine 2 Complete Story/game/bin/trine2_linux_launcher_32bit"