Errore durante il caricamento delle librerie condivise: il temuto errore che prima o poi ogni utente Linux incontrerà. Qualcosa è andato storto con le dipendenze degli oggetti condivisi (Biblioteche) utilizzato dall'eseguibile. Scopri come risolvere questi problemi e altro ancora!!
Che cos'è un? Dipendenza da oggetti condivisi?
Un oggetto condiviso (chiamato anche biblioteca) è un binario (generalmente non direttamente eseguibile) utilizzato da più programmi / applicazioni su un'istanza Linux. Queste librerie sono spesso installate a livello di sistema operativo e condivise (da qui il nome oggetto condiviso oh libraries
) per l'uso da parte di uno o più (e anche molti) applicazioni eseguibili direttamente.
Come esempio, un programma che include file compressi potrebbe richiedere la libreria bz2 (bzip2) libbz2.so.1.0
per farlo. Il termine Biblioteca È usato più frequentemente negli ambienti Linux ed è il gergo preferito dai professionisti, benché oggetto condiviso (e libreria condivisa) sono entrambi tecnicamente corretti. È anche interessante notare che il .so
L'estensione del nome file usata in molte librerie significa oggetto condiviso!
Un eseguibile può avere zero, una o più librerie su cui si basa. Meno biblioteche, più avanzato (durante l'aggiornamento del sistema operativo, come esempio) sarà compatibilità. Più librerie, maggiore è la possibilità che, presto o tardi, qualsiasi dipendenza dalla libreria è interrotta. Questo è anche il motivo per cui a volte i fornitori di applicazioni decidono di avviare statically compiled binaries
invece di dynamically compiled binaries
.
La differenza tra binari compilati staticamente e dinamicamente è semplice ma ha conseguenze di vasta portata. Un binario compilato staticamente ha le librerie (disponibile nel sistema di sviluppo in fase di compilazione) compilato in binario / eseguibile risultante. Un binario compilato dinamicamente utilizzerà le librerie installate, disponibile e condiviso sul sistema dell'utente.
Come puoi vedere subito, ciò richiederebbe all'utente di installare le dipendenze richieste, A meno che questi non siano curati nel sistema operativo o nei dettagli e nel sistema di gestione dei pacchetti del fornitore dell'applicazione. Questo è il motivo per cui eseguire un semplice comando come sudo apt install ...some_app...
spesso produrrà un insieme di altre cose associate (In altre parole, librerie richieste) essere co-installato allo stesso tempo.
Sia la compilazione statica che quella dinamica hanno pro e contro. Come esempio, se usi la compilazione statica e una libreria che hai incluso nel tuo pacchetto software (dal punto di vista di un fornitore di software) ora hai un bug di sicurezza o un aggiornamento critico, potrebbe essere necessario ripubblicare il pacchetto software, anche se non è cambiato nulla nel tuo codice.
Ma, ancora, fidarsi dell'utente per installare le librerie, soprattutto per programmi complessi, o quando è necessaria la compilazione automatica del software, sapendo che gli utenti finali spesso lottano con queste cose, non è nemmeno l'ideale. È un settore complesso e l'argomento è stato discusso spesso.
Ai fini di questo post, analizzeremo le librerie condivise in collegamento con un programma che è stato compilato dinamicamente, come di solito accade con i programmi / eseguibili / strumenti del sistema operativo. Con programmi compilati staticamente (che sono meno comuni), è altamente improbabile che venga visualizzato un errore come "Impossibile caricare le librerie condivise", poiché le librerie sono incluse nell'eseguibile a meno che il programma non sia parzialmente dinamico e includa solo un insieme limitato di file incorporati. nelle librerie statiche.
Errore durante il caricamento delle librerie condivise!
cambiamo in radice modalità per un po' (usando sudo su
) ed esplora come funzionano le librerie condivise quando si tratta di uno strumento come /usr/bin/zip
che è incluso o può essere installato con le principali distribuzioni Linux.
Qui, cambiamo le directory in /usr/bin
e controllato se il zip
Programma / binario / l'eseguibile è presente. Trovarlo presente, quindi verifichiamo la versione invocandola con --version
e prendendo solo le prime due righe dell'output canalizzando l'output (usando |
) per evitare un output lungo dato altrimenti.
Finire, noi usiamo il ldd
attrezzo (un programma che stampa le dipendenze degli oggetti condivisi) per vedere di quali librerie ha bisogno l'eseguibile. Come possiamo vedere, il programma necessita di quattro librerie condivise. L'elenco delle librerie richieste è generalmente nel formato della libreria richiesta, seguito da un percorso in cui è già stata trovata la libreria nominata.
Per alcune librerie di livello superiore o speciali del sistema operativo (Che cosa linux-vdso.so.1
), non viene mostrato tale percorso. Nonostante questo, fintanto che non viene visualizzato alcun errore in alcun input, saprai che è buono e disponibile (o è preferibile?). In realtà, linux-vdso.so.1
È un oggetto / speciale libreria virtuale condivisa iniettata in ogni procedura dal kernel Linux, non hai un file fisico su disco per lo stesso. È lì per rendere più efficienti le chiamate di sistema.
Quindi, rompiamo un po' le cose e rinominiamo una delle librerie richieste in modo che il binario non possa più individuarla automaticamente:
Come potete vedere, qui cambiamo nome / abbiamo spostato il file da /lib/x86_64-linux-gnu/libbz2.so.1.0
per /lib/x86_64-linux-gnu/libbz2.so.1.0.NOT_PRESENT
. Questo ha rotto la nostra app zip, e quando proviamo a eseguirlo, otteniamo il temuto error while loading shared libraries
errore. Nonostante questo, guardando un po' più da vicino, il messaggio di errore è abbastanza descrittivo:
cerniera lampo: errore durante il caricamento delle librerie condivise: libbz2.so.1.0: impossibile aprire il file oggetto condiviso: Nessun file o directory con questo nome
Qualsiasi check-in e check-out sarà sempre attentamente esaminato da un ingegnere informatico esperto / informazioni sul programma presentate prima di effettuare una chiamata su un ostacolo. Ne varrebbe la pena anche qui, poiché il file richiesto è chiaramente visualizzato, libbz2.so.1.0
, e il problema è anche chiaramente mostrato. Ci sono No such file or directory
. In altre parole, libbz2.so.1.0
Lui è perso!
Possiamo anche verificare lo stesso con ldd
, come puoi vedere nella foto sopra. una pulizia libbz2.so.1.0 => not found
ci aiuta a sapere cosa sta succedendo. Una volta compreso chiaramente come vengono compilati dinamicamente i binari (la maggior parte dei binari nel sistema operativo sono compilati in questo modo) caricare e richiedere le librerie, e come vedere se ne manca uno (o se ne sei informato tramite il messaggio di errore), le cose non funzionano. non mi sembra più così complicato.
Allo stesso tempo, una volta che conosciamo il nome della libreria richiesta, una rapida ricerca sul tuo motore di ricerca preferito mostrerà il pacchetto aggiuntivo da installare (lo reinstallerò) per ottenere il nome della libreria richiesto. Molto spesso, il nome del pacchetto può anche essere costruito direttamente dal nome della libreria. Nonostante questo, per questo caso, il nome della libreria di runtime è un po' sbagliato.
Esistono due tipi di librerie: librerie runtime e librerie di sviluppo. In questa circostanza, il nome del pacchetto che contiene il libbz2.so.1.0
la biblioteca è probabile bzip2
, e provare a disinstallare probabilmente romperebbe molti altri elementi, come puoi vedere da un lungo elenco di programmi che verranno rimossi se tenti di disinstallare o eliminare i file bzip2
pacchetto.
Il secondo tipo di libreria è una libreria di sviluppo. Spesso, Questi sono necessari quando si tenta di compilare programmi e, spesso, sono più strettamente correlati ai nomi dei file di libreria reali. Come esempio, in Ubuntu, basta prendere il nome della libreria e aggiungere -dev
. Come esempio, se volessimo installare il pacchetto di sviluppo relativo al libbz2.so.1.0
pacchetto, potremmo considerare l'installazione libbz2-dev
:
Considerando che questa libreria di sviluppo non è direttamente correlata alla nostra libbz2.so.1.0
libreria runtime, è utile conoscere la sintassi dei nomi della maggior parte dei nomi dei pacchetti di sviluppo in Ubuntu (prefisso di lib
e suffisso di -dev
con il nome della biblioteca tra quelle) definitivamente che è necessaria una certa libreria di sviluppo (che di solito è richiesto durante la compilazione del software).
Allo stesso tempo, supponiamo che qualche libreria si rompa in qualche modo. Quindi, una delle soluzioni rapide più semplici è eliminare la libreria sudo apt purge your_library_name
comando (che eliminerebbe completamente la biblioteca / programma passato), seguito da una reinstallazione utilizzando il sudo apt install your_library_name
comando.
E quando ti trovi in una situazione simile alla precedente, dove disinstallare la libreria di runtime che devi disinstallare / eliminare il programma principale, e dov'è lo spurgo? / la rimozione è una parte troppo grande del sistema operativo o influenzerebbe molte altre cose, puoi invece usare un'opzione di reinstallazione:
sudo apt reinstalla bzip2
Nonostante questo, non è sempre così semplice, anche sapendo quanto sopra (e soprattutto la convenzione di denominazione in termini di aggiunta -dev
) aiuta enormemente a risolvere i problemi e, spesso, risolverà il problema direttamente.
Inoltre aiuta molto sapere come le librerie possono essere verificate usando ldd
e, finire, capire che una libreria è solo un eseguibile (anche se non direttamente) .so
file che vive in una sottodirectory di /lib
o en /usr/lib
o altre directory simili.
Qualche volta, biblioteche e / o i pacchetti sono in conflitto tra loro, o alcuni pacchetti richiedono determinate versioni di librerie, o alcune librerie richiedono altre librerie, in versioni specifiche. sì, diventa un po' complesso. È anche qualcosa di facile, quando diventa così complesso, incasinare un po' il sistema. Qualche volta, è anche abbastanza fattibile interrompere completamente l'installazione di un sistema operativo a causa del trasferimento di una libreria troppo importante, eccetera.
Spesso, è un po' più sicuro creare un collegamento simbolico (un collegamento virtuale con un nome file specifico, strega si riferisce a / collegamenti a un altro file esistente o un altro collegamento simbolico stesso, che a sua volta punta a un file reale) per una libreria rimasta in una versione precedente, come esempio e puntando quel link simbolico all'ultima versione installata. Non sempre funziona, ma nel caso fallisse, il collegamento simbolico può essere rimosso, speriamo più sicuro (supponendo che in precedenza non esistesse alcun collegamento simbolico o file con lo stesso nome).
Il modo migliore per risolvere questi problemi più complessi è provare sempre a apt
(o uno strumento di gestione dei pacchetti simile sul tuo sistema operativo), prima una soluzione. A questo punto, vorrai anche leggere come usare dkpg per riparare apt, in quanto mostra un modo più granulare di gestire i pacchetti (Anche quando stai attento, poiché più controllo implica più responsabilità!).
Se tutti gli altri falliscono, prova a creare un collegamento simbolico o anche ad aggiungere manualmente il file della libreria. (Per favore, assicurati che tutti i file scaricati siano privi di virus, come esempio, verificandolo con VirusTotale, ed è sempre meglio usare i repository forniti dal fornitore Linux per scaricare i binari).
in extremis, è possibile che tu possa trovare una libreria anche su un sistema operativo Linux vicino. Come esempio, un eseguibile di Ubuntu verrà eseguito in Mint e viceversa. Copiare una libreria da un altro PC che possiedi è a volte un approccio praticabile.
Fine
La gestione dettagliata della biblioteca è un'abilità permanente da imparare. È quasi un'arte. Questo post ha fornito le informazioni / conoscenze di base e strumenti da utilizzare e ha elencato alcuni suggerimenti per la risoluzione dei problemi più avanzati per quando le cose si fanno oscure, e prima o poi, lo faranno se sei un utente Linux frequente che installa i pacchetti regolarmente.
La prossima volta che vedi l'errore "Errore durante il caricamento delle librerie condivise"’ sulla tua macchina Linux, sarai più attrezzato per capire da dove può venire il problema quando usi uno strumento come ldd
, come spiegato in questo post. Analizziamo anche binari statici rispetto a binari compilati dinamicamente., e come le librerie condivise o integrate si adattano e funzionano con entrambe.
Se ti è piaciuto questo post, vorrei anche leggere il post su dpkg
precedentemente collegato, così come Come aggiungere l'universo, i repository multiverso e ristretti in Ubuntu.