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"