2009-01-15 8 views
4

Donc. J'ai un problème où j'ai deux versions de GCC sur une machine.
3.4.6 et 4.1Liaison statique à une bibliothèque dynamique. glibc

Ceci est dû à certains problèmes de dépendance avec un nouveau logiciel. (nécessite glibc 4.1)

Quand je vais lier ce nouveau logiciel avec les librairies 4.1, il est très bien relié. Cependant, quand il s'agit d'exécuter le logiciel, il ne peut pas trouver la bibliothèque, car il regarde 3.4.6 dans mon LD_LIBRARY_PATH. Si je place LD_LIBRARY_PATH dans la librairie 4.1, cela fait exploser le shell, parmi d'autres choses, parce que les librairies 3.4.6 sont utilisées pour cela.

Son un peu d'une prise 22.

Est-il possible au temps du lien que je peux donner un chemin absolu à cette bibliothèque partagée sans utiliser le LD_LIBRARY_PATH?

De cette façon, j'espère avoir les deux versions, mais seulement utiliser 4.1 pour cette application spécifique?

+0

AFAIK il n'y a pas une telle chose, mais les programmes exigeant glibc dans une version antérieure ne devrait accepter jamais la version aussi, car il est rétrocompatible. –

+0

version 4.0 casse la rétrocompatibilité, je crois. – Alex

Répondre

7

Vous voulez dire un chemin absolu qui est utilisé lorsque le programme est démarré et qui est privilégié lors de la recherche de bibliothèques? rpath est exactement cela. Il remplacera le chemin de recherche par défaut et les éléments définis dans LD_LIBRARY_PATH. Il suffit de dire gcc pour le transférer à l'éditeur de liens:

g++ -Wl,-rpath,/usr/lib/my_4.1 -omy_binary *.cpp 

Vous pouvez le faire vous montrer le traitement de recherche (utiliser help pour le faire vous donner plus d'options):

[[email protected] cpp]$ LD_DEBUG=libs ./a.out 
    5859:  find library=libc.so.6 [0]; searching 
    5859:  search path=/usr/lib/my_4.1/tls/i686/sse2:/usr/lib/my_4.1/tls/i686: 
       /usr/lib/my_4.1/tls/sse2:/usr/lib/my_4.1/tls: 
       /usr/lib/my_4.1/i686/sse2:/usr/lib/my_4.1/i686: 
       /usr/lib/my_4.1/sse2:/usr/lib/my_4.1 (RPATH from file ./a.out) 
    5859:  trying file=/usr/lib/my_4.1/tls/i686/sse2/libc.so.6 
    5859:  .... 
    5859:  search cache=/etc/ld.so.cache 
    5859:  trying file=/lib/libc.so.6 (note: found here!) 
    5859: 
1

pas vraiment une réponse à votre question, mais une solution de rechange:

vous devriez être en mesure de résoudre vos problèmes en ajoutant votre nouveau chemin de lib à /etc/ld.so.conf et en cours d'exécution ldconfig en tant que root.

0

Vous ne pouvez pas définir LD_LIBRARY_PATH juste pour l'application qui en a besoin? I.e. au lieu de le mettre à l'échelle mondiale comme une variable exportée, exécutez votre programme

LD_LIBRARY_PATH =/path/to/4.1/libs my_executabel

?

-k