LD_LIBRARY_PATH in Linux: utilizzo corretto, rischi e alternative

Ultimo aggiornamento: 25 gennaio 2026
  • LD_LIBRARY_PATH indica al caricatore dinamico dove cercare le librerie condivise anziché nei percorsi di sistema standard.
  • Il suo utilizzo a livello globale può portare a falle di sicurezza, perdite di prestazioni e incompatibilità difficili da risolvere.
  • È preferibile utilizzare alternative come -rpath, LD_RUN_PATH o script wrapper per limitare l'impatto ad applicazioni specifiche.
  • Definire LD_LIBRARY_PATH solo in test specifici o in ambienti controllati evita dipendenze nascoste e comportamenti imprevedibili.

Variabile LD_LIBRARY_PATH in Linux

LD_LIBRARY_PATH è una di quelle variabili d'ambiente Linux che prima o poi tutti si trovano a vedere, ma che pochissimi comprendono appieno e, soprattutto, che viene spesso utilizzata in modo errato. Quando si inizia ad avere problemi con librerie condivise, eseguibili che non si avviano o applicazioni che necessitano di librerie proprie, questo nome ricompare di continuo.

In questo articolo, esploreremo cos'è LD_LIBRARY_PATH, come funziona internamente il caricatore dinamico , quando ha senso usare questa variabile e quando è meglio evitarla. Analizzeremo esempi pratici in distribuzioni come Ubuntu (anche se è applicabile a quasi tutte le distribuzioni), spiegheremo come configurarla correttamente e prenderemo in esame alternative molto più pulite e sicure rispetto all'avere questa variabile permanentemente associata al profilo utente.

Che cos'è LD_LIBRARY_PATH e a cosa serve realmente?

Percorso delle librerie condivise in Linux

Nei moderni sistemi GNU/Linux, la maggior parte dei programmi si collega con librerie condivise (file .so) che vengono caricati in memoria all'avvio dell'eseguibile. Il componente responsabile del rilevamento di queste librerie in fase di esecuzione è caricabatterie dinamico (di solito ld.so o varianti come ld-linux-x86-64.so.2 secondo l'architettura).

La variabile d'ambiente LD_LIBRARY_PATH definisce un elenco di directory dove il caricatore dinamico cercherà le librerie condivise all'avvio di un programma. È un elenco separato da due punti, qualcosa del tipo /ruta/uno:/ruta/dos:/otra/rutae viene consultato prima delle rotte standard del sistema come /lib o /usr/lib.

Questo significa che se una libreria in LD_LIBRARY_PATH ha lo stesso nome di un'altra libreria in una directory di sistema, il caricatore darà la priorità alla libreria in LD_LIBRARY_PATH . Questa è la parte più importante... e anche la causa di molti problemi se usata con noncuranza.

Questo meccanismo è particolarmente utile quando si lavora con percorsi di libreria non standard , ad esempio ambienti di tipo Nix, installazioni in directory utente, versioni personalizzate di librerie o applicazioni pacchettizzate con le proprie dipendenze che non vogliono utilizzare le librerie di sistema.

Casi d'uso tipici per LD_LIBRARY_PATH

Utilizzo pratico di LD_LIBRARY_PATH in Linux

L'utilizzo di LD_LIBRARY_PATH ha senso solo in scenari molto specifici e controllati . Se ci si attiene a questi casi, è uno strumento molto utile; se invece lo si adotta come soluzione predefinita per ogni situazione, prima o poi qualcosa andrà storto.

Uno degli usi più comuni è quello di prova una nuova versione di una libreria condivisa su un'applicazione precompilata, senza toccare le librerie di sistema. Ad esempio, se hai creato una versione di sviluppo di libmylib.so Nella tua directory home puoi modificare LD_LIBRARY_PATH in modo che venga utilizzato solo dalla tua sessione di test.

Un altro scenario molto comune è lo spostamento delle librerie per preservare le versioni precedenti . Immaginate di voler mantenere una versione precedente di una libreria per un'applicazione legacy, mentre il resto del sistema utilizza una versione più recente; con LD_LIBRARY_PATH potete indicare a quella specifica applicazione la directory in cui è memorizzata la versione precedente.

Viene inoltre spesso utilizzato per configurare ambienti autonomi e riposizionabili per applicazioni di grandi dimensioni, in cui il fornitore impacchetta le proprie librerie all'interno di una cartella, senza fare affidamento sulle librerie di sistema. In questi casi, di solito è presente uno script di avvio che modifica LD_LIBRARY_PATH in modo che l'applicazione carichi sempre i propri file .so.

In tutti questi casi, il punto chiave è che LD_LIBRARY_PATH viene utilizzato in modo limitato e specifico , associato a una particolare applicazione o a un ambiente di test, e non come variabile globale che influenza tutto ciò che un utente esegue o l'intero sistema.

Come configurare LD_LIBRARY_PATH in Linux passo dopo passo

Configurazione passo passo di LD_LIBRARY_PATH

Anche conoscendo i rischi, vuoi comunque definisci LD_LIBRARY_PATH nel tuo ambiente utenteNelle distribuzioni come Ubuntu, è comune modificare il file ~/.bashrc (supponendo che tu usi Bash come shell predefinita). È il file che viene eseguito ogni volta che apri un nuovo terminale interattivo.

Per iniziare, apri il file .bashrc con il tuo editor preferitoViene utilizzato in molti tutorial nano Per semplicità, ma potresti fare lo stesso con vi, vim o qualsiasi editor di testo:

  Audit di sistema: come garantire l'integrità e la sicurezza della tua infrastruttura

nano ~ / .bashrc

Una volta aperto, è necessario aggiungere una riga di esportazione che imposti la variabile. L'importante è non lasciare spazi intorno al segno di uguale, altrimenti Bash lo interpreterà in modo errato. Un esempio corretto sarebbe:

esporta LD_LIBRARY_PATH=/home/osboxes/mukul

In questo caso, stiamo dicendo al sistema che, durante la ricerca delle librerie condivise, deve considerare la directory /home/osboxes/mukul prima delle directory standard. Puoi sostituire questo percorso con quello dei tuoi file .so personalizzati o delle librerie che desideri utilizzare.

Dopo aver salvato le modifiche ed essere uscito dall'editor, è necessario ricaricare la configurazione della shell affinché la nuova variabile d'ambiente abbia effetto nella sessione corrente. Questo viene solitamente fatto con:

fonte ~ / .bashrc

Se vuoi verificare che tutto sia stato applicato correttamente, usa semplicemente il comando echo Per quanto riguarda la variabile, questa mostrerà i percorsi attualmente contenuti in LD_LIBRARY_PATH:

echo $LD_LIBRARY_PATH

Se la riga di output include la directory aggiunta, significa che la configurazione è stata caricata correttamente e il caricatore dinamico terrà conto di quel percorso quando avvierà i programmi.

Come aggiungere percorsi extra senza rompere nulla

Spesso non si desidera sostituire completamente il contenuto di LD_LIBRARY_PATH , ma piuttosto aggiungere un altro percorso mantenendo quelli esistenti. Questo è importante se sono già configurate altre librerie e non si vogliono interrompere le dipendenze con altre applicazioni.

Per "concatenare" i percorsi, di solito si usa una forma di esportazione che aggiunge una nuova directory prima della variabile precedenteAd esempio, se vuoi aggiungere /home/osboxes/sample A quanto già definito, potresti scrivere qualcosa del genere nel tuo .bashrc:

esporta LD_LIBRARY_PATH=/home/osboxes/sample:${LD_LIBRARY_PATH}

L'ordine è importante perché il caricatore dinamico cercherà prima in /home/osboxes/sample e poi nelle altre directory in cui la variabile esiste già. Questo permette di includere una libreria prioritaria solo per determinati test, lasciando inalterata il resto della configurazione.

Dopo aver modificato il file, ricorda di nuovo eseguire il comando "source" su ~/.bashrc per applicare le modifiche al terminale corrente e controllare di nuovo con echo $LD_LIBRARY_PATH che il nuovo percorso appaia in cima all'elenco.

È raccomandato evitare cambiamenti costanti in LD_LIBRARY_PATHOgni modifica mal eseguita può finire per avere effetti su programmi che non avresti nemmeno immaginato. Usa il pattern "add" con la sintassi ${LD_LIBRARY_PATH} Aiuta a mantenere la coerenza, ma è meglio non abusarne.

Come funziona la ricerca in biblioteca e perché può essere pericolosa

Dietro LD_LIBRARY_PATH c'è un comportamento molto specifico del caricatore dinamico: priorità di ricercaI percorsi inseriti in questa variabile vengono elaborati prima dei percorsi precompilati e delle directory standard sul sistema, come /lib, /usr/lib o /usr/lib64.

Il problema si presenta quando queste directory aggiuntive contengono una libreria con lo stesso nome di una libreria di sistema, ma con una versione diversa o incompatibile. Il caricatore dinamico selezionerà senza esitazione la prima libreria che trova in LD_LIBRARY_PATH, anche se l'applicazione era originariamente collegata a una versione diversa.

Questa situazione apre la porta a diversi tipi di conflitti, tra cui uno piuttosto serio in termini di sicurezza . Se un utente malintenzionato riesce a farti eseguire un programma con un LD_LIBRARY_PATH manipolato, esiste la possibilità che una libreria dannosa si insinui e sostituisca la versione legittima, eseguendo codice indesiderato.

Per questo motivo, i binari setuid o setgid in genere ignorano completamente LD_LIBRARY_PATH. Poiché vengono eseguiti con privilegi elevati, accettare percorsi arbitrari dall'ambiente utente rappresenterebbe un rischio enorme; in questi casi il sistema semplicemente ignora tale variabile.

Oltre alla sicurezza, c'è un aspetto di prestazioni ed efficienza Un aspetto da tenere a mente. Ogni directory aggiunta a LD_LIBRARY_PATH forza il loader a provare ad aprire le librerie in quel percorso anche se in realtà non sono presenti. Questo si traduce in molte chiamate fallite a open()che restituiscono "ENOENT (Nessun file o directory del genere)" e rallentano l'avvio delle applicazioni.

Più percorsi si aggiungono, soprattutto se si tratta di directory remote (NFS) , più i tempi di avvio dei programmi ne risentiranno e maggiore sarà il carico sul file system. In ambienti di grandi dimensioni con centinaia di utenti, un uso eccessivo di LD_LIBRARY_PATH può diventare un collo di bottiglia inaspettato.

  Tecniche di overclocking di CPU e GPU: una guida completa e i relativi rischi.

Problemi tipici: incongruenze e dipendenze nascoste

Un altro effetto collaterale molto comune è l'incoerenza tra file binari e librerie . LD_LIBRARY_PATH può forzare un programma a caricare una versione diversa di una libreria rispetto a quella a cui è stato collegato, e non sempre sono compatibili al 100% a livello di ABI o di comportamento.

Nella migliore delle ipotesi, se c'è una chiara incompatibilità, l'applicazione non si avvierà o si bloccherà rapidamente, lasciando tracce evidenti del problema. Ma ciò che è veramente pericoloso è quando la libreria "funziona più o meno", ma poi inizia a restituire risultati errati o a comportarsi in modo leggermente diverso, in modo così sottile da rendere difficile il debug.

Un caso d'uso particolarmente problematico è la definizione di LD_LIBRARY_PATH a livello globale nei profili utente o, peggio ancora, nel profilo di sistema. In tal caso, tutte le applicazioni in esecuzione in quella sessione vengono esposte a tale configurazione, anche quelle che non sono state progettate per funzionare con quei percorsi aggiuntivi.

Quando questi percorsi globali cambiano o cessano di esistere, molti file binari possono improvvisamente smettere di funzionare perché, senza che nessuno se ne accorgesse, avevano iniziato a fare affidamento su quella "patch" di LD_LIBRARY_PATH per trovare le proprie librerie.

Questo spiega perché in molti ambienti professionali si dia tanta importanza all'utilizzo della variabile solo come strumento di test una tantum o soluzione di emergenza , mai come meccanismo di configurazione stabile a lungo termine.

Come vedere quali librerie vengono effettivamente utilizzate

Per comprendere appieno come le modifiche influiscono su LD_LIBRARY_PATH, è fondamentale sapere quali librerie sono eseguibili utilizzando ciascunaQui è dove comandi come lddche forniscono una visione abbastanza chiara del collegamento dinamico.

Il comando `ldd` mostra, per un dato binario, quali librerie dinamiche sono necessarie e da quale percorso vengono caricate. Ad esempio, se si esegue:

ldd /usr/bin/file

Vedrai un elenco di linee del tipo libmagic.so.1 => /usr/lib64/libmagic.so.1, insieme alla risoluzione di linux-vdso.so.1, libc.so.6 e il caricabatterie dinamico stesso. Queste informazioni ti danno un foto fissa delle principali dipendenze dell'eseguibile.

Tuttavia, ci sono casi in cui una libreria condivisa carica altre librerie in fase di esecuzione (ad esempio, attraverso dlopen()), e questi non si riflettono nell'output di ldd. Per avere un quadro più completo, è necessario esaminare quali file .so sono effettivamente mappati nello spazio degli indirizzi di un processo in esecuzione.

In alcuni sistemi simili a Solaris, esiste il comando `pldd` che elenca le librerie dinamiche caricate da un processo in base al suo PID. Se utilizzato in un programma come Bash, è possibile vedere come le librerie elencate da `ldd` si combinano con altre, come i moduli di conversione dei caratteri o i moduli NSS per la risoluzione di utenti e gruppi.

In Linux puro, pldd non è sempre disponibile come binario standard, ma Ci sono script in Perl o altri strumenti che estraggono le informazioni da /proc/<PID>/mapsottenendo un effetto simile. In questo modo puoi verificare se le impostazioni LD_LIBRARY_PATH hanno causato il caricamento di librerie inaspettate.

Modi più puliti per evitare di affidarsi a LD_LIBRARY_PATH

Il consiglio generale quando si iniziano ad accumulare soluzioni alternative con LD_LIBRARY_PATH è semplice: usatelo il meno possibile . Ogni percorso aggiunto è una potenziale fonte di errori, conflitti di versione e problemi di prestazioni, quindi vale la pena considerare alternative più robuste.

Se compili le tue applicazioni (ad esempio, seguendo Linux From Scratch ), puoi utilizzare l' opzione `-rpath` del linker . Questa opzione ti permette di incorporare il percorso delle librerie da cui dipende l'eseguibile direttamente nell'eseguibile stesso, in modo che il binario sappia dove trovarle senza dover modificare le variabili d'ambiente globali.

Un esempio tipico potrebbe essere:

cc -o myprog obj1.o … objn.o -Wl,-rpath=/percorso/verso/lib -L/percorso/verso/lib -lmylib

Con questo, il linker aggiunge /path/to/lib al percorso di esecuzione dell'eseguibileSe hai bisogno di più percorsi, è molto comodo usare la variabile d'ambiente. LD_RUN_PATHche anche il linker comprende e che è possibile popolare con un elenco di directory separate da due punti.

Potresti fare, ad esempio:

esporta LD_RUN_PATH=/percorso/verso/lib1:/percorso/verso/lib2:/percorso/verso/lib3
cc -o myprog obj1.o … objn.o -L/percorso/verso/lib1 -lmylib1 -L/percorso/verso/lib2 -lmylib2

Dopo la compilazione, puoi controllare con ldd che il binario Risolve correttamente tutte le sue librerie senza fare affidamento su LD_LIBRARY_PATH. Se compaiono errori "not found", è necessario controllare il Makefile e la configurazione di LD_RUN_PATH.

  Che cos'è SSH? Una guida completa

Quando non è possibile ricompilare, si possono utilizzare strumenti come chrpath per modificare il runpath già incorporato nell'eseguibile. Questa tecnica presenta delle limitazioni: è possibile solo sovrascrivere la stringa esistente, non estenderla, e se il binario non aveva un runpath definito, non c'è nulla da modificare.

Utilizzo di script wrapper ed esecuzione di modifiche specifiche dalla riga di comando

Se non è possibile utilizzare né -rpath né chrpath per il collegamento, è comunque possibile ricorrere a script wrapper che modificano LD_LIBRARY_PATH solo per una specifica applicazione e nient'altro. Questo approccio è molto meno invasivo rispetto alla modifica del profilo utente.

Un tipico wrapper in shell potrebbe apparire più o meno così:

# / Bin / sh
LD_LIBRARY_PATH=/percorso/verso/lib1:/percorso/verso/lib2:/percorso/verso/lib3
esporta LD_LIBRARY_PATH
esegui /percorso/verso/bin/mioprog «$@»

Con questo approccio, la variabile d'ambiente viene "contaminata" solo per myprog e, di conseguenza, per tutti i processi figli che avvia, ma non per gli altri comandi eseguiti nella sessione. È una soluzione perfettamente accettabile quando si è costretti a lavorare con versioni specifiche di librerie per una particolare applicazione.

Un'altra opzione molto utile per i test rapidi è quella di utilizzare il comando `env` per definire `LD_LIBRARY_PATH` solo per una singola esecuzione. Ad esempio:

env LD_LIBRARY_PATH=/percorso/verso/lib1:/percorso/verso/lib2 ./myprog

In questo modo la variabile viene applicata solo a quella invocazione de myprogE una volta terminato, la shell rimane intatta, senza alcuna traccia di percorsi strani che potrebbero influenzare il comando successivo che eseguirai.

Ciò che è fortemente sconsigliato è fare cose come:

esporta LD_LIBRARY_PATH=/percorso/verso/lib1:/percorso/verso/lib2
./mioprogramma

Questo modello lascia LD_LIBRARY_PATH definito per tutti gli ordini successivi che si avvia da quel terminale, il che può causare effetti collaterali molto difficili da monitorare in seguito. Per test isolati, la chiamata con env È molto più pulito.

Buone pratiche ed errori comuni da evitare

Una raccomandazione d'oro ampiamente accettata è Non definire mai LD_LIBRARY_PATH nei profili di accessoné file utente né file di sistema. In altre parole, evita di aggiungerlo a file come ~/.bash_profile, ~/.profile, /etc/profile o simili.

Quando una variabile così sensibile viene impostata a livello globale, tutte le applicazioni avviate da quell'utente utilizzeranno quei percorsi aggiuntivi, anche quelle perfettamente configurate per funzionare con le librerie di sistema. Limitare il suo ambito a script specifici o a esecuzioni singole è sempre un approccio molto più sicuro.

È inoltre consigliabile diffidare degli installer di terze parti che, durante l'installazione, chiedono di aggiungere LD_LIBRARY_PATH al profilo utente o che lo fanno automaticamente a livello globale. Nella maggior parte dei casi, si tratta di una scorciatoia facile per il fornitore, ma che a medio termine causerà problemi all'ambiente di sistema.

Quando possibile, vale la pena impegnarsi un po' di più e cercare alternative più pulite : modificare il percorso di esecuzione del file eseguibile, installare le librerie in una directory standard, utilizzare meccanismi di packaging moderni o racchiudere l'applicazione in uno script wrapper invece di modificare l'ambiente generale.

Se siete costretti a utilizzare la variabile, cercate di mantenere i percorsi il più concisi e specifici possibile, riducete al minimo il numero di directory ed evitate a tutti i costi i percorsi che si trovano su file system remoti, a meno che non siano strettamente necessari.

Alla luce di tutto ciò, LD_LIBRARY_PATH rimane uno strumento potente ma delicato : è molto utile per testare nuove versioni di librerie, spostare vecchi file .so o creare ambienti autonomi per applicazioni di grandi dimensioni, ma il suo utilizzo indiscriminato comporta rischi per la sicurezza, problemi di prestazioni e incoerenze difficili da individuare. Comprendere come funziona il caricatore dinamico, affidarsi ad alternative come -rpath, LD_RUN_PATH o script wrapper e limitare questa variabile a contesti molto specifici è il modo migliore per sfruttare LD_LIBRARY_PATH senza trasformarlo in una trappola per il sistema.

risorse web per linux
Articolo correlato:
Le migliori risorse Web per Linux: una guida completa