Question

Je veux dlopen () chaque bibliothèque partagée dans un répertoire spécifique. Pour ce faire,
ce qui est le plus propre moyen de récupérer le chemin de recherche de bibliothèque linux. Ou est-il un moyen plus rapide de trouver un répertoire spécifique dans ce chemin?
posix serait mieux.

Était-ce utile?

La solution

Posix ne supporte pas un mécanisme pour trouver les répertoires sur le chemin de recherche de bibliothèque partagée (elle ne rend pas obligatoire LD_LIBRARY_PATH, par exemple), de sorte que toute solution est par nature quelque peu plate-forme spécifique.

Linux présente quelques problèmes parce que les valeurs à utiliser pourrait être basé sur le contenu de /etc/ld.so.conf ainsi que toute valeur d'exécution dans la variable d'environnement LD_LIBRARY_PATH; d'autres systèmes posent des problèmes comparables. Les emplacements par défaut varient également selon le système - avec /lib et /usr/lib étant d'habitude pour les machines Linux 32 bits, mais /lib64 et /usr/lib64 utilisé sur au moins certaines machines 64 bits. Cependant, d'autres plates-formes utilisent d'autres emplacements pour les logiciels 64 bits. Par exemple, Solaris utilise /lib/sparcv9 et /usr/lib/sparcv9, par exemple (bien que les documents mentionnent /lib/64 et /usr/lib/64, ils sont des liens symboliques aux répertoires de sparcv9). Solaris a également des variables d'environnement LD_LIBRARY_PATH_64 et LD_LIBRARY_PATH_32. HP-UX et AIX utilisent traditionnellement d'autres variables que LD_LIBRARY_PATH - SHLIB_PATH et LIBPATH, IIRC - bien que je crois AIX utilise maintenant LD_LIBRARY_PATH aussi. Et, sur Solaris, l'outil de configuration de bibliothèques partagées est « crle » (exécution de configuration de l'environnement de liaison) et l'analogue de /etc/ld.so.conf est soit /var/ld/ld.config ou /var/ld/64/ld.config. En outre, bien sûr, les extensions sur les bibliothèques partagées varie (.so, .sl, .dylib, .bundle, etc).

Alors, votre solution sera spécifique à la plateforme. Vous devrez décider sur les emplacements par défaut, les variables d'environnement à lire, et le fichier de configuration à lire, et l'extension de fichier concerné. Compte tenu de ceux-ci, il est principalement une SMOP - simple question de programmation:

  • Pour chaque répertoire nommé par l'une des sources:
    • Ouvrez le sous-répertoire concerné (opendir())
      • Lisez chaque nom de fichier (readdir()) à son tour
      • Utilisez dlopen() sur le chemin des fichiers concernés.
      • Faites ce que l'analyse est pertinente pour vous.
      • Utilisez dlclose()
    • Utilisez closedir()

Voir aussi les notes dans le commentaire ci-dessous ... le sujet complet est légèrement lourd avec des variations de la plate-forme à plate-forme.

Autres conseils

Je ne suis pas sûr qu'il est possible de le faire et être portables. Étant donné que cette question est à propos de Linux, la portabilité peut ne pas être d'une importance capitale. Alors je ne comprends pas la contrainte POSIX. Pourriez-vous préciser?

Vous aurez probablement soit mettre en œuvre la fonctionnalité de recherche détaillée dans man 8 ld.so, qui comprend /etc/ld.so.conf de balayage en plus de LD_LIBRARY_PATH, ou faire /lib/ld.so faire ce que vous voulez pour vous et analyser la sortie. Une ligne de commande non-exactement assez pour cela pourrait être:

export LD_PRELOAD=THISLIBRARYSODOESNOTEXIST
strace -s 4096 /bin/true 2>&1 | sed -n 's/^open("\([^"]*\)\/THISLIBRARYSODOESNOTEXIST".*$/\1\/YOURSUBDIRHERE/gp'
unset LD_PRELOAD

Vous pouvez ensuite énumérer les fichiers avec les appels Posix opendir(3) et readdir(3).

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