Quando spedisci un binario, è utile fornire agli utenti i mezzi per adattare il binario alle specifiche del proprio sistema, tra le altre cose, regolando i percorsi di ricerca della libreria.
Un utente può generalmente modificare LD_LIBRARY_PATH
e /etc/ld.so.conf
, entrambi con precedenza inferiore a DT_RPATH
, cioè non puoi sovrascrivere ciò che è hardcoded nel binario, mentre se usi DT_RUNPATH
invece, un utente può sovrascriverlo con LD_LIBRARY_PATH
.
(FWIW, penso ld.so.conf
dovrebbe anche avere la precedenza su DT_RUNPATH
, ma, comunque, almeno abbiamo LD_LIBRARY_PATH
).
Inoltre, non sono assolutamente d'accordo con il suggerimento precedente di utilizzare DT_RPATH
. IMO, è meglio usare nether DT_RPATH
non DT_RUNPATH
nei file binari forniti.
a meno che
spedisci tutte le tue librerie dipendenti con i tuoi eseguibili e desideri assicurarti che le cose JustWork(tm) dopo l'installazione, in questo caso usa DT_RPATH
.
Ma allora perché RPATH è stato deprecato a favore di RUNPATH?
Quando è stato introdotto DT_RPATH, aveva la precedenza su tutti gli altri parametri. Ciò ha reso impossibile sovrascrivere il percorso di ricerca delle librerie anche per scopi di sviluppo. Pertanto è stato introdotto un altro parametro, LD_RUNPATH, che ha una precedenza inferiore rispetto a LD_LIBRARY_PATH.
Maggiori dettagli possono essere trovati nel lavoro "Come scrivere librerie condivise" scritto da Ulrich Drepper .
La risposta di Chill è esattamente giusta; Volevo semplicemente aggiungere un po' di colore, da una recente lettura del sorgente glibc ([master 8b0ccb2], in 2.17). Per essere chiari, se una libreria non viene trovata nella posizione specificata da un determinato livello, viene provato il livello successivo. Se viene trovata una libreria a un determinato livello, la ricerca si interrompe.
Ordine di ricerca della libreria dinamica:
- DT_RPATH nel binario ELF, a meno che non sia impostato DT_RUNPATH.
- Voci LD_LIBRARY_PATH, tranne setuid/setgid
- DT_RUNPATH in binario ELF
- Voci/etc/ld.so.cache, a meno che -z nodeflib non venga fornito al momento del collegamento
- /lib, /usr/lib a meno che -z nodeflib
- Fatto, "non trovato".