Résolution de problèmes de lancement de vieux jeux Linux sur des distributions récentes
Les jeux ont des dépendances: Donc certains jeux 32 bits dépendent de librairies 32 bits. Il est impératif de les installer pour pouvoir jouer à ces jeux.
Il n'est pas rare qu'en lançant un ancien jeu de GOG, HumbleBundle ou itch.io le jeu se plaigne de librairies manquantes (.so) sur les distributions récentes, car les développeurs n'ont pas révisé et recompilé leurs jeux en prenant en compte l'évolution des systèmes d'exploitation. Erreur typique:
./start.sh Running Hyper Light Drifter ./HyperLightDrifter.x86: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
Ce que le jeu est en train de vous dire, c'est qu'il a besoin de la librairie libcrypto.so.1.0.0
. Or cette dernière a totalement disparu des distributions Debian et dérivées récentes (Ubuntu, Linux Mint, etc.).
C'est pour cela que je vous propose cette ligne pour installer un bon nombre de librairies qui satisferont la majorité des jeux 32 bits.
sudo apt install libc6:i386 libasound2:i386 libasound2-data:i386 libasound2-plugins:i386 libstdc++6:i386 libx11-6:i386 libxau6:i386 libxcb1:i386 libxcursor1:i386 libxdmcp6:i386 libxext6:i386 libxfixes3:i386 libxinerama1:i386 libxrandr2:i386 libxrender1:i386 libglu1:i386 libcurl3:i386 libgtk2.0-0:i386 libopenal1:i386 libxtst6:i386 libssl1.0.0:i386 libnss3:i386 libgconf-2-4:i386
:386
signifique que c'est la version 32 bits de la librairie qu'ont veut installer. Les jeux qui se plaignent de librairie manquant ne vous indiqueront pas s'il veulent la 32 ou 64 bits (cela dépend de l'exécutable du jeu ; voir plus loin dans cette page).
Le soucis est que d'une version d'une distribution à l'autre, certains de ces paquets disparaissent des dépôts officiels et ne sont donc plus installables. (Donc à vous de retirer de cette ligne les paquets qui n'existent plus dans votre distribution.)
Il existe un moyen de résoudre ce problème de dépendance à des librairies et paquets qui n'existent plus. Mais c'est un petit jeu d'enquête. Nous prendrons pour exemple ci-dessous le jeu HyperLight Drifter et 2x0ng mais cette méthode peut s'appliquer à d'autres jeux et logiciels.
Exemple avec HyperLight Drifter
Nous allons prendre ici l'exemple d'HyperLight Drifter sous Ubuntu 20.04.
On va prendre l'installeur de chez GOG, gog_hyper_light_drifter_2.6.0.7.sh
. Il s'agit d'un jeu 32 bits.
Après installation, dans le répertoire du jeu, vous verrez un fichier deps.txt
: Les développeurs ont gentiment indiqué les dépendances à installer.
libc6:i386 libasound2:i386 libasound2-data:i386 libasound2-plugins:i386 libcurl3:i386 libgtk2.0-0:i386 libopenal1:i386 libglu1:i386
Donc un petit apt install
et le problème est réglé ? Malheureusement non: Le paquet libcurl3:i386 ne semble plus exister dans les dépôts d'Ubuntu 20.04.
>sudo apt install libcurl3:i386 E: Le paquet « libcurl3:i386 » n'a pas de version susceptible d'être installée
Installez tout de même les autres paquets:
sudo apt install libc6:i386 libasound2:i386 libasound2-data:i386 libasound2-plugins:i386 libgtk2.0-0:i386 libopenal1:i386 libglu1:i386
Essayons de lancer le jeu:
./start.sh Running Hyper Light Drifter ./HyperLightDrifter.x86: error while loading shared libraries: libcrypto.so.1.0.0: cannot open shared object file: No such file or directory
Cherchons s'il n'y aurait pas un autre paquet dans les dépôts de notre distribution qui aurait ce fichier.
- Pour cela on va installer apt-file:
sudo apt install apt-file sudo apt-file update
- et on recherche le fichier:
>apt-file search libcrypto.so.1.0.0 nsight-compute: /usr/lib/nsight-compute/host/linux-desktop-glibc_2_11_3-x64/libcrypto.so.1.0.0 nsight-systems: /usr/lib/nsight-systems/Host-x86_64/libcrypto.so.1.0.0
- Il existe donc deux paquets possédant ce fichier. On essaie d'installer un de ces deux paquets en 32 bits ? Manque de bol, ces paquets n'existent qu'en 64 bits.
>apt download nsight-systems:i386 E: Impossible de trouver le paquet nsight-systems:i386 >apt download nsight-compute:i386 E: Impossible de trouver le paquet nsight-compute:i386
- Raté. Il va donc falloir trouver ailleurs cette librairie en version 32 bits.
- On va donc essayer de trouver notre fichier en 32 dans les dépôts Debian.
- On va dans la Recherche dans le contenu des paquets chez Debian: https://www.debian.org/distrib/packages#search_contents
- On entre:
- Le nom du fichier:
libcrypto.so.1.0.0
- On sélectionne les paquets contenant un fichier de ce nom
- Dans Architecture:, on sélectionne PC 32 bits (i386)
- Cliquez sur "Rechercher".
- Aucun résultat ? Vous êtes en train de chercher dans la version "Buster" de Debian. Essayez de rechercher dans les anciens Debian: Cliquez sur stretch. Aucun résultat ? Essayez jessie.
- Gagné ! Le paquet existe dans jessie: https://packages.debian.org/search?suite=jessie&arch=i386&mode=exactfilename&searchon=contents&keywords=libcrypto.so.1.0.0
- Cliquez donc sur le paquet qui nous intéresse, libssl1.0.0: https://packages.debian.org/jessie/libssl1.0.0
- Descendez en bas de la page, et cliquez sur i386: https://packages.debian.org/jessie/i386/libssl1.0.0/download
- Cliquez maintenant sur un des liens proposés pour télécharger le fichier.
- Nous avons donc récupéré le fichier libssl1.0.0_1.0.1t-1+deb8u12_i386.deb
- Décompressez ce fichier: clic droit > Extraire ici
- Copiez tout ce qui se trouve dans le répertoire
libssl1.0.0_1.0.1t-1+deb8u12_i386/usr/lib/i386-linux-gnu
dans le répertoire du jeu. - Maintenant essayez de lancer le jeu en lui indiquant de prendre en priorité les librairies dans le répertoire courant:
LD_LIBRARY_PATH=$(pwd) ./start.sh Running Hyper Light Drifter ./HyperLightDrifter.x86: /lib/i386-linux-gnu/libcurl.so.4: version `CURL_OPENSSL_3' not found (required by ./HyperLightDrifter.x86)
Visiblement, on a réglé le problème de la libcrypto.so.1.0.0, mais il lui manque maintenant autre chose.
Le message d'erreur n'est pas forcément très explicite mais là libcurl.so.4
est en train de vous parler. Ce qui veut dire que le jeu a démarré en utilisant libcurl4. On sait que le jeu nécessite libcurl3. On va donc aller récupérer aussi de force libcurl.so.3.
Même méthode de recherche, on trouve le paquet https://packages.debian.org/stretch/libcurl3 et on télécharge sa version i386. On décompresse et on copie tous les fichiers de libcurl3_7.52.1-5+deb9u12_i386/usr/lib/i386-linux-gnu
dans le répertoire du jeu également.
On relance le jeu:
LD_LIBRARY_PATH=$(pwd) ./start.sh Running Hyper Light Drifter ./HyperLightDrifter.x86: error while loading shared libraries: libssh2.so.1: cannot open shared object file: No such file or directory
Problème de libcurl3 résolu ! Mais oui, il veut encore une autre lib. Oui, c'est encore à vous d'aller la chercher à la main.
Continuez ainsi pour chaque librairie manquante. Oui, c'est long, c'est chiant. En fait vous êtes en train de faire à la main la résolution des dépendances comme le fait habituellement le gestionnaire de paquets de votre distribution.
Pour HyperLight Drifter, on sera allé télécharger à la main les fichiers suivants:
- libcurl3_7.52.1-5+deb9u12_i386.deb
- libssh2-1_1.8.0-2.1_i386.deb
- libssl1.0.0_1.0.1t-1+deb8u12_i386.deb
- libssl1.0.2_1.0.2u-1~deb9u2_i386.deb
On démarre maintenant le jeu:
LD_LIBRARY_PATH=$(pwd) ./start.sh Running Hyper Light Drifter *************************************** * YoYo Games Linux Runner V1.3 * *************************************** CommandLine: -game game.unx ...
Miracle, il fonctionne !
Exemple avec 2x0ng
(Site web: https://dto.itch.io/2x0ng)
- On test le type d'exécutable avec
file
:>file 2x0ng.bin 2x0ng.bin: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=34c013f6e5dea38e51e9813049919387ebe7d266, with debug_info, not stripped
- C'est un 32 bits (Intel 80386).
- On essaie de lancer le jeu:
debugger invoked on a SIMPLE-ERROR in thread #<THREAD "main thread" RUNNING {C618C71}>: Error opening shared object "libSDL-1.2.so.0": libSDL-1.2.so.0: Ne peut ouvrir le fichier d'objet partagé: Aucun fichier ou dossier de ce type.
- Il manque donc libSDL-1.2.so.0, en 32 bits.
- On recherche si ça existe dans les dépôts:
>apt-file search libSDL-1.2.so.0 libsdl1.2debian: /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0 libsdl1.2debian: /usr/lib/x86_64-linux-gnu/libSDL-1.2.so.0.11.4
- Parfait, on aura pas besoin d'aller chercher ces fichiers chez Debian: ils existent dans les dépôts de notre distribution. On a juste à installer le paquet qui manque:
sudo apt install libsdl1.2debian:i386
- Ensuite il se plaint qu'il manque libSDL_gfx.so. apt-file nous dit que c'est dans le paquet libsdl-gfx1.2-dev, donc:
sudo apt install libsdl-gfx1.2-dev:i386
- (et là, il va télécharger et installer automatiquement les dépendances, heureusement pour nous.)
- Il manque encore libSDL_mixer.so. Encore une fois apt-file nous dit que c'est dans le paquet libsdl-mixer1.2-dev:
sudo apt install libsdl-mixer1.2-dev:i386
- Il manque libSDL_ttf-2.0.so.0:
sudo apt install libsdl-ttf2.0-0:i386
- Il manque libSDL_image-1.2.so.0:
sudo apt install libsdl-image1.2:i386
- Et c'est bon !
Pour résumer, pour ce jeu on pourra se contenter de ce qu'il y a dans les dépôts d'Ubuntu 20.04:
sudo apt install libsdl1.2debian:i386 libsdl-gfx1.2-dev:i386 libsdl-mixer1.2-dev:i386 libsdl-ttf2.0-0:i386 libsdl-image1.2:i386
Testé avec succès avec:
Cette méthode de recherche des packages manquants a été appliquée avec succès sur des jeux qui ne voulaient pas démarrer:
- HyperLight Drifter (32 bits, source:GOG)
- Devil Daggers (64 bits, source:GOG)
- 2x0ng (32 bits, source:itch.io)