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".