2011-11-01 6 views
17

Questa pagina - http://labs.qt.nokia.com/2011/10/28/rpath-and-runpath/ - dice di ordine per la ricerca in biblioteca ld.so:usa RPATH ma non RUNPATH?

Unless loading object has RUNPATH: 
    RPATH of the loading object, 
     then the RPATH of its loader (unless it has a RUNPATH), ..., 
     until the end of the chain, which is either the executable 
     or an object loaded by dlopen 
    Unless executable has RUNPATH: 
     RPATH of the executable 
LD_LIBRARY_PATH 
RUNPATH of the loading object 
ld.so.cache 
default dirs 

E poi suggeriscono:

Quando si invia i binari, utilizzare RPATH e non RunPath o garantire LD_LIBRARY_PATH è impostato prima che vengano eseguiti.

Quindi, utilizzando RPATH con RUNPATH è un male perché RUNPATH kind-of annulla RPATH in modo indiretto il caricamento dinamico non funziona come previsto? Ma perché allora lo RPATH è stato deprecato a favore di RUNPATH?

Qualcuno può spiegare la situazione?

risposta

13

Quando spedite un file binario, è utile fornire agli utenti mezzi per adattare il file 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.co.conf, entrambi i quali sono con precedenza inferiore DT_RPATH, quindi non è possibile sostituire quello che viene codificato in binario, mentre se si utilizza DT_RUNPATH invece, un utente può ignorare con LD_LIBRARY_PATH .

(FWIW, penso che dovrebbe anche avere la precedenza su DT_RUNPATH, ma, almeno, abbiamo LD_LIBRARY_PATH).

Inoltre, sono fortemente in disaccordo con il suggerimento sopra riportato per utilizzare DT_RPATH. IMO, è meglio usare il nether DT_RPATH non DT_RUNPATH nei binari spediti.

meno

di spedire tutte le librerie dipendenti con i vostri eseguibili e desidera garantire che le cose JustWork (tm) dopo l'installazione, in questo caso l'uso DT_RPATH.

+1

problema è, RUNPATH è raccomandato su RPATH, e RPATH è deprecato, ma RUNPATH non è attualmente supportato da tutti i sistemi. quindi cosa faccio ** oggi ** per far funzionare l'applicazione? come mostra l'articolo di Qt, quando si usano i plugin è utile usare RPATH più di RUNPATH. quindi l'intera situazione è molto confusa qui – zaharpopov

+1

@zaharpopov, L'approccio migliore che consiglierei e seguirmi è quello di produrre applicazioni che siano ben integrate nella piattaforma di destinazione, che includerebbe, tra le altre cose, * non distribuire versioni concorrenti della piattaforma librerie condivise *. Penso che questa sia la radice del problema e gli hack e le barre attorno a 'DT_RPATH' e gli amici sono uno sforzo mal diretto che cerca di superare il problema invece di risolverlo. – chill

+1

questo non è semplice. con il problema Qt l'app voleva una versione più recente delle librerie Qt che esistesse sul sistema. alcuni sistemi hanno obsoleto Qt SO, quindi cosa faresti allora? Penso che abbia senso distribuire Qt SOs con te se hai bisogno di una versione specifica – zaharpopov

10

La risposta di Chill è esatta; Volevo semplicemente aggiungere un po 'di colore, da una lettura recente della fonte 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 una libreria viene trovata a un determinato livello, la ricerca si interrompe.

dinamico Biblioteca Ordine di ricerca:

  1. DT_RPATH nel binario ELF, a meno che non DT_RUNPATH set.
  2. voci LD_LIBRARY_PATH, a meno che non setuid/setgid
  3. DT_RUNPATH nelle voci
  4. /etc/ld.so.cache binari ELF, a meno che non nodeflib -z dato in fase di collegamento
  5. /lib,/usr/lib a meno che - z nodeflib
  6. Fine, "non trovato".
4

Ma perché poi RPATH ottenuto sconsigliato a favore RUNPATH?

Quando DT_RPATH è stato introdotto, aveva la precedenza su tutti gli altri parametri. Ciò ha reso impossibile sovrascrivere il percorso di ricerca delle librerie anche a fini di sviluppo. Quindi è stato introdotto un altro parametro, LD_RUNPATH, con precedenza inferiore rispetto a LD_LIBRARY_PATH.

Maggiori dettagli possono essere trovati nel lavoro "How to write shared libraries" scritto da Ulrich Drepper.

+1

Questa risposta spiega la necessità di 'DT_RUNPATH', ma non perché' DT_RPATH' è deprecato. Entrambi hanno il loro uso e 'DT_RUNPATH' interrompe' libtool' quando viene usato 'LD_LIBRARY_PATH': https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=859732 – vinc17