Linux ldd-Befehl
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:
- Für ausführbare Dateien im ELF-Format analysiert ldd ihr dynamisches Segment.
- Es prüft die DT_NEEDED-Einträge, um die erforderlichen Shared Libraries zu bestimmen.
- Es sucht nach diesen Bibliotheksdateien in den System-Bibliothekspfaden.
- 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
-
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
- Alternativen:
-
Statisch gelinkte Programme: Bei vollständig statisch gelinkten Programmen zeigt ldd „not a dynamic executable“ an.
-
Cross-Compilation-Umgebungen: In Cross-Compilation-Umgebungen müssen Sie das ldd-Tool verwenden, das der Zielplattform entspricht.
-
Häufige Fehler:
ldd: ./program: No such file or directory→ Kann an einem fehlenden Interpreter liegen oder daran, dass das Programm selbst nicht existiertldd: 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.
Weitere Erweiterungen
Linux-Befehlsenzyklopädie