Come lavorare con le dipendenze di oggetti condivisi (libreria) in Linux

0
208
Dima Polies/Shutterstock.com< /figure>

Errore durante il caricamento delle librerie condivise: il temuto errore in cui ogni utente Linux prima o poi si imbatterà. Qualcosa è andato storto con le dipendenze degli oggetti condivisi (le librerie) utilizzate dall'eseguibile. Scopri come risolvere questi problemi e altro ancora!

Cos'è un Dipendenza da oggetti condivisi?

Un oggetto condiviso (chiamato anche libreria) è un binario (di solito non direttamente eseguibile) utilizzato da più programmi/applicazioni su un'istanza Linux. Tali librerie sono spesso installate a livello di sistema operativo e sono condivise (da cui il nome oggetto condiviso o librerie) per essere utilizzate da una o più (e anche molte) applicazioni direttamente eseguibili.

Ad esempio, un programma che include la compressione dei file potrebbe richiedere la libreria bz2 (bzip2) libbz2.so.1.0 per farlo. Il termine libreria è più spesso usata negli ambienti Linux ed è il gergo preferito tra i professionisti, sebbene oggetto condiviso (e libreria condivisa) siano entrambi tecnicamente corretti. È anche interessante notare che l'estensione del nome del file .so utilizzata in molte librerie sta per oggetto condiviso!

Un eseguibile può avere zero, una o molte librerie su cui si basa. Meno librerie, più avanti (quando si aggiorna il sistema operativo, ad esempio) sarà la compatibilità. Maggiore è il numero di librerie, maggiore è la possibilità che prima o poi si interrompa una certa dipendenza dalla libreria. Questo è anche il motivo per cui i fornitori di applicazioni a volte decidono di rilasciare binari compilati staticamente anziché binari compilati dinamicamente.

La differenza tra binari compilati staticamente e dinamicamente è semplice ma ha conseguenze di vasta portata. Un binario compilato staticamente ha le librerie (disponibili sul sistema dello sviluppatore al momento della compilazione) compilate nel binario/eseguibile risultante. Un binario compilato dinamicamente utilizzerà le librerie installate, disponibili e condivise sul sistema dell'utente.

Come puoi vedere immediatamente, ciò richiederebbe all'utente di installare tali dipendenze richieste, a meno che non ci si occupi della stessa nel sistema operativo o nel sistema di gestione dei pacchetti del fornitore dell'applicazione e nei dettagli. Questo è il motivo per cui l'esecuzione di un semplice comando come sudo apt install …some_app… spesso produrrà una serie di altre cose correlate (ad esempio le librerie richieste) da co-installare contemporaneamente.

Entrambi la compilazione statica e dinamica hanno pro e contro. Ad 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 ha un bug di sicurezza o un aggiornamento critico, probabilmente significa che devi rifare -rilascia il tuo pacchetto software, anche se non è cambiato nulla nel tuo codice.

Pubblicità

Ma poi di nuovo, affidarsi all'utente per installare librerie, specialmente per programmi complessi, o quando è richiesta l'autocompilazione di software, con la consapevolezza che gli utenti finali spesso lottano con queste cose, non è l'ideale. È un'area complessa e la questione è stata discussa spesso.

Ai fini di questo articolo, esamineremo le librerie condivise in relazione a un programma che è stato compilato dinamicamente, come spesso accade con programmi/eseguibili/strumenti del sistema operativo. Con i programmi compilati staticamente (che sono meno comuni), un errore come ‘Errore durante il caricamento delle librerie condivise’ è altamente improbabile da visualizzare, poiché le librerie sono incluse nell'eseguibile a meno che il programma non sia in parte dinamico e includa solo un set limitato di librerie statiche integrate.

Errore durante il caricamento delle librerie condivise!

Passiamo a rootmode 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 installabile con le principali distribuzioni Linux.

Qui abbiamo cambiato le directory in /usr/bin e verificato se il programma zip/binary/executable è presente. Trovandolo presente, abbiamo quindi controllato la versione invocandola con –version e prendendo solo le prime due righe dell'output reindirizzando l'output (usando |) per evitare l'output lungo dato altrimenti.

Infine, abbiamo utilizzato lo strumento ldd (un programma che stampa le dipendenze degli oggetti condivisi) per vedere quali librerie richiede l'eseguibile. Come possiamo vedere, il programma richiede quattro librerie condivise. L'elenco delle librerie richieste è solitamente nel formato della libreria richiesta, seguito da un percorso in cui è già stata trovata la libreria nominata.

Annuncio

Per alcune librerie di livello superiore o speciali del sistema operativo (come linux-vdso.so.1), non viene mostrato tale percorso. Tuttavia, finché non viene visualizzato alcun errore per nessuna voce, sai che va bene e disponibile (o preferibile). In effetti, linux-vdso.so.1 è uno speciale oggetto/libreria virtuale condiviso inserito in ogni processo dal kernel Linux, che non ha un file fisico su disco per lo stesso. È lì per rendere le chiamate di sistema più efficienti.

Quindi, rompiamo un po' le cose e rinominiamo una delle librerie richieste in modo che non possa più essere scoperta automaticamente dal binario:

Come puoi vedere, qui abbiamo rinominato/spostato il file da /lib/x86_64-linux-gnu/libbz2.so.1.0 a /lib/x86_64-linux-gnu/libbz2.so.1.0.NOT_PRESENT. Questo ha rotto la nostra applicazione zip e quando proviamo a eseguirla, otteniamo il temuto errore durante il caricamento dell'errore delle librerie condivise. Guardando un po' più da vicino, il messaggio di errore è in realtà piuttosto descrittivo, tuttavia:

zip: errore durante il caricamento delle librerie condivise: libbz2.so.1.0: impossibile aprire il file oggetto condiviso: nessun file o directory di questo tipo

Un ingegnere IT esperto esaminerà sempre attentamente tutti i registri e l'output/informazioni del programma presentate a lui o lei prima di effettuare una chiamata su un problema. Sarebbe utile anche qui, poiché il file richiesto è mostrato chiaramente, libbz2.so.1.0, e anche il problema è mostrato chiaramente. Non c'è nessun file o directory di questo tipo. In altre parole, manca libbz2.so.1.0!

Possiamo anche verificare lo stesso con ldd, come si può vedere nell'immagine sopra. Un chiaro libbz2.so.1.0 => non trovato ci aiuta a sapere cosa sta succedendo. Una volta compreso chiaramente come i binari compilati dinamicamente (la maggior parte dei binari nel sistema operativo sono compilati in questo modo) caricano e richiedono librerie e come vedere se ne manca una (o se ne viene informato tramite il messaggio di errore), le cose non& #8217;non sembra più così complicato.

Pubblicità

Inoltre, una volta che conosciamo il nome della libreria richiesta, una rapida ricerca nel tuo motore di ricerca preferito mostrerà il pacchetto aggiuntivo da installare (o reinstallare) per ottenere il nome della libreria richiesto. Molto spesso, il nome del pacchetto può anche essere interpretato direttamente dal nome della libreria. Tuttavia, in questo caso, il nome per la libreria di runtime è leggermente spostato.

Esistono due tipi di librerie, librerie runtime e librerie di sviluppo. In questo caso, il nome del pacchetto che contiene la libreria libbz2.so.1.0 è probabilmente bzip2, e il tentativo di disinstallazione potrebbe danneggiare vari altri elementi, come si può notare da un lungo elenco di programmi che verranno rimossi se si tenta di disinstallare o elimina il pacchetto bzip2.

Il secondo tipo di libreria è una libreria di sviluppo. Questi sono spesso necessari quando si tenta di compilare programmi e spesso sono ancora più strettamente correlati ai nomi dei file di libreria effettivi. Ad esempio, in Ubuntu, prendi semplicemente il nome della libreria e aggiungi -dev. Ad esempio, se volessimo installare il pacchetto di sviluppo relativo al pacchetto libbz2.so.1.0, potremmo guardare all'installazione di libbz2-dev:

Mentre questa libreria di sviluppo non è direttamente correlata alla nostra libreria runtime libbz2.so.1.0, è utile conoscere la sintassi di denominazione della maggior parte dei nomi dei pacchetti di sviluppo in Ubuntu (prefisso di lib e suffisso di -dev con il nome della libreria tra quelli) per ogni volta che è richiesta una certa libreria di sviluppo (che è più spesso necessaria quando si compila software).

Inoltre, supponi che una libreria in qualche modo si sia rotta. In tal caso, una delle soluzioni rapide più semplici è eliminare il comando sudo apt purge your_library_name (che eliminerebbe completamente la libreria/programma passato), seguito da una reinstallazione utilizzando il comando sudo apt install your_library_name.

E quando ti imbatti in una situazione simile a quella sopra, in cui la disinstallazione della libreria di runtime richiede la disinstallazione/eliminazione del programma principale e in cui tale eliminazione/rimozione è una parte troppo grande del sistema operativo o influenzerebbe troppe altre cose, tu può invece utilizzare un'opzione di reinstallazione:

sudo apt reinstall bzip2

Tuttavia, non è sempre così facile, anche se conoscere quanto sopra (e in particolare la convenzione di denominazione in termini di aggiunta di -dev) aiuta moltissimo nella risoluzione dei problemi e spesso risolverà il problema direttamente.

Aiuta anche molto sapere come controllare le librerie usando ldd e, infine, capire che una libreria è solo un file eseguibile (anche se non direttamente) .so che vive in una sottodirectory di /lib o in /usr/lib o altro directory simili.

A volte, librerie e/o pacchetti sono in conflitto tra loro, o alcuni pacchetti richiedono determinate versioni di librerie, o alcune librerie richiedono altre librerie, a versioni specifiche stesse. Sì, diventa un po' complesso. È anche piuttosto facile, quando diventa così complesso, incasinare leggermente un sistema. A volte, è anche possibile interrompere completamente l'installazione di un sistema operativo a causa dello spostamento di una libreria troppo importante, ecc.

Pubblicità

Spesso è un po' più sicuro creare un collegamento simbolico (un collegamento virtuale con un determinato nome di file, che fa riferimento/collega a un altro file esistente o un altro collegamento simbolico stesso, che a sua volta punta a un file reale) per una libreria mancante in un vecchio versione, ad esempio, e puntando quel collegamento simbolico all'ultima versione installata. Non funziona sempre, ma nel caso in cui fallisce, il collegamento simbolico può essere rimosso, si spera in modo più sicuro (presupponendo che non esistesse alcun collegamento simbolico o file con lo stesso nome in precedenza).

Il modo migliore per risolvere questi problemi più complessi, devi sempre provare prima una soluzione basata su apt (o uno strumento di gestione dei pacchetti simile sul tuo sistema operativo). A questo punto, vorrai anche leggere come utilizzare dkpg per correggere apt, in quanto mostra un modo più granulare per gestire i pacchetti (anche se fai attenzione, poiché un maggiore controllo comporta maggiori responsabilità!).

Se tutto il resto fallisce, prova a creare un collegamento simbolico o anche ad aggiungere manualmente il file della libreria. (Assicurati tre volte che qualsiasi file scaricato sia privo di virus, ad esempio controllandolo con VirusTotal, ed è sempre meglio usare i repository forniti dal fornitore di Linux per scaricare i binari.)

In extremis, potresti anche essere in grado di trovare una libreria in un vicino sistema operativo Linux. Ad esempio, un eseguibile di Ubuntu verrà eseguito su Mint e viceversa. Anche copiare una libreria da un altro PC che possiedi è a volte un approccio praticabile.

Conclusione

Gestione dettagliata della libreria è un'abilità che richiede una vita per imparare. È quasi un'arte. Questo articolo ha fornito le informazioni di base, il know-how e gli strumenti da utilizzare e ha elencato alcuni suggerimenti per la risoluzione dei problemi più avanzati per quando le cose diventano oscure e, prima o poi, lo faranno se sei un utente frequente di Linux che installa regolarmente pacchetti.

La prossima volta che vedrai il messaggio ‘Errore durante il caricamento delle librerie condivise’ errore sulla tua macchina Linux, sarai più attrezzato per capire da dove potrebbe derivare il problema usando uno strumento come ldd, come spiegato in questo articolo. Abbiamo anche esaminato i binari statici rispetto a quelli compilati dinamicamente e come le librerie condivise o integrate si adattano e funzionano con entrambi.

Pubblicità

Se ti è piaciuto questo articolo, potresti anche leggere l'articolo su dpkg collegato sopra e su Come aggiungere i repository Universe, Multiverse e Restricted in Ubuntu.