Trouver un répertoire dans le chemin de recherche de bibliothèque partagée
-
26-09-2019 - |
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.
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()
- Lisez chaque nom de fichier (
- Utilisez
closedir()
- Ouvrez le sous-répertoire concerné (
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)
.