Il linker dinamico in realtà cerca in diversi posti per trovare ogni libreria dinamica. Questi includono (da man ld.so):
- Percorsi forniti dalla variabile d'ambiente
LD_LIBRARY_PATH
- I percorsi inseriti nel binario caricano la libreria sotto il
DT_RUNPATH
ingresso - Il file cache /etc/ld.so.cache
- /lib e /usr/lib
Se vuoi ottenere il percorso per una libreria condivisa specifica, ti consiglio dladdr
funzione. Dalla pagina man:
La funzione dladdr() prende un puntatore a funzione e tenta di risolvere il nome e il file in cui si trova. Le informazioni sono memorizzate nel
Dl_info
struttura: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;
Se non è stato trovato alcun simbolo corrispondente a addr, allora
dli_sname
edli_saddr
sono impostati suNULL
.
dladdr()
restituisce 0 in caso di errore e diverso da zero in caso di successo.
Quindi gli dai solo un puntatore a funzione e ti darà il nome del file che lo fornisce e una serie di altre informazioni. Quindi, ad esempio, potresti fare in modo che un costruttore in una libreria chiami this su se stesso per scoprire il percorso completo della libreria:
#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);
}
Questa funzione funziona anche su OS X con la stessa semantica.