GNU/Linux >> Linux Esercitazione >  >> Linux

8 Esempi di comandi LDD in Linux

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

Linux
  1. 7 Esempi di comandi Linux df

  2. Esempi di comandi rm in Linux

  3. ps Esempi di comandi in Linux

  4. sa Esempi di comandi in Linux

  5. w Esempi di comandi in Linux

9 Esempi di comandi tee in Linux

9 esempi di comandi diff in Linux

Comando IP Linux con esempi

Comando Linux ldd spiegato con esempi

15 Comando Linux ps con esempi

Esempi di comandi id in Linux