Direkte Abhängigkeiten von gemeinsam genutzten Objekten einer Linux-Binärdatei ermitteln?


169

Wie kann ich die direkten Abhängigkeiten von gemeinsam genutzten Objekten einer Linux-Binärdatei im ELF-Format leicht herausfinden?

Ich kenne das ldd-Tool, aber es scheint alle Abhängigkeiten einer Binärdatei auszugeben, einschließlich der Abhängigkeiten aller gemeinsam genutzten Objekte, von denen die Binärdatei abhängig ist.


Antworten:


261

Sie können readelfdie ELF-Header untersuchen. readelf -dlistet die direkten Abhängigkeiten als NEEDEDAbschnitte auf.

 $ readelf -d elfbin

Dynamic section at offset 0xe30 contains 22 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libssl.so.1.0.0]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x000000000000000c (INIT)               0x400520
 0x000000000000000d (FINI)               0x400758
 ...

20
Das ist toll. Im Gegensatz zu ldd kann readelf eine plattformübergreifende Binärdatei überprüfen (dh eine ausführbare ARM-Datei unter x86-64 Linux untersuchen)
Robert Calhoun,

86

Wenn Sie Abhängigkeiten rekursiv suchen möchten (einschließlich Abhängigkeiten von Abhängigkeiten, Abhängigkeiten von Abhängigkeiten von Abhängigkeiten usw.)…

Sie können den lddBefehl verwenden. ldd - Abhängigkeiten der gemeinsam genutzten Bibliothek drucken


5
Der Befehl ldd berechnet Abhängigkeiten von Abhängigkeiten, was ich nicht möchte.
Kostenlose Gnus

11
Für mich funktioniert das gut. Und es sagt Ihnen sogar, welche der Bibliotheken gefunden werden konnte und welche nicht.
Philipp F

2
ldd würde mit einer ausführbaren Datei nicht funktionieren - nur um die Abhängigkeiten von gemeinsam genutzten Bibliotheken herauszufinden, ist es nützlich.
Tuxdude

2
Tuxdude, warum denkst du so? Was ist der Grund für die Unbrauchbarkeit von ldd für ausführbare ELF-Dateien?
Vitaly Isaev

Dies ist fantastisch, um erforderliche gemeinsam genutzte Bibliotheken von der Entwicklungsmaschine in das Bereitstellungsarchiv zu kopieren.
Tomáš Zato - Wiedereinsetzung Monica

30

Das objdumpTool kann Ihnen diese Informationen mitteilen. Wenn Sie objdumpmit dem aufrufen-x Option , damit alle Header ausgegeben werden, finden Sie die Abhängigkeiten der gemeinsam genutzten Objekte gleich zu Beginn im "Dynamischen Abschnitt".

Wenn Sie beispielsweise objdump -x /usr/lib/libXpm.so.4auf meinem System ausgeführt werden, erhalten Sie im Abschnitt "Dynamisch" die folgenden Informationen:

Dynamic Section:
  NEEDED               libX11.so.6
  NEEDED               libc.so.6
  SONAME               libXpm.so.4
  INIT                 0x0000000000002450
  FINI                 0x000000000000e0e8
  GNU_HASH             0x00000000000001f0
  STRTAB               0x00000000000011a8
  SYMTAB               0x0000000000000470
  STRSZ                0x0000000000000813
  SYMENT               0x0000000000000018
  PLTGOT               0x000000000020ffe8
  PLTRELSZ             0x00000000000005e8
  PLTREL               0x0000000000000007
  JMPREL               0x0000000000001e68
  RELA                 0x0000000000001b38
  RELASZ               0x0000000000000330
  RELAENT              0x0000000000000018
  VERNEED              0x0000000000001ad8
  VERNEEDNUM           0x0000000000000001
  VERSYM               0x00000000000019bc
  RELACOUNT            0x000000000000001b

Die direkten Abhängigkeiten von gemeinsam genutzten Objekten werden als 'NEEDED'-Werte aufgeführt. Also im obigen Beispiel libXpm.so.4braucht mein System nur libX11.so.6und libc.so.6.

Es ist wichtig zu beachten, dass dies nicht bedeutet, dass alle Symbole, die für die Übergabe der Binärdatei benötigt objdumpwerden, in den Bibliotheken vorhanden sind, sondern zumindest, welche Bibliotheken der Loader beim Laden der Binärdatei zu laden versucht.


13

ldd -v druckt den Abhängigkeitsbaum im Abschnitt "Versionsinformationen:". Der erste Block in diesem Abschnitt sind die direkten Abhängigkeiten der Binärdatei.

Siehe Hierarchisches ldd (1)


Was ist der Unterschied zwischen diesem und objdump -x <binary> | grep "NEEDED"? Ich meine, beide sind fast genau gleich, ich bekomme nur eine .soDatei mehr lddals objdump. Die Tatsache, dass die Ergebnisse nicht dieselben sind, lässt mich fragen, welche Methode genauer ist.
m4l490n vor
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.