web-dev-qa-db-fra.com

La bibliothèque partagée ne se charge pas. Chargement uniquement sous la racine

J'ai un exécutable qui nécessite une bibliothèque partagée qui réside dans le dossier /opt/.... J'ai inclus le chemin dans LD_LIBRARY_PATH sous /etc/environment et je l'ai mis à jour à l'aide de source /etc/environment. Lorsque j'exécute cet exécutable sans les autorisations root, j'obtiens une erreur disant libxxx.so: cannot open shared object file: No such file or directory. Mais quand je le lance avec Sudo, il s'exécute. Bien que le problème soit, la licence n'est pas sous l'utilisateur root, elle génère donc une erreur concernant la licence. J'ai changé l'autorisation pour /opt/... afin que l'utilisateur normal puisse créer et supprimer des fichiers. Bien que cela n'aide pas. Quel est le problème et comment puis-je résoudre ce problème?

3
user592748

/etc/environment est interprété lors de la connexion. La manière correcte de voir les modifications que vous avez apportées à /etc/environment consiste à vous déconnecter et à vous reconnecter.

Sudo fonctionne car il émule partiellement le login en tant que root (Sudo -i émule le login encore plus précisément).

source /etc/environment ne fonctionnera pas, car source est une commande Shell qui demande au Shell d'interpréter le fichier donné en tant que script Shell. Le problème est le suivant: /etc/environment n'est pas un script shell. C'est une liste de variables d'environnement paires nom-valeur au format:

name="value"

Cette ligne, pour un shell, correspond à la définition d'une variable globale , visible uniquement par Shell. Les programmes exécutés à partir du shell ne peuvent pas le voir. La manière correcte de définir une variable d'environnement consiste à utiliser la commande export Shell:

export name="value"

Donc, si vous voulez vraiment utiliser votre tout nouveau LD_LIBRARY_PATH sans vous déconnecter, vous devez exécuter la commande suivante au lieu de source /etc/environment:

export LD_LIBRARY_PATH="/opt/..."

UPDATE: LD_LIBRARY_PATH ne peut pas être défini dans /etc/environment à cause de ssh-agent. Pour plus de détails, voir bug n ° 47958 et la page wiki d'Ubuntu sur variables d'environnement . Comme spécifié dans la page wiki, une solution de contournement existe et consiste à utiliser /etc/ld.so.conf.d.

Par exemple, vous pouvez créer /etc/ld.so.conf.d/opt.conf avec le contenu suivant:

# Paths for my cool libraries
/opt/...

Bien que cela soit répertorié en tant que solution de contournement, ld.so.conf.d est en réalité l'endroit le plus approprié pour de tels paramètres.

3