Journal glibc 2.0

Posté par  (site web personnel) .
Étiquettes :
0
1
fév.
2004
Bonjour,

Depuis quelques mois, j'utilise une debian (sid, pour être précis), basée sur la glibc 2.2
Cependant, je cherche à faire fonctionner un exécutable dont je ne possède que le binaire (du propriétaire close-source, je sais c'est mal..), qui a été compilé pour la glibc 2.0

Comment faire? Peut-on installer deux versions de la glibc en parallèle?
Voilà ce qu'il me dit:

/opt/logiciels/maple8/bin.IBM_INTEL_LINUX/mserver: relocation error: /opt/logiciels/maple8/bin.IBM_INTEL_LINUX/libmaple.so: symbol errno, version GLIBC_2.0 not defined in file libc.so.6 with link time reference

J'ai bien trouvé ça:
http://www.pafoo.net/uninstallglibc/uninstglibc-1.html(...)
mais je ne crois pas que ça va m'aider ;)

Auriez-vous une idée?
  • # Re: glibc 2.0

    Posté par  (site web personnel) . Évalué à 1.

    > Peut-on installer deux versions de la glibc en parallèle?

    Oui c'est tout a fait possible, apres le linkage se fait en fonction du nom du fichier de la librairie tout simplement. Par exemple beaucoup de distribs proposent GTK1 et GTK2 en meme temps. De meme quand on est passe de la libc5 (pour le vieux netscape 4 par exemple) a la libc6.

    libmaple.se cherche le symbole GLIBC_2.0 dans le fichier /lib/libc.so.6 (qui est un lien symbolique vers /lib/libc-2.X.X.so), donc je pense qu'un simple lien symbolique (ln -s) avec un renommage n'est pas suffisant (dans le code source du programme il doit y avoir un appel explicite de la constante GLIBC_2.0 qui n'existe pas ici).

    Essaye de trouver des packages tout fait pour ta distrib. Ou alors au pire de prendre un package d'une ancienne version de ta distrib, ca serait deja mieux que de bidouiller/compiler un truc a la main. Fait gaffe quand tu touches a la libc parceque tu peux bousiller ta distrib. tout depend de cette librairie de base donc si elle marche plus ba tu peux plus faire grand chose.
    • [^] # Re: glibc 2.0

      Posté par  (site web personnel) . Évalué à 2.

      Juste une petite correction... pour l'exactitude.

      Le programme ne tente pas d'acceder a un symbole GLIBC_2.0. En fait il tente d'acceder au symbole errno (la variable qui contient le numero de la derniere erreur générée) version GLIBC_2.0.

      En effet, les librairies ELF permettent de définir des symboles versionnés. C'est à dire qu'on peut avoir une fonction foo() version VERSION1 et une autre VERSION2, les deux différents par leur ABI. Le linker fait sa petite affaire ensuite au moment de la relocation de l'executable+libs. C'est une feature qui meme si je la connais me reste totalement inconue dans la pratique et je ne connais guere que la glibc qui l'utilise.

      Dans la glibc, les versions permettent par exemple de distinguer errno sous forme de variable (pas thread safe) de errno() qui retourne le code d'erreur correctement pour chaque thread. Les détails je les connais pas mais cette ruse de sioux fonctionne :-)

      Par contre j'ai aucune solution propre sauf l'installation de la libc correspondante qq part (disons ${vieille_libc}) et de lancer le programme avec:
      LD_PRELOAD=${vieille_libc}/libc.so.5(<-- version de la glibc 2.0 iirc) maple

      Mais je garantis pas le resultat du tout, d'autres libs chargées par maple pouvant peut etre avoir besoin, elles, d'une glibc plus recente.
      • [^] # Re: glibc 2.0

        Posté par  (site web personnel) . Évalué à 1.

        Ouais, c'est ce que je me disais aussi: va falloir installer les deux versions en parallèle.

        Mais j'espérait un truc du genre: lib virtuelle qui utilise l'autre derrière, un adaptateur, quoi...
        Dommage que ça n'existe pas...
  • # Re: glibc 2.0

    Posté par  (site web personnel) . Évalué à 2.

    telecharge et utilise maxima à la place.
    Ca ne devrait pas trop te depayser.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.