Sommaire
Bonjour à tous,
Suite à la sortie de l'humble indie bundle 12, qui permet de disposer de 7 jeux natifs mais privateurs sous linux pour un prix de votre choix, je me suis retrouvé devant un problème que je partage avec vous. Attention gourou linux, tu peux passer ton chemin, ceci est un journal/tutoriel débutant…
Un des jeux inclus, SteamWorld Dig, nécessite la glibc 2.15 (dans les prérequis, il n'était indiqué que ubuntu 12.04). Pas de chance, suite à ma vie de famille prenante, je n'ai jamais eu le temps de changer ma distribution depuis qu'elle est morte maintenue par la communauté. Or, la version de la glibc incluse est la 2.13.
Les solutions possibles
Changer de distribution pourrait résoudre mon problème, mais cela me prendrait pas mal de temps pour reconfigurer mon environnement. Mettre à jour la glibc de ma machine me semble à première vue une mauvaise idée d'un point de vue "risque de régression". Utiliser des containers (type LXC) ou un chroot me semblaient à priori des solutions fonctionnelles, mais me donnaient l'impression de prendre une masse pour tuer une mouche.
Au final, la solution que j'ai retenue a été de compiler et déployer la glibc en local, puis de jouer avec l'ordre de chargement des bibliothèques partagées. Pour ceux que cela intéresse (en fait surtout moi, la prochaine où cela m'arrivera), voila la démarche à suivre.
Compilation de la glibc
Allez, je me dis, rien de plus facile, il suffit de télécharger une archive sur un miroir, un coup de configure
/make
/make install
et c'est fini. En cela a été un peu plus compliqué.
Tout d'abord, je récupère l'archive, c'est facile et trouvable aisément ici.
En plus, y a la version 2.20 qui est toute fraîche. Un tar xzvf
plus tard, je me retrouve avec un beau répertoire glibc-2.20 tout neuf.
Lançons configure
pour voir ce que cela donne :
[tilk:~/Download/glibc-2.20] $ configure
(...)
configure: error: you must configure in a separate build directory
Il faut donc créer un répertoire de build séparé pour y lancer la compilation :
[tilk:~/Download/glibc-2.20] $ mkdir ../build-glibc-2.20
[tilk:~/Download/glibc-2.20] $ cd ../build-glibc-2.20
[tilk:~/Download/build-glibc-2.20] $ ../glibc-2.20/configure
(...)
configure: error:
*** LD_LIBRARY_PATH shouldn't contain the current directory when
*** building glibc. Please change the environment variable
*** and run configure again.
[tilk:~/Download/build-glibc-2.20] $ echo $LD_LIBRARY_PATH
/usr/local/qt/lib:
configure
n'aime pas le :
final du LD_LIBRARY_PATH. J'en profite pour rajouter les options pour lui dire d'installer ce qu'il faut dans le répertoire de mon user --prefix=/home/tilk/glibc-2.20
, et de compiler en 32 bits sur mon environnement 64 bits (merci google et stackoverflow) CC="gcc -m32" CXX="g++ -m32" CFLAGS="-O2 -march=i686" CXXFLAGS="-O2 -march=i686" i686-linux-gnu
:
[tilk:~/Download/build-glibc-2.20] $ LD_LIBRARY_PATH=/usr/local/qt/lib
[tilk:~/Download/build-glibc-2.20] $ ../glibc-2.20/configure --prefix=/home/tilk/glibc-2.20 CC="gcc -m32" CXX="g++ -m32" CFLAGS="-O2 -march=i686" CXXFLAGS="-O2 -march=i686" i686-linux-gnu
(...)
config.status: creating config.make
config.status: creating Makefile
config.status: creating config.h
config.status: executing default commands
Roh, tout fonctionne enfin à merveille. On enchaîne avec la compilation et l'installation qui eux aussi se passent bien, mais durent bien 10 bonnes minutes…
[tilk:~/Download/build-glibc-2.20] $ make
(...)
[tilk:~/Download/build-glibc-2.20] $ make install
(...)make[1]: Leaving directory `/home/manu/Download/glibc-2.20'
Utiliser la nouvelle glibc
Mon premier réflexe a été de rajouter le répertoire /home/tilk/glibc-2.20/lib
dans la variable d'environnement LD_LIBRARY_PATH
et de lancer l'exécutable tel quel. Pas de bol c'est un mauvais réflexe pour la glibc.
[tilk:.../SteamWorldDig] $ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/tilk/glibc-2.20/lib
[tilk:.../SteamWorldDig] $ ./SteamWorldDig
./SteamWorldDig: relocation error: /home/manu/lib/lib/libc.so.6: symbol _dl_find_dso_for_object, version GLIBC_PRIVATE not defined in file ld-linux.so.2 with link time reference
A priori, mon shell lors de l'exécution, va appeler le ld-linux.so
de ma distribution pour charger les bibliothèques partagées. Pas de bol, celui-ci a été construit avec la version 2.13 de la glibc et n'aime pas être lié avec la version 2.20.
La solution la plus simple que j'ai trouvée et donc d'appeler directement le ld-linux.so qui a été buildé avec la glibc.
[tilk:.../SteamWorldDig] $ ~/glibc-2.20/lib/ld-linux.so.2 ./SteamWorldDig
./SteamWorldDig: error while loading shared libraries: libopenal.so.1: cannot open shared object file: No such file or directory
Mais il faut lui passer manuellement la liste des répertoires susceptibles de contenir des bibliothèques partagées. Il l'ordre est important. Dans mon cas, il faut obligatoirement passé en premier le répertoire où est installé mon driver propriétaire nvidia, sinon, j'ai des problèmes lors de l'utilisation de openGL.
[tilk:.../SteamWorldDig] $ /home/manu/lib/lib/ld-linux.so.2 --library-path /usr/lib/nvidia-current:/usr/local/qt/lib:/home/manu/lib/lib/:/usr/lib:/lib ./SteamWorldDig
(Une belle fenêtre qui s'ouvre !)
Y a plus qu'à faire une bel alias dans mon profile shell pour pouvoir lancer n'importe quel exécutable avec cette version up-to-date de la glibc.
Conclusion
Après un peu plus d'une heure de tâtonnement, je suis enfin arrivé à faire cohabiter deux versions de la glibc, et de pouvoir choisir aisément de lancer un exécutable avec la nouvelle version.
Sachant que je n'ai pas trouvé de tutoral sur le net pour ceci faire, j'en ai donc fait un journal pour pouvoir m'en rappeler la prochaine fois. Je suppose aussi que cela pourrait intéresser d'autres lecteurs de DLFP.
Et pour ne pas déroger aux traditions, voila la nimage.
# Ça fait peur...
Posté par Maclag . Évalué à 10.
Vu de ma fenêtre, un jeu proprio, ça devrait être compilé en statique, non?
Parce que là tu as un problème de distro ancienne et tu vas chercher une version plus récente de Glibc. Ok.
Supposons que 3 ans plus tard, tu as changé de distro, tu veux lancer le jeu, mais ô malheur, la dernière version de biblio-qui-tue_2.4 ne garde pas la compatibilité ascendante avec biblio-qui-tue_1.9, et ça ne marche plus.
Ah! En plus ils ont viré les sources de la 1.9.
Ben voilà, tu ne peux plus jouer à ton jeu qu'il était pourtant trop bien!
PS: Y'a encore des mises à jour de sécu sur Mandriva 11 où tu te trimballes toutes les failles trouvées ces 3 dernières années?
[^] # Commentaire supprimé
Posté par Anonyme . Évalué à 2.
Ce commentaire a été supprimé par l’équipe de modération.
[^] # Re: Ça fait peur...
Posté par SChauveau . Évalué à 6.
La glibc fat partie des libs bien écrites qui essayent de conserver la compatibilité ascendante. Même les changements d'API sont sensés être correctement supportés grâce aux versions de symboles. Par exemple, dans ma version de la libc, le symbole regexec existe en 2 versions GLIBC_2.2.5 et GLIBC_2.3.4.
Cela signifie que même les vieux programmes utilisant regexec et compilés avec une glic entre 2.2.5 et 2.3.3 fonctionnent encore après le changement d'API.
[^] # Re: Ça fait peur...
Posté par TilK . Évalué à 4.
Sauf les bibliothèques LGPL, car ce n'est pas légal. Et c'est le cas de la glibc.
Après, trouver des bibliothèques standard C qui fonctionnent sous linux, et qui te permettent d'être lié statiquement à un programme propriétaire, j'en connais pas des tonnes. Wipipédia donne newlib, musl libc (plutôt pour de l'embarqué) et Bionic mais cette dernière est très liée à Android.
La glibc essaie de garantir la compatibilité descendante.
Il y a eu des mises à jour officielles jusqu'à mi-2013 je dirais. Le reste est mis à jour "à la main" :)
[^] # Re: Ça fait peur...
Posté par Nicolas Boulay (site web personnel) . Évalué à 2.
C'est plus complexe que ça. La LGPL stipule explicitement que tu ne peux pas la compilé statiquement, car elle doit être remplaçable. C'est chiant mais c'est pour éviter une appropriation de la lib.
La GPL interdit d'être utilisé par un soft propriétaire, si c'est un "produit dérivé". Dans le cas, ou une autre lib permet de faire fonctionner le programme, la dépendance saute (le driver Nvidia n'a pas besoin d'être gpl car il est aussi utilisé par windows).
Dans le cas des lib system, la gpl stipule que faisant parti du système, la licence ne s'applique pas. Dans le cas de lib runtime gcc, il y a une clause qui autorise spécifiquement à être lié à n'importe quel code du moment que les interfaces soient respectés (c'est souvent plus simple que la LGPL).
"La première sécurité est la liberté"
# docker ?
Posté par palm123 (site web personnel) . Évalué à 6.
et prendre un OS avec la version voulue de la glibc, et y configurer/lancer ton jeu ?
Un exemple de Dockerfile qui fait tourner le programme winbox du router Mikrotik RouterOS
https://github.com/zanardo/docker-winbox/blob/master/Dockerfile
ウィズコロナ
[^] # Re: docker ?
Posté par Anonyme . Évalué à 3.
Je plussoie. Les chroot sont une solution simple et efficace pour pallier ces problèmes.
En plus, de cette manière, on est sûr d’avoir toutes les autres libs liées à la glibc voulue y tout y tout.
[^] # Re: docker ?
Posté par claudex . Évalué à 2.
Il trouvais les conteneurs LXC trop gros pour ça, alors Docker, qui est une surcouche à LXC, n'en parlons pas.
« Rappelez-vous toujours que si la Gestapo avait les moyens de vous faire parler, les politiciens ont, eux, les moyens de vous faire taire. » Coluche
[^] # Re: docker ?
Posté par dest . Évalué à 4.
Sauf erreur, Docker n'est plus une surcouche de LXC mais se substitue à LXC.
# Tu as oublié de rebooter
Posté par Joris Dedieu (site web personnel) . Évalué à 2.
https://linuxfr.org/sondages/faut-il-rebooter-apr%C3%A9s-avoir-d%C3%A9sinstall%C3%A9-la-glibc
# Gone Home
Posté par reynum (site web personnel) . Évalué à 2.
Une petite question hors sujet :
As tu essayé de faire fonctionner le jeu Gone Home ? et si oui as t il fonctionné ?
Parce que chez moi il se lance mais freeze au bout de quelques secondes et avant de freezer (genre il faut le kill en mode console) il m'est impossible d'utiliser les touches de mouvement (la sourie, esc, et autres fonctionnent).
Du coup j'ai ouvert un ticket chez Humble Bundle mais je voudrais savoir si je suis un cas isolé ou pas ;-)
kentoc'h mervel eget bezan saotred
[^] # Re: Gone Home
Posté par TilK . Évalué à 2.
Pour gone home (très bon "jeu"), j'ai également eu un problème de souris et de mouvement.
J'ai trouvé des infos sur le forum de steam.
En gros, il faut le lancer en mode fenêtré pour régler les problèmes de souris, et changer la variable d'environnement LANG avant de le lancer pour les problèmes de bindings des touches de déplacement :
LANG=en_US
[^] # Re: Gone Home
Posté par reynum (site web personnel) . Évalué à 2.
Merci ça fonctionne.
Il faut jouer en mode fenêtre mais c'est pas trop grave.
kentoc'h mervel eget bezan saotred
[^] # Re: Gone Home
Posté par Maclag . Évalué à 3.
Heureusement que c'est du "paye ce que tu veux", parce que sinon ça me rappelle furieusement les bidouilles de mémoire paginée et étendue des années 80.
[^] # Re: Gone Home
Posté par groumly . Évalué à -4.
Et ouais mec, linux est trop pret pour le desktop, windows et macos peuvent aller se rhabiller!!
Linuxfr, le portail francais du logiciel libre et du neo nazisme.
[^] # Re: Gone Home
Posté par reynum (site web personnel) . Évalué à 10.
Ba ouai je suis d'accord, c'est horrible à dire mais à chaque fois que les développeurs d'un programme privateur font mal leur boulo c'est de la faute de Gnome/Xfce/Kde/Lxde/Cinnamon/Mate/… mais dans quel monde vivons nous ? :-D
kentoc'h mervel eget bezan saotred
[^] # Re: Gone Home
Posté par groumly . Évalué à 2.
Clair. manquerait plus que les libs système servent a aider les developeurs a écrire du soft.
Linuxfr, le portail francais du logiciel libre et du neo nazisme.
# garnome/jhbuild
Posté par modr123 . Évalué à -1.
c'est le prog qui permettait de lancer/compiler une version de gnome en locale
voila le script pour le lancer
# Modules
Posté par MarbolanGos (site web personnel) . Évalué à 6.
Pour faire coexister des versions différentes, il existe Modules. C'est beaucoup utilisé en HPC pour pouvoir charger divers environnements spécifiques. En particulier quand la glibc du système est trop vieille et qu'on ne peut pas la mettre à jour et que certains en ont besoin.
[^] # Re: Modules
Posté par Albert_ . Évalué à 2.
C'est absolument genial ce systeme, je ne peux que conseiller.
# Bug report
Posté par devnewton 🍺 (site web personnel) . Évalué à 1. Dernière modification le 15 septembre 2014 à 14:18.
Avant de chercher à bidouiller, tu peux sans doute faire un rapport de bug aux développeurs. S'ils ne sont pas trop idiots, ils corrigeront le problème.
Enfin quoique… C'est indie bundle, les releases mal torchées et pas testées, c'est leur spécialité depuis quelques temps.
Le post ci-dessus est une grosse connerie, ne le lisez pas sérieusement.
[^] # Re: Bug report
Posté par dinomasque . Évalué à 8.
Il n'y a pas de problème, seulement un acheteur qui a un OS trop vieux par rapport à ce qui est supporté par le jeu.
BeOS le faisait il y a 20 ans !
[^] # Re: Bug report
Posté par reynum (site web personnel) . Évalué à 2.
C'est faux !
Même si ça arrive c'est relativement rare tout de même.
De plus les bug reports sont pris en compte, souvent un peu tard certes, mais les jeux buggés reçoivent les updates qui vont bien un jour ou l'autre ;-).
kentoc'h mervel eget bezan saotred
[^] # Re: Bug report
Posté par devnewton 🍺 (site web personnel) . Évalué à 1.
C'est vrai!
J'ai acheté 3 bundles: le premier tout marchait bien, avec le deuxième certains jeux n'étaient jouables que sous Windows et avec le dernier plusieurs jeux ne se lancent même pas sous Windows, donc même pas l'excuse de l'OS de hippies pas prêt pour le bureau…
Si c'était libre, je ne me plaindrais pas, je ferais un patch, mais là je ne vois de raison de se comporter autrement qu'en consommateur intolérant aux produits pas finis.
Le post ci-dessus est une grosse connerie, ne le lisez pas sérieusement.
[^] # Re: Bug report
Posté par reynum (site web personnel) . Évalué à 2.
Halala si on peut même plus utiliser les vieux trucs de grand mère où va t on ? :-D
Normalement la plateforme supportée est indiquée
As tu fais des bugs reports ? si oui y a t il eu des versions corrigées ?
C'est la seule chose à faire, mais demander à ce qu'un produit qu'on achète soit fini et fonctionnel c'est normal (sauf pour les Windowsien).
Il y en a même qui poussent le vice pour demander une qualité irréprochable sur des produits qu'on te donne, … ;-)
Par simple curiosité te souviens tu des fameux jeux qui fonctionnais pas ?
kentoc'h mervel eget bezan saotred
[^] # Re: Bug report
Posté par devnewton 🍺 (site web personnel) . Évalué à 1. Dernière modification le 17 septembre 2014 à 09:13.
J'avais demandé pour Brutal Legend, mais je n'ai pas eu de réponse. De toute façon, il y avait juste une popup cryptique et pas de logs.
Pour Trine, on m'avait juste dit d'utiliser Steam… Ça marchait en effet, mais comme le jeu n'était pas mon genre de platformer et que je ne suis pas fan de ce système, j'ai vite abandonné.
Je me suis déjà battu pour faire des releases pour Windows, ce n'est pas facile du tout. On parle beaucoup des problèmes de versions de glibc, mais msvcrt, c'est pas non plus un cadeau.
Le post ci-dessus est une grosse connerie, ne le lisez pas sérieusement.
[^] # Re: Bug report
Posté par reynum (site web personnel) . Évalué à 2.
Trine 1 et 2 ont fonctionnés du premier coup et n'ont jamais plantés chez moi (je n'ai jamais utilisé le client steam).
Je ne l'ai pas encore essayé mais il a l'air sympa.
kentoc'h mervel eget bezan saotred
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.