Der dynamische Linker durchsucht tatsächlich mehrere Orte, um jede dynamische Bibliothek zu finden. Dazu gehören (von man ld.so):
- Pfade, die von der Umgebungsvariable
LD_LIBRARY_PATH
angegeben werden - In die Binärdatei gebackene Pfade laden die Bibliothek unter
DT_RUNPATH
Eintrag - Die Cache-Datei /etc/ld.so.cache
- /lib und /usr/lib
Wenn Sie den Pfad für eine bestimmte gemeinsam genutzte Bibliothek erhalten möchten, würde ich den dladdr
empfehlen Funktion. Aus der Manpage:
Die Funktion dladdr() nimmt einen Funktionszeiger und versucht, Name und Datei dort aufzulösen, wo sie sich befinden. Informationen werden in Dl_info
gespeichert Struktur:
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;
Wenn keine zum Symbol passende Adresse gefunden werden konnte, dann dli_sname
unddli_saddr
sind auf NULL
gesetzt .
dladdr()
gibt im Fehlerfall 0 und im Erfolgsfall ungleich Null zurück.
Sie geben ihm also einfach einen Funktionszeiger, und er gibt Ihnen den Namen der Datei, die ihn liefert, und eine Reihe anderer Informationen. So könnte beispielsweise ein Konstruktor in einer Bibliothek dies selbst aufrufen, um den vollständigen Pfad der Bibliothek herauszufinden:
#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);
}
Diese Funktion funktioniert auch unter OS X mit der gleichen Semantik.