GNU/Linux >> LINUX-Kenntnisse >  >> Linux

8 Beispiele für LDD-Befehle unter Linux

Ldd ist ein Linux-Befehlszeilendienstprogramm, das verwendet wird, wenn ein Benutzer die Abhängigkeiten einer gemeinsam genutzten Bibliothek einer ausführbaren Datei oder sogar der einer gemeinsam genutzten Bibliothek kennen möchte. Sie haben vielleicht viele Dateien bemerkt, die mit lib* in den Verzeichnissen /lib und /usr/lib Ihres Linux-Rechners beginnen. Diese Dateien werden Bibliotheken genannt. Eine Bibliothek ist eine Sammlung von Ressourcen wie Unterroutinen/Funktionen, Klassen, Werten oder Typspezifikationen.

Eine Bibliothek ermöglicht es einem Programm, allgemeine Routinen zu verwenden, ohne den Verwaltungsaufwand für die Pflege des Quellcodes oder den Verarbeitungsaufwand für die Kompilierung bei jeder Kompilierung des Programms.

Es gibt zwei Arten von Bibliotheken:

Statische Bibliotheken: statische Bibliotheken für vollständige Programme, die nicht von externen Bibliotheken abhängig sind, um ausgeführt zu werden. Das Merkmal von statisch gelinkten Programmen ist, dass sie funktionieren, ohne irgendwelche Voraussetzungen zu installieren. Die statische Bibliothek endet mit *.a Erweiterung und diese Bibliotheken sind (eine separate Kopie) in den Programmen enthalten, die ihre Funktionen benötigen.

Dynamische Bibliotheken: dynamische Bibliotheken für winzige Programme. Diese Bibliotheken enden mit .so Erweiterung, Ein weiteres Merkmal der Verwendung von dynamischem Linken, wenn viele Programme ausgeführt werden, Es kann eine Kopie einer Bibliothek gemeinsam nutzen, anstatt den Speicher mit vielen Kopien desselben Codes zu belegen. Die neueren Programme verwenden also dynamische Verknüpfungen. In diesem Artikel werden wir die Befehle ldd durchgehen die verwendet wird, um die gemeinsam genutzten Bibliotheken zu verwalten.

Gemeinsam genutzte Bibliotheken

Wenn wir ein Programm erstellen, benötigen wir viele Codeteile, die jemand anderes bereits geschrieben hat, um Routine- oder Spezialfunktionen für uns auszuführen. Diese Codeteile werden in gemeinsam genutzten Bibliotheken gespeichert. Um sie zu verwenden, verknüpfen wir sie mit unserem Code, entweder wenn wir das Programm erstellen oder wenn wir das Programm ausführen.

LDD-Befehlssyntax und -optionen

Der Befehl ldd gibt gemeinsame Objektabhängigkeiten aus. Die Syntax des Befehls lautet:

ldd [OPTION]... FILE...

Wir können ldd-Befehlsschalter verwenden, die in die eingefügt werden können
[OPTION] Stelle im obigen Befehl:

  • -v :Alle Informationen drucken.
  • -d :Datenverschiebung verarbeiten.
  • -r :Prozessdaten und Funktionsverschiebung.
  • -u :ungenutzte direkte Abhängigkeiten ausgeben.

Bitte notieren Sie sich folgende Punkte, bevor Sie den Befehl durchgehen:

- Die Datei ld-linux.so ist der dynamische Linker oder Loader, der nach dem gewünschten Link- oder Bibliotheks-Cache für das angeforderte Programm sucht und ihn lädt.

- Die Cache-Datei /etc/ld.so.cache enthält eine Liste von Bibliotheken, die in den Verzeichnissen gefunden werden, die in /etc/ld.so.conf angegeben sind. Dies trägt zu einer schnelleren dynamischen Verknüpfung bei.

- Die Datei /etc/ld.so.conf gibt die Verzeichnisse an, in denen nach Bibliotheken gesucht werden soll

1) Abhängigkeiten des Befehls anzeigen

Wir werden die Abhängigkeiten des cp-Befehls anzeigen.

$ 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) Abhängigkeiten des Befehls mit Details anzeigen

Wir werden die Abhängigkeiten von cp anzeigen Befehl mit mehr Details mit -v Option.

$ 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) Nicht verwendete direkte Abhängigkeiten des Befehls anzeigen

Wir können ungenutzte direkte Abhängigkeiten von cp anzeigen Befehl mit -u Option.

$ 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) LDD anzeigen funktioniert nur bei dynamischen ausführbaren Dateien

Wir zeigen ldd an funktioniert nur bei dynamischen ausführbaren Dateien mit -r Option.

$  ldd -r /smart/pycharm-community-2017.3.3/bin/pycharm.sh
    Output:
     not a dynamic executable

Die Ausgabe zeigte eine klare Meldung an, dass die bereitgestellte Datei keine dynamische ausführbare Datei ist.

5) ldd mit ausführbarer Standard-Befehlszeile

Wenn wir ldd versuchen auf einer ausführbaren Standardbefehlszeile wie ls , Wir benötigen den vollständigen Pfad zur dynamischen ausführbaren Datei.

$ ldd ls
    Output:
    ldd: ./ls: No such file or directory

Wir sehen dieses ldd gibt an, dass ls nicht gefunden werden kann .

$ 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)

Aber mit dem absoluten Pfad, ldd hat gut funktioniert.

6) Wissen, dass ein bestimmter ausführbarer Daemon TCP Wrapper unterstützt

Führen Sie den folgenden Befehl aus, um festzustellen, ob ein bestimmter ausführbarer Daemon TCP Wrapper unterstützt oder nicht.

$ sudo ldd /usr/sbin/sshd | grep libwrap
    Output:
    libwrap.so.0 => /lib64/libwrap.so.0 (0x00007f1cc2ac6000)

Die Ausgabe zeigt an, dass der OpenSSH (sshd)-Daemon TCP Wrapper unterstützt.

7) ldd mit fehlender Abhängigkeit

Wir können den ldd verwenden Befehl, wenn eine ausführbare Datei aufgrund einer fehlenden Abhängigkeit fehlschlägt. Sobald wir eine fehlende Abhängigkeit gefunden haben, können wir sie installieren oder den Cache mit ldconfig aktualisieren Befehl.

$ 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)

Wir werden Umzüge durchführen und alle fehlenden Objekte (nur ELF) melden, indem Sie den folgenden Befehl eingeben.

$ sudo ldd -d path/to/executable_file

Wir werden Verschiebungen sowohl für Datenobjekte als auch für Funktionen durchführen und alle fehlenden Objekte oder Funktionen melden (nur ELF), indem Sie den folgenden Befehl eingeben.

$ sudo ldd -r path/to/executable_file

Häufige Fehler im Zusammenhang mit gemeinsam genutzten Bibliotheken

1) Fehlender Bibliotheksfehler

Möglicherweise tritt ein Fehler wegen fehlender Bibliothek auf, obwohl die genannten Bibliotheken im neuen Installationspfad „/opt/newinstall/lib“ verfügbar sind. Dies liegt daran, dass das System dieses Verzeichnis nicht kennt, um nach Bibliotheken zu suchen. Dies kann auf zwei Arten behoben werden.

a. Führen Sie den folgenden Befehl aus,

$ ldconfig -n /opt/newinstall/lib

b. Sie können die folgende Include-Zeile in der Datei /etc/ld.so.conf sehen:

schließen Sie ld.so.conf.d/*.conf

ein

Erstellen Sie also eine Datei im Ordner /etc/ld.so.sonf.d, sagen wir newinstall.conf mit folgendem Inhalt.

/opt/newinstall/lib

Führen Sie dann Folgendes aus:

$ ldconfig

2) Dynamischer Linker-Fehler, Cache-Dateien können nicht zugeordnet werden

Dies kann an der beschädigten Cache-Datei liegen. Dies kann behoben werden, indem die Cache-Datei mit ldconfig neu erstellt wird.

$ ldconfig

ldconfig-Befehl

ldconfig erstellt die erforderlichen Links und den Cache (zur Verwendung durch den Laufzeit-Linker ld.so) zu den neuesten gemeinsam genutzten Bibliotheken, die in den Verzeichnissen gefunden werden, die auf der Befehlszeile angegeben sind, in der Datei /etc/ld.so.conf und in den vertrauenswürdigen Verzeichnissen (/usr/lib und /lib).

Zum Beispiel:

Führen Sie den folgenden Befehl aus, um die richtigen Links für die freigegebenen Binärdateien einzurichten und den Cache neu zu erstellen.

$ ldconfig –v

Führen Sie den folgenden Befehl aus, nachdem die Installation einer neuen gemeinsam genutzten Bibliothek die symbolischen Links der gemeinsam genutzten Bibliothek in /lib.

ordnungsgemäß aktualisiert hat
$ ldconfig -n /lib

Der folgende Befehl druckt den aktuellen Cache.

$ ldconfig -p

Schlussfolgerung

In diesem Tutorial haben wir gelernt, wie man den Befehl ldd verwendet und wie man ihn in der Linux-Befehlszeile verwendet. Ich hoffe, Sie haben es genossen, dieses Tutorial zu lesen, und geben Sie uns bitte Bescheid, wenn Sie Vorschläge haben.

Lesen Sie auch:

  • 8 Linux-Tee-Befehl mit Beispielen
  • Verwendung des Linux-Tr-Befehls mit Beispielen

Linux
  1. 8 Linux TR-Befehlsbeispiele

  2. rm-Befehlsbeispiele unter Linux

  3. ps-Befehlsbeispiele in Linux

  4. sa-Befehlsbeispiele in Linux

  5. w Befehlsbeispiele unter Linux

9 Beispiele für tee-Befehle unter Linux

9 diff-Befehlsbeispiele in Linux

Linux-IP-Befehl mit Beispielen

Linux-Befehl ldd mit Beispielen erklärt

15 Linux-PS-Befehl mit Beispielen

id-Befehlsbeispiele in Linux