Journal Faire coexister plusieurs versions de la Glibc

Posté par . Licence CC by-sa
30
14
sept.
2014

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.
nimage

  • # Ça fait peur...

    Posté par . É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?

    • [^] # Re: Ça fait peur...

      Posté par (page perso) . Évalué à 2.

      Vu de ma fenêtre, un jeu proprio, ça devrait être compilé en statique, non?

      Seulement si licence le permet. Et pour le glibc, impossible de mettre la main dessus. Tout au plus, j'arrive a avoir une série de licences (car glibc emprunte pas mal de code par-ci par-là)

      Bon, glibc, c'est la lib standard C du projet GNU. Je ne serai donc pas étonné que ce soit une LGPL.

      • [^] # Re: Ça fait peur...

        Posté par . É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.

        $ objdump -T /lib/x86_64-linux-gnu/libc.so.6 | grep regexec
        0000000000138790 g    DF .text  0000000000000009 (GLIBC_2.2.5) regexec
        00000000000e46c0 g    DF .text  000000000000013b  GLIBC_2.3.4 regexec
        

        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 . Évalué à 4.

      Vu de ma fenêtre, un jeu proprio, ça devrait être compilé en statique, non?

      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.

      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.

      La glibc essaie de garantir la compatibilité descendante.

      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 ?

      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 . Évalué à 2.

        "Sauf les bibliothèques LGPL, car ce n'est pas légal. "

        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 (page perso) . É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

    If you choose open source because you don't have to pay, but depend on it anyway, you're part of the problem.evloper) February 17, 2014

    • [^] # Re: docker ?

      Posté par (page perso) . É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.

      Love – bépo

    • [^] # Re: docker ?

      Posté par (page perso) . É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 . Évalué à 4.

        Sauf erreur, Docker n'est plus une surcouche de LXC mais se substitue à LXC.

  • # Tu as oublié de rebooter

    Posté par (page perso) . Évalué à 2.

  • # Gone Home

    Posté par . É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 . É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 . É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 . Évalué à 3.

          Il faut jouer en mode fenêtre mais c'est pas trop grave.

          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 . É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 . É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 . É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 . Évalué à -1.

    c'est le prog qui permettait de lancer/compiler une version de gnome en locale

    !/bin/sh

     GARNOME=$HOME/garnome
     PATH=$GARNOME/bin:$GARNOME/sbin:$PATH
     LD_LIBRARY_PATH=$GARNOME/lib:$LD_LIBRARY_PATH
     PYTHONPATH=$GARNOME/lib/python2.4/site-packages
     PKG_CONFIG_PATH=$GARNOME/lib/pkgconfig:/usr/lib/pkgconfig
     XDG_DATA_DIRS=$GARNOME/share
     XDG_CONFIG_DIRS=$GARNOME/etc/xdg
     GDK_USE_XFT=1
     export PATH LD_LIBRARY_PATH PYTHONPATH PKG_CONFIG_PATH GDK_USE_XFT XDG_DATA_DIRS XDG_CONFIG_DIRS
     exec $GARNOME/bin/gnome-session
    

    voila le script pour le lancer

  • # Modules

    Posté par (page perso) . É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 . Évalué à 2.

      C'est absolument genial ce systeme, je ne peux que conseiller.

  • # Bug report

    Posté par (page perso) . Évalué à 1. Dernière modification le 15/09/14 à 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.

    http://devnewton.bci.im

    • [^] # Re: Bug report

      Posté par . É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 15 ans !

    • [^] # Re: Bug report

      Posté par . Évalué à 2.

      C'est indie bundle, les releases mal torchées et pas testées, c'est leur spécialité depuis quelques temps.

      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 (page perso) . Évalué à 1.

        C'est faux !

        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.

        http://devnewton.bci.im

        • [^] # Re: Bug report

          Posté par . Évalué à 2.

          donc même pas l'excuse de l'OS de hippies pas prêt pour le bureau…

          Halala si on peut même plus utiliser les vieux trucs de grand mère où va t on ? :-D

          certains jeux n'étaient jouables que sous Windows

          Normalement la plateforme supportée est indiquée

          plusieurs jeux ne se lancent même pas sous Windows

          As tu fais des bugs reports ? si oui y a t il eu des versions corrigées ?

          mais là je ne vois de raison de se comporter autrement qu'en consommateur intolérant aux produits pas finis.

          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 (page perso) . Évalué à 1. Dernière modification le 17/09/14 à 09:13.

            As tu fais des bugs reports ? si oui y a t il eu des versions corrigées ?

            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é.

            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).

            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.

            http://devnewton.bci.im

            • [^] # Re: Bug report

              Posté par . Évalué à 2.

              Pour Trine, on m'avait juste dit d'utiliser Steam

              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).

              J'avais demandé pour Brutal Legend

              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 à ceux qui les ont postés. Nous n'en sommes pas responsables.