Ldd è un'utilità della riga di comando di Linux che viene utilizzata nel caso in cui un utente desideri conoscere le dipendenze della libreria condivisa di un eseguibile o anche quella di una libreria condivisa. Potresti aver notato molti file che iniziano con lib* nelle directory /lib e /usr/lib della tua macchina Linux. Questi file sono chiamati librerie. La libreria è una raccolta di risorse come subroutine/funzioni, classi, valori o specifiche di tipo.
Una libreria consente a un programma di utilizzare routine comuni senza il sovraccarico amministrativo di mantenere il codice sorgente o il sovraccarico di elaborazione della loro compilazione ogni volta che il programma viene compilato.
Esistono due tipi di librerie:
Librerie statiche: librerie statiche per programmi completi che non dipendono da librerie esterne per l'esecuzione. La caratteristica dei programmi collegati staticamente è che funzionano senza installare alcun prerequisito. La libreria statica termina con *.a
estensione e queste librerie sono incluse (una copia separata) nei programmi che richiedono le sue funzioni.
Librerie dinamiche: librerie dinamiche per programmi di piccole dimensioni, queste librerie terminano con .so
estensione, un'altra caratteristica dell'utilizzo del collegamento dinamico quando sono in esecuzione molti programmi, può condividere una copia di una libreria anziché occupare memoria con molte copie dello stesso codice. Quindi i programmi recenti utilizzano il collegamento dinamico. In questo articolo, esamineremo i comandi ldd
che viene utilizzato per gestire le librerie condivise.
Librerie condivise
Quando creiamo un programma, abbiamo bisogno di molti pezzi di codice che qualcun altro ha già scritto per eseguire per noi funzioni di routine o specializzate. Questi pezzi di codice sono archiviati in librerie condivise. Per usarli, li colleghiamo al nostro codice, sia quando costruiamo il programma che quando eseguiamo il programma.
Sintassi e opzioni del comando LDD
Il comando ldd stampa le dipendenze degli oggetti condivisi. La sintassi del comando è:
ldd [OPTION]... FILE...
Possiamo usare interruttori di comando ldd che possono essere inseriti nel file
[OPZIONE] posto nel comando sopra:
- -v :stampa tutte le informazioni.
- -d :trasferimento dei dati di processo.
- -r :trasferimento dati di processo e funzione.
- -u :stampa le dipendenze dirette non utilizzate.
Annotare i seguenti punti prima di eseguire il comando:
- Il file, ld-linux.so è il linker o caricatore dinamico che controlla il collegamento o la cache della libreria desiderati per il programma richiesto e lo carica.
- Il file della cache, /etc/ld.so.cache, contiene un elenco di librerie trovate nelle directory specificate in /etc/ld.so.conf. Questo aiuta a fornire collegamenti dinamici più rapidi.
- Il file /etc/ld.so.conf specifica le directory dove cercare le librerie
1) Visualizza le dipendenze del comando
Mostreremo le dipendenze del comando cp.
$ ldd /bin/cp
Output:
linux-vdso.so.1 => (0x00007fffaf3ff000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)
2) Visualizza le dipendenze del comando con i dettagli
Mostreremo le dipendenze di cp
comando con maggiori dettagli usando -v
opzione.
$ ldd -v /bin/cp
Output:
linux-vdso.so.1 => (0x00007fff473ff000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)
libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)
Version information:
/bin/cp:
librt.so.1 (GLIBC_2.2.5) => /lib64/librt.so.1
libattr.so.1 (ATTR_1.1) => /lib64/libattr.so.1
libacl.so.1 (ACL_1.2) => /lib64/libacl.so.1
libacl.so.1 (ACL_1.0) => /lib64/libacl.so.1
libc.so.6 (GLIBC_2.6) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libselinux.so.1:
libdl.so.2 (GLIBC_2.2.5) => /lib64/libdl.so.2
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.8) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/librt.so.1:
libpthread.so.0 (GLIBC_2.2.5) => /lib64/libpthread.so.0
libpthread.so.0 (GLIBC_PRIVATE) => /lib64/libpthread.so.0
libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
/lib64/libacl.so.1:
libattr.so.1 (ATTR_1.0) => /lib64/libattr.so.1
libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.3.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libattr.so.1:
libc.so.6 (GLIBC_2.4) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libc.so.6:
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
/lib64/libdl.so.2:
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
/lib64/libpthread.so.0:
ld-linux-x86-64.so.2 (GLIBC_2.3) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_2.2.5) => /lib64/ld-linux-x86-64.so.2
ld-linux-x86-64.so.2 (GLIBC_PRIVATE) => /lib64/ld-linux-x86-64.so.2
libc.so.6 (GLIBC_2.3.2) => /lib64/libc.so.6
libc.so.6 (GLIBC_PRIVATE) => /lib64/libc.so.6
libc.so.6 (GLIBC_2.2.5) => /lib64/libc.so.6
3) Visualizza le dipendenze dirette non utilizzate del comando
Possiamo visualizzare le dipendenze dirette inutilizzate di cp
comando usando -u
opzione.
$ ldd -u /bin/cp
Output:
Unused direct dependencies:
/lib64/libselinux.so.1
/lib64/librt.so.1
/lib64/libacl.so.1
/lib64/libattr.so.1
4) Display ldd funziona solo su eseguibili dinamici
Visualizzeremo ldd
funziona solo su eseguibili dinamici usando -r
opzione.
$ ldd -r /smart/pycharm-community-2017.3.3/bin/pycharm.sh
Output:
not a dynamic executable
L'output mostrava un chiaro stato di messaggio che il file fornito non è un eseguibile dinamico.
5) ldd con eseguibile da riga di comando standard
Quando proviamo ldd
su un eseguibile da riga di comando standard come ls
, Abbiamo bisogno del percorso completo dell'eseguibile dinamico.
$ ldd ls
Output:
ldd: ./ls: No such file or directory
Vediamo quel ldd
afferma che non riesce a trovare ls
.
$ ldd /bin/ls
Output:
linux-vdso.so.1 => (0x00007fff5cbea000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003a06a00000)
librt.so.1 => /lib64/librt.so.1 (0x0000003a06200000)
libcap.so.2 => /lib64/libcap.so.2 (0x0000003a07600000)
libacl.so.1 => /lib64/libacl.so.1 (0x0000003a13000000)
libc.so.6 => /lib64/libc.so.6 (0x0000003a05200000)
libdl.so.2 => /lib64/libdl.so.2 (0x0000003a05a00000)
/lib64/ld-linux-x86-64.so.2 (0x0000003a04a00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x0000003a05600000)
libattr.so.1 => /lib64/libattr.so.1 (0x0000003a0ea00000)
Ma con il percorso assoluto, ldd
ha funzionato bene.
6) Sapere che un determinato demone eseguibile supporta TCP Wrapper
Per determinare se un determinato demone eseguibile supporta o meno TCP Wrapper, eseguire il comando seguente.
$ sudo ldd /usr/sbin/sshd | grep libwrap
Output:
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f1cc2ac6000)
L'output indica che il demone OpenSSH (sshd) supporta TCP Wrapper.
7) ldd con dipendenza mancante
Possiamo usare il ldd
comando quando un eseguibile non riesce a causa di una dipendenza mancante. Una volta trovata una dipendenza mancante, possiamo installarla o aggiornare la cache con ldconfig
comando.
$ sudo ldd /bin/mv
libacl.so.1 => /lib/libacl.so.1 (0×40016000)
libc.so.6 => /lib/libc.so.6 (0x4001c000)
libattr.so.1 => /lib/libattr.so.1 (0×40141000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0×40000000)
Effettueremo trasferimenti e segnaleremo eventuali oggetti mancanti (solo ELF) digitando sotto il comando.
$ sudo ldd -d path/to/executable_file
Effettueremo riposizionamenti sia per gli oggetti dati che per le funzioni e segnaleremo eventuali oggetti o funzioni mancanti (solo ELF) digitando il comando seguente.
$ sudo ldd -r path/to/executable_file
Errori comuni relativi alla libreria condivisa
1) Errore libreria mancante
Potresti riscontrare un errore di libreria mancante anche se le librerie menzionate sono disponibili nel nuovo percorso di installazione "/opt/newinstall/lib". Questo perché il sistema non è a conoscenza di questa directory per controllare le librerie. Questo può essere risolto in uno dei due modi.
un. Esegui il comando seguente,
$ ldconfig -n /opt/newinstall/lib
b. Puoi vedere la seguente riga di inclusione nel file /etc/ld.so.conf:
includi ld.so.conf.d/*.conf
Quindi, crea un file nella cartella /etc/ld.so.sonf.d, ad esempio newinstall.conf con il seguente contenuto.
/opt/newinstall/lib
Quindi, esegui:
$ ldconfig
2) Errore del linker dinamico, impossibile mappare i file della cache
Ciò potrebbe essere dovuto al file di cache danneggiato. Questo può essere risolto ricostruendo il file della cache usando ldconfig.
$ ldconfig
Comando ldconfig
ldconfig crea i collegamenti e la cache necessari (per l'uso da parte del linker di runtime, ld.so) alle librerie condivise più recenti trovate nelle directory specificate sulla riga di comando, nel file/etc/ld.so.conf, e nelle directory attendibili (/usr/lib e /lib).
Per esempi:
Esegui il comando seguente per impostare i collegamenti corretti per i binari condivisi e ricostruire la cache.
$ ldconfig –v
Eseguire il comando seguente dopo l'installazione di una nuova libreria condivisa aggiornerà correttamente i collegamenti simbolici della libreria condivisa in /lib.
$ ldconfig -n /lib
Il comando seguente stamperà la cache corrente.
$ ldconfig -p
Conclusione
In questo tutorial abbiamo imparato come usare il comando ldd e come usarlo nella riga di comando di Linux. Spero ti sia piaciuto leggere questo tutorial e per favore avvisami se hai suggerimenti.
Leggi anche:
- Comando 8 Linux Tee con esempi
- Come utilizzare il comando Linux Tr con esempi