GNU/Linux >> Linux Esercitazione >  >> Linux

usa RPATH ma non RUNPATH?

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:

  1. DT_RPATH nel binario ELF, a meno che non sia impostato DT_RUNPATH.
  2. Voci LD_LIBRARY_PATH, tranne setuid/setgid
  3. DT_RUNPATH in binario ELF
  4. Voci/etc/ld.so.cache, a meno che -z nodeflib non venga fornito al momento del collegamento
  5. /lib, /usr/lib a meno che -z nodeflib
  6. Fatto, "non trovato".

Linux
  1. Core scaricato, ma il file core non si trova nella directory corrente?

  2. Eseguire l'installazione, ma non nelle directory predefinite?

  3. Tomcat in esecuzione, ma la porta 8080 non risponde

  4. Linux come copiare ma non sovrascrivere?

  5. Posso cambiare 'rpath' in un binario già compilato?

Linux – Perché usiamo Su – e non solo Su?

Confronta le directory ma non il contenuto dei file?

Decomprimere un file .gz per ottenere un file di testo ma ottenere un file binario??

Comando non trovato in Zsh, ma trovato in Bash?

Debian 11.3 è così buono, semplicemente non c'è motivo per non usarlo

Perché usiamo su - e non solo su?