Est-il correct d’utiliser DYLD_LIBRARY_PATH sur Mac OS X? Et, quel est l’algorithme de recherche de bibliothèque dynamic avec elle?

J’ai lu quelques articles décourageant l’utilisation de DYLD_LIBRARY_PATH, car le chemin de la bibliothèque dynamic devrait être corrigé en utilisant -install_name, @rpath et @loader_path.

En termes de création d’un programme qui s’exécute à la fois sous Linux et Mac OS X, DYLD_LIBRARY_PATH de Mac OS X fait exactement ce que LD_LIBRARY_PATH de Linux. Et, nous pouvons partager (presque) le même fichier make qui n’a pas le nom -install_name et @rpath.

  • Est-ce correct d’utiliser DYLD_LIBRARY_PATH sur Mac OS X?
  • Quel est l’algorithme de recherche de bibliothèque dynamic avec Mac OS X lorsque le fichier binary ne trouve pas la bibliothèque dynamic? répertoire courant -> répertoires DYLD_LIBRARY_PATH …?

Comme vous l’avez noté, DYLD_LIBRARY_PATH se comporte comme LD_LIBRARY_PATH sur d’autres * nix. Toutefois, il existe une autre variable d’environnement appelée DYLD_FALLBACK_LIBRARY_PATH .

En général, ils sont (à la fois sur osx et linux) suggérés uniquement pour une utilisation en développement car ils peuvent provoquer des erreurs de recherche de symboles lorsque vous remplacez une bibliothèque qui n’a pas la même table de symboles. Un bon exemple est lorsque vous tentez de remplacer l’installation par défaut de VecLib (par exemple, blas lapack) par une installation personnalisée. Cela provoquera des erreurs de symbole introuvable dans les applications liées au système VecLib si DYLD_LIBRARY_PATH est défini et l’inverse (erreurs de recherche de symboles dans les applications personnalisées) si ce n’est pas le cas. Cela est dû au fait que blas / lapack du système n’est pas une implémentation complète des bibliothèques ATLAS.

DYLD_FALLBACK_LIBRARY_PATH ne produira pas ces problèmes.

Lorsque vous installez des bibliothèques dans un emplacement non standard, DYLD_FALLBACK_LIBRARY_PATH est beaucoup plus sain. Cela recherchera les symboles dans les bibliothèques fournies dans les chemins par défaut et si le symbole n’y est pas trouvé, revenez au chemin spécifié.

L’avantage est que ce processus ne provoque pas d’erreurs de recherche de symboles dans les applications compilées avec les bibliothèques par défaut.

En général, lorsque des bibliothèques sont installées sur des emplacements non standard, des chemins absolus doivent être spécifiés, ce qui élimine l’ambiguïté de la recherche dynamic.

DYLD_LIBRARY_PATH ne se comporte pas comme LD_LIBRARY_PATH . La documentation OS X dlopen ( https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man3/dlopen.3.html ) spécifie que lorsqu’elle fournit un chemin absolu, elle examinera d’abord les emplacements spécifié par DYLD_LIBRARY_PATH :

Lorsque le chemin contient une barre oblique mais n’est pas un chemin de structure (c.-à-d. Un chemin complet ou un chemin partiel vers un dylib), dlopen () recherche ce qui suit jusqu’à trouver un fichier Mach-O compatible: $ DYLD_LIBRARY_PATH , puis le chemin fourni (en utilisant le répertoire de travail actuel pour les chemins relatifs), puis $ DYLD_FALLBACK_LIBRARY_PATH (avec le nom de la feuille du chemin).

En d’autres termes, si vous définissez DYLD_LIBRARY_PATH sur /Hello , les deux appels dlopen suivants:

 dlopen("/Hello/libfoo.so", RTLD_NOW); dlopen("/World/libfoo.so", RTLD_NOW); 

seront tous deux résolus en /Hello/libfoo.so . Ceci est plutôt contre-intuitif et représente une vulnérabilité de sécurité. Le logiciel utilisant dlopen n’a aucun moyen de garantir qu’il charge les bonnes bibliothèques (peut-être redéfinir DYLD_LIBRARY_PATH dans son propre environnement?)

Pour la documentation sur les variables d’environnement de l’éditeur de liens dynamics et sur la manière dont elles affectent la recherche de bibliothèques dynamics, man dyld .

DYLD_LIBRARY_PATH

Il s’agit d’une liste de répertoires contenant des bibliothèques, séparés par des deux-points. L’éditeur de liens dynamic recherche ces répertoires avant de rechercher les emplacements par défaut des bibliothèques. Il vous permet de tester de nouvelles versions de bibliothèques existantes.

Pour chaque bibliothèque utilisée par un programme, l’éditeur de liens dynamic le recherche dans chaque répertoire de DYLD_LIBRARY_PATH. S’il ne trouve toujours pas la bibliothèque, il recherche ensuite DYLD_FALLBACK_FRAMEWORK_PATH et DYLD_FALLBACK_LIBRARY_PATH.

Utilisez l’option -L pour otool (1). pour découvrir les frameworks et bibliothèques partagées auxquels l’exécutable est lié.

DYLD_FALLBACK_LIBRARY_PATH

Il s’agit d’une liste de répertoires contenant des bibliothèques, séparés par des deux-points. Il est utilisé comme emplacement par défaut pour les bibliothèques introuvables dans leur chemin d’installation. Par défaut, il est défini sur $ (HOME) / lib: / usr / local / lib: / lib: / usr / lib.

DYLD_VERSIONED_LIBRARY_PATH

Il s’agit d’une liste de répertoires, séparés par des deux-points, contenant des bibliothèques de substitution potentielles. L’éditeur de liens dynamics recherche dans ces répertoires les bibliothèques dynamics. Pour chaque bibliothèque trouvée, dyld examine son LC_ID_DYLIB et obtient la version actuelle et le nom d’installation. Dyld cherche alors la bibliothèque au chemin du nom d’installation. Quelle que soit la plus grande valeur current_version sera utilisée dans le processus chaque fois qu’un dylib avec ce nom d’installation est requirejs. Ceci est similaire à DYLD_LIBRARY_PATH sauf qu’au lieu de toujours remplacer, il ne remplace que si la bibliothèque fournie est plus récente.