Gibt es eine Möglichkeit zu bestimmen, welche Pakete oder Bibliotheken geladen werden sollen, um eine ausführbare Datei zu unterstützen?

11

Es gibt eine ausführbare Datei, die ich auf einem Computer installieren möchte, den ich nicht neu kompilieren kann und die nicht als Paket erstellt wurde, und ich möchte die Bibliotheken herunterladen, die zum Ausführen erforderlich sind.

Teil des Ausgangs Im Folgenden finden Sie vom Laufen lddauf sie

libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)
libcairo.so.2 => /usr/lib/i386-linux-gnu/libcairo.so.2 (0xb6f64000)
libatk-1.0.so.0 => /usr/lib/i386-linux-gnu/libatk-1.0.so.0 (0xb6f43000)
libsqlite3.so.0 => /usr/lib/i386-linux-gnu/libsqlite3.so.0 (0xb6e9e000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6cf4000)
/lib/ld-linux.so.2 (0xb786e000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0xb6cd3000)
libgio-2.0.so.0 => /usr/lib/i386-linux-gnu/libgio-2.0.so.0 (0xb6b7c000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6b4f000)

Gibt es ein Tool, das anhand dieser Informationen auswählen kann, welche Pakete heruntergeladen werden sollen, oder besser nur die aufgelisteten Bibliotheken und ihre Abhängigkeiten extrahieren soll, um die Festplattennutzung zu minimieren? Das System läuft auf einer kopflosen VM und das Programm wird über VNC angezeigt.

Obwohl ich vermute, dass ein vollwertiger Grafikdesktop die meisten benötigten Bibliotheken bereitstellt, möchte ich nur die erforderlichen Bibliotheken, ihre Abhängigkeiten und gerade genug des X Windows-Pakets herunterladen, um dies zu unterstützen.

vfclists
quelle
1
Welches Betriebssystem? Die Pakete und ihre Namen sowie der Paketmanager ändern sich zwischen den Distributionen (und dies setzt voraus, dass Sie eine Art Linux ausführen).
Terdon
Es ist Debian und Ubuntu in diesem Fall
vfclists
In diesem Fall sollte meine Antwort für Sie funktionieren.
Terdon
Tatsächlich bin ich gerade dabei, es verspätet zu testen. Ich habe es einfach vergessen und nur eine ähnliche Frage gestellt, die dazu führte, dass diese Frage als die am
häufigsten

Antworten:

14

Sie haben nicht gesagt, welches Betriebssystem Sie verwenden, daher gehe ich von Linux aus und verwende Debian als Beispiel. Die schnelle Antwort auf Ihre Frage lautet meines Wissens nein. Dies könnte jedoch eine nützliche Problemumgehung sein:

ldd your_prog | awk '{print $1}' | sed 's/\..*//' | 
  while read n; do echo "----- $n ----"; apt-cache search ^$n; done

Dadurch wird die lddAusgabe analysiert und anschließend ausgeführt apt-cache(durch das entsprechende für Ihr Betriebssystem ersetzt), um die Repositorys nach Paketen zu durchsuchen, deren Name und Beschreibung den ersten Teil des von zurückgegebenen Bibliotheksnamens enthalten ldd.

Dies wird nicht alle finden und für einige (wie libc) zu viele Ergebnisse liefern, aber es könnte hilfreich sein.


@FaheemMitha wies darauf hin, dass apt-filedies ein besserer Weg sein könnte. Beispielsweise:

ldd /bin/bash | awk '/=>/{print $(NF-1)}'  | 
 while read n; do apt-file search $n; done |
  awk '{print $1}' | sed 's/://' | sort | uniq

Dadurch wird eine Liste der Paketnamen zurückgegeben, die die verknüpften Bibliotheken bereitstellen.

terdon
quelle
1
apt-file searchauf der eigentlichen Datei auf der rechten Seite des Pfeils könnte effektiver sein.
Faheem Mitha
@FaheemMitha sehr guter Punkt, danke. Antwort bearbeitet.
Terdon
Wie kann der Befehl angepasst werden, um die Existenz der Bibliothek auf dem System zu testen und diejenigen zu finden, die heruntergeladen werden müssen? Ich denke, die Frage, die ich kürzlich gestellt habe, ist eher in diese Richtung. Ich bitte um Wiedereröffnung.
vfclists
@vfclists sind es nicht wirklich wert, nur apt-get installalle und alle, die bereits installiert sind, werden ignoriert.
Terdon
Der Grund ist, eine VM ohne überflüssige Bibliotheken für schnelle Downloads zu erstellen. Paketinstallationen enthalten viele unnötige Elemente, und ich benötige nur die Bibliotheksdateien und ihre Abhängigkeiten, die von den ausführbaren Dateien benötigt werden. Außerdem habe ich die Möglichkeit, meine Bash- und Linux-Kenntnisse zu verbessern. Keine Python.
vfclists
3

Die Antwort von @ terdon ist großartig, aber es ist noch einfacher, dies zu tun, wenn es dpkg-queryanders apt-fileals standardmäßig auf Debian-Systemen installiert ist.

ldd /bin/bash | awk '/=>/{print $(NF-1)}' | while read n; do dpkg-query -S $n; done | sed 's/^\([^:]\+\):.*$/\1/' | uniq

Dies erzeugt eine Liste von Paketen.

jcoffland
quelle
1

Am besten finden Sie ein Paket, das Ihre Distribution tatsächlich unterstützt. Aber wenn das bei Ihnen nicht funktioniert, kenne ich nur einen anderen Weg.

Führen Sie ldd so aus, wie Sie es getan haben, und installieren Sie diese Abhängigkeiten manuell.

Beispielsweise libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)

Für mich würde es bedeuten, zu installieren apt-get install libpango:i386und zu beten, dass die Version in Debian instabil gut genug ist.

Sie müssten jede Zeile von ldd, Google, durchgehen, in Ihren verfügbaren Repositories nachsehen und im Grunde genommen Glück haben. Dann installieren Sie sie einzeln. Bis das Programm tatsächlich läuft. ldd funktioniert jedoch nur für "einfache" Programme. Programme, die Plugins aufrufen oder beliebigen Code ausführen, sind insgesamt eine andere Sache. Für diese müssen Sie von der Konsole aus ausführen und die Abstürze / Fehler beheben, sobald sie auftreten.

Das heißt, eine nur binäre ausführbare Datei ist schrecklich schwer zu pflegen. Vielleicht möchten Sie etwas anderes verwenden. Wenn Ihre Distribution ein wenig voraus ist oder ein wenig hinter dem System, das diese ausführbare Datei erstellt hat, wird sie möglicherweise nie zum Laufen gebracht.

coteyr
quelle