8 esempi di comandi LDD in Linux
Ldd è un’utilità della riga di comando di Linux che viene utilizzata quando un utente desidera conoscere le dipendenze della libreria condivisa di un eseguibile o anche 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. Una 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 costo amministrativo di mantenere il codice sorgente o il sovraccarico di elaborazione della 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 essere eseguiti. 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 più programmi, Può condividere una copia di una libreria, piuttosto che occupare memoria con più copie dello stesso codice. Quindi i programmi recenti utilizzano collegamenti dinamici. 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 funzioni di routine o specializzate per noi. Questi pezzi di codice sono archiviati in librerie condivise. Per usarli, li colleghiamo al nostro codice, quando costruiamo il programma o quando eseguiamo il programma.
Ordine LDD
Il comando ldd visualizza le dipendenze degli oggetti condivisi. La sintassi del comando è:
ldd [OPTIONS]... FILE...
scelta
- -v : Stampa tutte le informazioni.
- -d: riposiziona i dati di processo.
- -r : riposiziona i dati di processo e la funzione.
- -u : stampa le dipendenze dirette non utilizzate.
Si prega di notare i seguenti punti prima di effettuare l’ordine:
- Il file, ld-linux.so è il linker dinamico o caricatore che controlla il collegamento desiderato o la cache della libreria per il programma richiesto e lo carica.
- Il file cache, /etc/ld.so.cache contiene un elenco di librerie trovate nelle directory specificate in /etc/ld.so.conf. Questo aiuta a garantire un collegamento dinamico più veloce.
- Il file /etc/ld.so.conf specifica le directory in cui cercare le librerie.
Installa ldd
ldd è installato di default nella maggior parte delle distribuzioni Linux. Se ricevi un errore di comando ldd non trovato, installalo usando:
Ubuntu/Debian
apt install libc-bin
Flusso Redhat / CentOS
yum install glibc-common
cappello
dnf install glibc-common
Molla
pacman -S glibc
Come usare il comando ldd
Diamo un’occhiata ad alcuni usi utili del comando ldd.
1. Mostra le dipendenze dei comandi
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. Mostra le dipendenze dell’ordine con i dettagli
Mostreremo le dipendenze di cp
ordina con maggiori dettagli utilizzando -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. Mostra le dipendenze dirette inutilizzate del comando
Possiamo mostrare dipendenze dirette inutilizzate di cp
ordina utilizzando -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
Mostreremo ldd
funziona solo su eseguibili dinamici utilizzando -r
opzione.
ldd -r /smart/pycharm-community-2017.3.3/bin/pycharm.sh
Output:
not a dynamic executable
L’output ha mostrato un chiaro 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
Lo vediamo ldd
dice che non lo trova 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. Scopri che un particolare demone eseguibile supporta TCP Wrapper
Per determinare se un particolare eseguibile daemon supporta o meno TCP Wrapper, eseguire il seguente comando.
sudo ldd /usr/sbin/sshd | grep libwrap
Output:
libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f1cc2ac6000)
L’output indica che il daemon OpenSSH (sshd) supporta TCP Wrapper.
7. ldd con dipendenza mancante
Possiamo usare 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 il comando ldconfig.
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 i trasferimenti e segnaleremo eventuali oggetti mancanti (solo ELF) digitando il comando.
sudo ldd -d path/to/executable_file
Eseguiremo le rilocazioni sia per gli oggetti dati che per le funzioni e segnaleremo eventuali oggetti o funzioni mancanti (solo ELF) digitando il seguente comando.
sudo ldd -r path/to/executable_file
Conclusione
In questo tutorial, abbiamo imparato come utilizzare il comando ldd con esempi.
Grazie per la lettura, si prega di fornire il proprio feedback e suggerimenti nella sezione commenti qui sotto.
Sfoglia il sito all-in-one di Comandi Linux per più apprendimento.