L'éditeur de liens dynamique recherche en fait plusieurs endroits pour trouver chaque bibliothèque dynamique. Ceux-ci incluent (de man ld.so):
- Chemins donnés par la variable d'environnement
LD_LIBRARY_PATH
- Les chemins intégrés au binaire chargent la bibliothèque sous le
DT_RUNPATH
entrée - Le fichier cache /etc/ld.so.cache
- /lib et /usr/lib
Si vous souhaitez obtenir le chemin d'une bibliothèque partagée spécifique, je vous recommande le dladdr
fonction. À partir de la page de manuel :
La fonction dladdr() prend un pointeur de fonction et essaie de résoudre le nom et le fichier où il se trouve. Les informations sont stockées dans le
Dl_info
structure :typedef struct { const char *dli_fname; /* Pathname of shared object that contains address */ void *dli_fbase; /* Address at which shared object is loaded */ const char *dli_sname; /* Name of nearest symbol with address lower than addr */ void *dli_saddr; /* Exact address of symbol named in dli_sname */ } Dl_info;
Si aucune adresse de correspondance de symbole n'a pu être trouvée, alors
dli_sname
etdli_saddr
sont définis surNULL
.
dladdr()
renvoie 0 en cas d'erreur et différent de zéro en cas de succès.
Donc, vous lui donnez simplement un pointeur de fonction, et il vous donnera le nom du fichier qui le fournit et un tas d'autres informations. Ainsi, par exemple, vous pouvez avoir un constructeur dans une bibliothèque qui appelle cela sur lui-même pour connaître le chemin complet de la bibliothèque :
#define _GNU_SOURCE
#include <dlfcn.h>
#include <stdio.h>
__attribute__((constructor))
void on_load(void) {
Dl_info dl_info;
dladdr((void *)on_load, &dl_info);
fprintf(stderr, "module %s loaded\n", dl_info.dli_fname);
}
Cette fonction fonctionne également sur OS X avec la même sémantique.