Linux ldd-Befehl

Linux 命令大全Linux-Befehlsenzyklopädie


ldd (List Dynamic Dependencies) ist ein sehr nützliches Kommandozeilenwerkzeug in Linux-Systemen, das verwendet wird, um die dynamischen Linkbibliotheken anzuzeigen, von denen ein Programm oder eine gemeinsam genutzte Bibliothek abhängt. Wenn Sie ein Programm unter Linux ausführen, muss das System verschiedene gemeinsam genutzte Bibliotheken (.so-Dateien) laden, von denen das Programm abhängt; ldd ist das Werkzeug, mit dem diese Abhängigkeitsbeziehungen angezeigt werden.


Grundlegende Syntax des ldd-Befehls

ldd [选项] 可执行文件或共享库

Häufige Optionen und Parameterbeschreibungen

Option Beschreibung
-v Detaillierte Versionsinformationen anzeigen
-u Unbenutzte direkte Abhängigkeiten anzeigen
-d Relokation durchführen und fehlende Funktionen melden
-r Relokation durchführen und fehlende Funktionen und Daten melden
--help Hilfeinformationen anzeigen

Wie der ldd-Befehl funktioniert

ldd ist eigentlich ein Skript, das das Zielprogramm ausführt, indem es spezielle Umgebungsvariablen setzt, sodass das Programm beim Laden Informationen über seine abhängigen Bibliotheken anzeigt, anstatt normal ausgeführt zu werden. Genauer gesagt:

  1. Für ausführbare Dateien im ELF-Format analysiert ldd ihr dynamisches Segment.
  2. Es prüft die DT_NEEDED-Einträge, um die erforderlichen Shared Libraries zu bestimmen.
  3. Es sucht nach diesen Bibliotheksdateien in den System-Bibliothekspfaden.
  4. Es zeigt den vollständigen Pfad und die Speicheradresszuordnung jeder Bibliothek an.

Anwendungsbeispiele

Beispiel 1: Anzeigen der Abhängigkeiten eines einfachen Programms

ldd /bin/ls

Typische Ausgabe:

linux-vdso.so.1 (0x00007ffd5a3f0000)
libselinux.so.1 => /lib/x86_64-linux-gnu/libselinux.so.1 (0x00007f8e4a3b0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8e4a1c0000)
libpcre2-8.so.0 => /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0 (0x00007f8e4a130000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8e4a120000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8e4a400000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f8e4a100000)

Beispiel 2: Überprüfen ungenutzter direkter Abhängigkeiten

ldd -u /usr/bin/python3

Beispiel 3: Anzeigen von Abhängigkeiten im ausführlichen Modus

ldd -v /usr/bin/gcc

Praktische Anwendungsszenarien

Szenario 1: Beheben von „library not found“-Fehlern

Wenn ein Programm nicht ausgeführt werden kann, weil eine Bibliothek fehlt, kann ldd helfen, das Problem schnell zu lokalisieren:

ldd ./my_program | grep "not found"

Szenario 2: Prüfen auf Bibliotheksversionskonflikte

ldd -r ./my_program

Szenario 3: Überprüfen, ob der Bibliothekspfad korrekt ist

ldd /path/to/your/executable | awk '{print $3}' | xargs ls -la

Hinweise und häufige Probleme

  1. Sicherheitswarnung: Verwenden Sie ldd nicht bei nicht vertrauenswürdigen ausführbaren Dateien, da es tatsächlich versucht, Teile des Programmcodes auszuführen.

    • Alternativen:objdump -p /path/to/program | grep NEEDED
  2. Statisch gelinkte Programme: Bei vollständig statisch gelinkten Programmen zeigt ldd „not a dynamic executable“ an.

  3. Cross-Compilation-Umgebungen: In Cross-Compilation-Umgebungen müssen Sie das ldd-Tool verwenden, das der Zielplattform entspricht.

  4. Häufige Fehler:

    • ldd: ./program: No such file or directory→ Kann an einem fehlenden Interpreter liegen oder daran, dass das Programm selbst nicht existiert
    • ldd: exited with unknown exit code→ Das Programm kann zur Laufzeit abstürzen

Erweiterte Tipps

1. Verwenden Sie readelf, um detailliertere Abhängigkeitsinformationen anzuzeigen

readelf -d /path/to/program | grep NEEDED

2. Verwenden Sie die Umgebungsvariable LD_TRACE_LOADED_OBJECTS

LD_TRACE_LOADED_OBJECTS=1 /path/to/program

3. Überprüfen Sie den Bibliotheksabhängigkeitsbaum

ldd /path/to/library.so | awk '{print $3}' | xargs ldd

Zusammenfassung

ldd ist ein unverzichtbares Werkzeug in der Linux-Systemadministration und beim Programmdebugging. Es kann:

  • Die Abhängigkeitsbeziehungen dynamischer Bibliotheken eines Programms schnell anzeigen
  • Helfen, Probleme mit fehlenden Bibliotheken oder Versionskonflikten zu lösen
  • Überprüfen, ob die Laufzeitumgebung des Programms vollständig ist
  • Bei der Softwarepaketierung und -bereitstellung unterstützen

Wenn Sie die Verwendung des ldd-Befehls beherrschen, kann dies Ihre Effizienz bei der Lösung von Abhängigkeitsproblemen in der Linux-Umgebung erheblich verbessern.


Linux 命令大全Linux-Befehlsenzyklopädie

Weitere Erweiterungen