#1 Le 19/10/2007, à 10:55
- vilnius
glibc différents sur la machine de compilation et d'exécut
Bonjour à tous.
Je developpe un code en C++. Je le compile sur une machine sous feisty et je l'execute sur une serveur de calcul sous redhat.
La version de glibc sur la feisty est la 2.5
La version de glibc sur la redhat est la 2.3.4
Notez que je n'ai aucun droit administrateur sur ce serveur, je ne peux donc pas y mettre à jour la version de glibc.
Quand j'execute mon code sur le serveur de calcul j'obtient le message d'erreur suivant :
./elfe_3d: /lib/i686/libc.so.6: version `GLIBC_2.4' not found (required by ./elfe_3d)
Curieusement lorque je compilais le même code sous edgy (version de glibc 2.3.6) tout fonctionnait parfaitement sur le serveur de calcul.
Ma question est la suivante:
y-a-t-il une option particulière à passer à g++ pour que les choses se passent mieux?
Merci.
Dernière modification par vilnius (Le 19/10/2007, à 10:56)
Hors ligne
#2 Le 19/10/2007, à 19:03
- Link31
Re : glibc différents sur la machine de compilation et d'exécut
Ah, ça risque de ne pas être facile. Enfin, essaie toujours ça :
- crée un dossier lib dans ton répertoire personnel sur le serveur
- mets-y les fichiers suivants provenant de la machine de compilation :
ld-*.so
ld-linux.so.2 -> ld-*.so
libc-*.so
libcrypt-*.so
libcrypt.so.1 -> libcrypt-*.so
libc.so.6 -> libc-*.so
libdl-*.so
libdl.so.2 -> libdl-*.so
libm-*.so
libm.so.6 -> libm-*.so
libnss_compat-*.so
libnss_compat.so.2 -> libnss_compat-*.so
libnss_dns-*.so
libnss_dns.so.2 -> libnss_dns-*.so
libnss_files-*.so
libnss_files.so.2 -> libnss_files-*.so
libnss_hesiod-*.so
libnss_hesiod.so.2 -> libnss_hesiod-*.so
libnss_nis-*.so
libnss_nisplus-*.so
libnss_nisplus.so.2 -> libnss_nisplus-*.so
libnss_nis.so.2 -> libnss_nis-*.so
libresolv-*.so
libresolv.so.2 -> libresolv-*.so
Les * indiquent le numéro de version (normalement le même pour chaque fichier, probablement 2.5), et les -> indiquent que le premier élément est un lien symbolique du second (ln -s second_fichier premier_fichier).
Si certains fichiers ne sont pas présents, alors ignore-les, mais ça ne devrait pas arriver (cette liste provient d'un paquet Debian).
- lance la commande suivante sur le serveur (il faudra la relancer à chaque session) :
export LD_LIBRARY_PATH=lib
Il est possible que cette commande aboutisse à planter toutes les commandes que tu lanceras par la suite, dans ce cas il y a un problème. Pour que tout redevienne normal, il suffit de te reconnecter au serveur.
- vérifie que les dépendances sont bien comme il faut (c'est-à-dire dans ton dossier lib) avec :
ldd elfe_3d
- et enfin essaie de lancer ton programme :
./elfe_3d
S'il y a des problèmes avec la libstdc++, ça risque d'être bien plus compliqué...
Dernière modification par Link31 (Le 19/10/2007, à 19:07)
Hors ligne
#3 Le 22/10/2007, à 12:16
- vilnius
Re : glibc différents sur la machine de compilation et d'exécut
Merci pour ta réponse. Je viens d'essayer ça. Mais non, ça ne fonctionne pas. Je ne suis pas très au courant du fontionnement des librairies donc je ne comprends pas trop ce qui se passe.
Par ailleurs quand je fais un ldd (sur le serveur de calcul) j'ai la sortie suivante :
machine d'execution% ldd elfe_3d
not a dynamic executable
Quand je tape la même commande sur la machine de compilation j'ai :
machine de compilation% ldd elfe_3d
linux-gate.so.1 => (0xffffe000)
libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0xb7f57000)
libm.so.6 => /lib/tls/i686/cmov/libm.so.6 (0xb7f30000)
libc.so.6 => /lib/tls/i686/cmov/libc.so.6 (0xb7dee000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7de2000)
/lib/ld-linux.so.2 (0xb7fad000)
Dernière modification par vilnius (Le 22/10/2007, à 12:32)
Hors ligne
#4 Le 22/10/2007, à 17:43
- Link31
Re : glibc différents sur la machine de compilation et d'exécut
machine d'execution% ldd elfe_3d not a dynamic executable
Tu es sûr que c'est le même exécutable ? Parce qu'il semble compilé statiquement sur le serveur et dynamiquement chez toi.
Est-ce que tu obtiens ce résultat avant la commande export LD_LIBRARY_PATH=lib ou après ? Essaie l'autre solution pour voir.
Hors ligne
#5 Le 23/10/2007, à 12:37
- vilnius
Re : glibc différents sur la machine de compilation et d'exécut
Salut.
Oui, c'est bien le même exécutable et ça fait ça avant et après avoir tapé export LD_LIBRARY_PATH=lib.
En revanche, et c'est assez curieux, j'ai essayé de faire la même chose sous bash (habituellement je suis sous zsh) et là ça fonctionne:
[lamcosp318 ~]$ ldd elfe_3d
linux-gate.so.1 => (0xffffe000)
libstdc++-libc6.2-2.so.3 => /usr/lib/libstdc++-libc6.2-2.so.3 (0xf7f96000)
libm.so.6 => /home/jrannou/lib/libm.so.6 (0xf7f70000)
libc.so.6 => /home/jrannou/lib/libc.so.6 (0xf7e44000)
libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00af6000)
/lib/ld-linux.so.2 (0x0095d000)
Par contre ça plante tout de suite. J'ai une segmentation fault dès le début. Et ça, je ne sais pas d'où ça peut venir ce coup-ci.
Hors ligne
#6 Le 23/10/2007, à 18:37
- Link31
Re : glibc différents sur la machine de compilation et d'exécut
Ça vient probablement de l'une des bibliothèques hôtes qui ne supporte pas la nouvelle version de Glibc.
Le lien ~/lib/ld-linux.so est bien présent ? Ainsi que le fichier qu'il pointe ? La première chose à faire serait de voir si tu peux forcer ton programme à utiliser le nouveau ld-linux.so.
Sinon, je ne vois pas d'autre solution que le chroot complet, c'est-à-dire récupérer également les dépendances de libstdc++ et libgcc_s.so.1 et les placer comme il faut dans un dossier ~/lib ou ~/usr/lib, et faire des liens symboliques dans ton dossier personnel vers les programmes et bibliothèques hôtes essentiels.
Ça sera probablement plus facile de trouver une distribution ou un PC avec la bonne version de Glibc pour compiler ton programme. Bon courage quand même.
Hors ligne
#7 Le 23/10/2007, à 20:48
- vilnius
Re : glibc différents sur la machine de compilation et d'exécut
Oui, le lien ~/lib/ld-linux.so est présent et pointe comme il faut. Je vais tenter ce que tu me suggère et après on verra.
Merci de ton aide en tout cas.
Hors ligne