Dynamický linker ve skutečnosti prohledává několik míst, aby našel každou dynamickou knihovnu. Patří mezi ně (z man ld.so):
- Cesty dané proměnnou prostředí
LD_LIBRARY_PATH
- Cesty zapečené do binárního souboru načítají knihovnu pod
DT_RUNPATH
vstup - Soubor mezipaměti /etc/ld.so.cache
- /lib a /usr/lib
Pokud chcete získat cestu pro konkrétní sdílenou knihovnu, doporučil bych dladdr
funkce. Z manuálové stránky:
Funkce dladdr() vezme ukazatel funkce a pokusí se přeložit název a soubor, kde se nachází. Informace jsou uloženy v
Dl_info
struktura: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;
Pokud nebyl nalezen žádný symbol odpovídající adr, pak
dli_sname
adli_saddr
jsou nastaveny naNULL
.
dladdr()
vrátí 0 při chybě a nenulovou při úspěchu.
Takže mu stačí dát ukazatel funkce a dá vám název souboru, který jej dodává, a spoustu dalších informací. Takže například můžete mít konstruktor v knihovně, který si toto zavolá, aby zjistil úplnou cestu ke knihovně:
#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);
}
Tato funkce funguje také na OS X se stejnou sémantikou.