c'est fait mais cela ne change rien
Ton probleme est certainement lie a l'utilisation de bibliotheque partagees. Essaie d'ajouter -static a tes options de compilation pour voir si ca arrange les choses.
ta solution fonctionne et je t'en remrcie. Cependant elle n'est pas apllicable dans mon contexte ; mes sources génèrent des exécutables utilisés par une application utilisée sur des serveurs en production. L'utilisation des librairies statiques alourdie énormément mes exécutables puisque leur taille est multipliée par 100. Il me faut donc pouvoir utiliser les librairies dynamiques.
C'est de la folie, sur le principe; imagine tu as redhat4, tu évolues vers redhat 5 ( red hat est une distribution commerciale) et tu ne peux plus compiler pour tes clients qui ont des versions antérieures. C'est commercialement invivable pour red hat.
Il chargent certainement plusieurs versions d'une meme bibliotheque pour maintenir une compatibilite. Je ne connais pas CentOS, et j'ignore s'ils garantissent que l'ABI est compatible avec RHEL4 et 5. Tu peux utiliser ldd sur tes exec pour voir les bibliotheques partagees qui sont utilisees, leur path et leur adresse. Il est alors peut etre possible de jouer avec LD_LIBRARY_PATH pour pointer vers la version correcte.
Comment puis je changer la variable LD_LIBRAIRY_PATH ??
Salut,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/chemin_vers_lib:/autre_chemin_vers_lib
centos est la version libre de red hat qui est exactement pareil que redhat; redhat4=centos4,
redhat5=centos5.
le problème ne vient pas de ld_library_path car après plusieurs tests, je constate que pour certains utilisateurs, j'ai LD_LIBRARY_PATH=$SQLDIR/lib et d'autres n'ont pas cette variable.
ce répertoire et son contenu est identique sur les deux seveurs.
de plus lorsque je compile ma source contenant seulement return 0, cela ne fonctionne pas si elle a été compilée sur red hat 5 alors que cela fonctionne si elle a été compilée sur ubuntu 8.04
lorsque je vais sur ma machine red hat4 avec un programme issue de la suivante :
Si je fais un ldd sur la machine red hat4 du programme compilé pour chaque environement de compilation, j'ai les résultats suivants :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 int main(int argc, char *argv[]) { return(0); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ldd testredhat4.e libc.so.6 => /lib/tls/libc.so.6 (0x00a4a000) /lib/ld-linux.so.2 (0x00a31000)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 ldd testubuntu.e libc.so.6 => /lib/tls/libc.so.6 (0x00a4a000) /lib/ld-linux.so.2 (0x00a31000)Les trois programmes correspondent à la même source mais ont été compilé sur des machines différentes ;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 ldd testcentos5.e /usr/bin/ldd: line 124: 3077 Exception en point flottant LD_TRACE_LOADED_OBJECTS=1 LD_WARN= LD_BIND_NOW= LD_LIBRARY_VERSION=$verify_out LD_VERBOSE= "$@"
/lib/tls/libc.so.6 est-il présent sur la machine générant l'erreur?libc.so.6 => /lib/tls/libc.so.6 (0x00a4a000)
la machine qui génère l'erreur (Redhat4EL) possède bien le fichier /lib/tls/libc.so.6
Ok,
peux-tu nous montrer les packages liés à glibc sur chacun de tes environnements? RHEL4,RHEL5 et ubuntu.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 rpm -qa | grep -i glibc
voici le résultat de cette commande pour centos5 :
Pour RedHat4EL :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 rpm -qa|grep glibc glibc-2.5-24 glibc-devel-2.5-24 compat-glibc-headers-2.3.4-2.26 glibc-headers-2.5-24 compat-glibc-2.3.4-2.26 glibc-common-2.5-24
Pour Ubuntu : je n'ai pas trouvé de paquet glibc mais il semblerais que soit la version 2.7
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 glibc-2.3.4-2 glibc-devel-2.3.4-2 glibc-common-2.3.4-2 glibc-headers-2.3.4-2 glibc-kernheaders-2.4-9.1.87
Code : Sélectionner tout - Visualiser dans une fenêtre à part /lib/tls/i686/cmov/libc.so.6 -> libc-2.7.so
aparament il faudrait faire de la cross compilation ; quelqu'un y connait quelque chose avec gcc?
Personne n'à une idée svp?
Alors la les kids vous me décevez ; personne trouve alors je répond à cette grande question :
Le nouveau compilateur gcc a changé le format des exécutables ; il compile par défaut avec l'option --ash-style=gnu .Cela entraîne de meilleures performances mais une incompatibilité avec les anciennes version de gcc. Le problème apparaît à partir de la version 4.1 et on peut le résoudre afin d'assurer la rétro compatibilité de la manière suivante :
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part gcc -Wl,--hash-style=both $source.c -o $executable
Merci à tout ceux qui se sont penchés sur ce problème
Code : Sélectionner tout - Visualiser dans une fenêtre à part gcc -Wl,--hash-style=sysv $source.c -o $executable
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager