Ignorer LD_LIBRARY_PATH et le bâton avec bibliothèque donnée par -rpath au moment de la liaison

StackOverflow https://stackoverflow.com/questions/2408172

  •  18-09-2019
  •  | 
  •  

Question

Je suis assis dans un environnement que je n'ai pas de contrôle réel sur (il est pas seulement moi, donc en gros, je ne peux pas changer l'environnement ou il ne fonctionnera pas pour quelqu'un d'autre), la seule chose que je peux affecter est comment le binaire est construit.

Mon problème est, l'environnement spécifie un LD_LIBRARY_PATH contenant un libstdc ++ qui est pas compatible avec le compilateur utilisé. J'ai essayé de compiler de manière statique, mais cela ne semble pas possible pour g ++ (version 4.2.3, semble avoir été le travail fait dans ce sens dans les versions ultérieures mais qui ne sont pas disponibles, -static-libstdc ++ ou quelque chose comme ça).

Maintenant, je suis arrivé à l'aide rpath pour cuire le nom de chemin absolu dans le fichier exécutable (fonctionnerait, toutes les machines, il est censé fonctionner sur sont identiques). Malheureusement, il semble que LD_LIBRARY_PATH a la priorité sur rpath (remise à zéro LD_LIBRARY_PATH a confirmé qu'il est en mesure de trouver la bibliothèque, mais comme indiqué plus haut, LD_LIBRARY_PATH sera fixé pour tout le monde, et je ne peux pas changer cela).

Est-il possible que je peux faire rpath la priorité sur LD_LIBRARY_PATH, ou qu'il ya d'autres solutions possibles à mon problème? Notez que je parle de liaison dynamique à l'exécution, je suis en mesure de contrôler la ligne de commande à la compilation et le temps lien.

Merci.

Était-ce utile?

La solution

Liaison contre libstdc++.a est sans aucun doute possible, bien que difficile. Instructions .

Je suis un peu sceptique de votre affirmation selon laquelle LD_LIBRARY_PATH a la priorité sur le « cuit dans » DT_RPATH bien - au moins sur Linux et (je crois) Solaris, LD_LIBRARY_PATH ne se regarde après DT_RPATH recherche a échoué

Autres conseils

Peut-être que vous pouvez utiliser un wrapper shell qui modifie l'environnement pour tout ce programme?

#!/bin/sh

LD_LIBRARY_PATH="/path/to/your/lib:${LD_LIBRARY_PATH}"
export LD_LIBRARY_PATH
exec /path/to/binary $@

Cela devrait surcharger le LD_LIBRARY_PATH avant l'exécution, puis remplacer l'emballage avec votre binaire via exec.

Est-ce que cette aide?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top