Czy istnieje sposób ustalenia, które pakiety lub biblioteki powinny zostać załadowane w celu obsługi pliku wykonywalnego?


11

Istnieje plik wykonywalny, który chcę zainstalować na komputerze, którego nie mogę ponownie skompilować, a który nie został zbudowany jako pakiet, i chcę pobrać biblioteki wymagane do ich uruchomienia.

Poniżej znajduje się część wyniku działania lddna nim

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)

Czy istnieje narzędzie, które może wykorzystać te informacje do wybrania pakietów, które należy pobrać, lub jeszcze lepiej wyodrębnić tylko wymienione biblioteki i ich zależności, aby zminimalizować użycie dysku? System działa na bezgłowej maszynie wirtualnej, a program będzie wyświetlany za pośrednictwem VNC.

Chociaż podejrzewam, że pulpit z pełną grafiką dostarczy większość potrzebnych bibliotek, chcę pobrać tylko wymagane biblioteki, ich zależności i tylko tyle pakietu X Windows, aby go obsługiwać.


1
Jaki system operacyjny Pakiety i ich nazwy, a także menedżer pakietów zmieniają się między dystrybucjami (i to przy założeniu, że korzystasz z Linuksa).
terdon

W tym przypadku chodzi o Debian i Ubuntu
vfclists

W takim przypadku moja odpowiedź powinna Ci pomóc.
terdon

W rzeczywistości mam zamiar to sprawdzić z opóźnieniem. Po prostu zapomniałem o tym i po prostu zadałem podobne pytanie, które spowodowało, że to pytanie
okazało się

Odpowiedzi:


14

Nie powiedziałeś, jakiego systemu operacyjnego używasz, więc założę Linuxa i użyję Debiana jako przykładu. O ile wiem, szybka odpowiedź na twoje pytanie jest nie. Może to być przydatne obejście:

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

Spowoduje to przeanalizowanie danych lddwyjściowych, a następnie uruchomienie apt-cache(zastąp to odpowiednikiem dla twojego systemu operacyjnego), aby przeszukać repozytoria w poszukiwaniu pakietów, których nazwa i opis zawiera pierwszą część nazwy biblioteki zwróconej przez ldd.

To nie znajdzie wszystkich i da zbyt wiele wyników dla niektórych (jak libc), ale może być pomocne.


@FaheemMitha wskazał, że apt-filemoże to być lepszy sposób. Na przykład:

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

To zwróci listę nazw pakietów udostępniających połączone biblioteki.


1
apt-file searchna rzeczywistym pliku po prawej stronie strzałki może być bardziej skuteczny.
Faheem Mitha

@FaheemMitha bardzo dobry punkt, dzięki. Odpowiedź edytowana.
terdon

W jaki sposób można dostosować polecenie, aby przetestować obecność biblioteki w systemie, aby znaleźć te, które należy pobrać? Myślę, że pytanie, które ostatnio zadałem, brzmi bardziej podobnie. Proszę o ponowne otwarcie.
vfclists

@vfclists nie jest tego warte, tylko apt-get installwszystkie z nich i wszystkie już zainstalowane zostaną zignorowane.
terdon

Powodem jest utworzenie maszyny wirtualnej bez zbędnych bibliotek do szybkiego pobierania. Instalacje pakietów zawierają wiele niepotrzebnych elementów i potrzebuję tylko plików bibliotek i ich zależności wymaganych przez pliki wykonywalne. Daje mi to również możliwość doskonalenia umiejętności bash i Linux. Bez pytona.
vfclists

3

Odpowiedź @ terdona jest świetna, ale jeszcze łatwiej jest to zrobić przy użyciu, w dpkg-queryprzeciwieństwie apt-filedo domyślnie instalowanego w systemach Debian.

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

To tworzy listę pakietów.


1

Najlepiej jest znaleźć pakiet, który faktycznie obsługuje Twoją dystrybucję. Ale jeśli to ci nie pomoże, to znam tylko jeden inny sposób.

Uruchom ldd, jak masz, a następnie ręcznie zainstaluj te zależności.

Na przykład libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)

Dla mnie oznaczałoby to zainstalowanie apt-get install libpango:i386i modlenie się, aby wersja niestabilna w Debianie była wystarczająco dobra.

Musisz przejrzeć każdą linię ldd, Google, zajrzeć do dostępnych repozytoriów i po prostu mieć szczęście. Następnie zainstaluj je jeden po drugim. Do czasu uruchomienia programu. ldd działa jednak tylko w przypadku „prostych” programów. Programy wywołujące wtyczki lub uruchamiające dowolny kod to zupełnie inna sprawa. W przypadku tych musisz uruchomić z konsoli i naprawić awarie / błędy, gdy się zdarzają.

To powiedziawszy, binarny plik wykonywalny jest strasznie trudny do utrzymania. Możesz rozważyć użycie czegoś innego. Jeśli twoja dystrybucja jest trochę przed tobą, lub trochę za systemem, który zbudował ten plik wykonywalny, możesz go nigdy nie uruchomić.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.