Apakah ada cara untuk menentukan paket atau pustaka apa yang harus dimuat untuk mendukung yang dapat dieksekusi?

11

Ada yang dapat dieksekusi yang ingin saya instal di komputer yang saya tidak bisa mengkompilasi ulang yang tidak dibangun sebagai sebuah paket, dan saya ingin mengunduh perpustakaan yang diperlukan untuk menjalankannya.

Di bawah ini adalah bagian dari output dari berjalan ldddi atasnya

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)

Apakah ada alat yang dapat menggunakan informasi ini untuk memilih paket mana yang harus diunduh atau lebih baik lagi mengekstrak hanya perpustakaan yang terdaftar dan dependensinya, untuk meminimalkan penggunaan disk? Sistem berjalan pada VM tanpa kepala dan program akan ditampilkan melalui VNC.

Walaupun saya curiga desktop grafis yang penuh sesak akan memasok sebagian besar pustaka yang diperlukan, saya hanya ingin mengunduh pustaka yang diperlukan, dependensinya, dan hanya cukup paket X Windows untuk mendukungnya.

vfclists
sumber
1
OS apa? Paket-paket dan nama-nama mereka serta manajer paket berubah di antara distribusi (dan ini dengan asumsi Anda menjalankan beberapa jenis Linux).
terdon
Ini adalah Debian dan Ubuntu dalam kasus ini
vfclists
Dalam hal itu, jawaban saya harus bekerja untuk Anda.
terdon
Sebenarnya saya baru akan mengujinya, terlambat. Saya jelas lupa tentang hal itu dan hanya mengajukan pertanyaan serupa yang menyebabkan yang satu ini ditampilkan sebagai pertanyaan terkait teratas, LOL
vfclists

Jawaban:

14

Anda belum mengatakan OS mana yang Anda gunakan, jadi saya akan menganggap Linux dan akan menggunakan Debian sebagai contoh. Jawaban cepat untuk pertanyaan Anda tidak sejauh yang saya tahu. Ini mungkin solusi yang berguna:

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

Ini akan menguraikan lddoutput dan kemudian menjalankan apt-cache(ganti dengan yang setara untuk OS Anda) untuk mencari repositori untuk paket-paket yang nama dan deskripsinya berisi bagian pertama dari nama perpustakaan yang dikembalikan oleh ldd.

Ini tidak akan menemukan semuanya dan akan memberikan terlalu banyak hasil untuk beberapa (seperti libc) tetapi ini bisa membantu.


@FaheemMitha menunjukkan bahwa apt-filemungkin itu cara yang lebih baik. Sebagai contoh:

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

Itu akan mengembalikan daftar nama paket yang menyediakan pustaka yang ditautkan.

terdon
sumber
1
apt-file searchpada file sebenarnya di sisi kanan panah mungkin lebih efektif.
Faheem Mitha
@FaheemMitha poin yang sangat bagus, terima kasih. Jawaban diedit.
terdon
Bagaimana perintah dapat disesuaikan untuk menguji keberadaan perpustakaan pada sistem untuk menemukan yang perlu diunduh? Saya pikir pertanyaan saya baru-baru ini lebih sejalan. Saya meminta agar dibuka kembali.
vfclists
@ vfclists benar-benar tidak layak, hanya apt-get installsemua dari mereka dan yang sudah diinstal akan diabaikan.
terdon
Alasannya adalah untuk membuat VM tanpa pustaka berlebihan untuk unduhan cepat. Paket instalasi berisi banyak item yang tidak perlu dan saya hanya perlu file perpustakaan dan dependensinya yang diperlukan oleh executable. Ini juga memberi saya kesempatan untuk mengasah keterampilan bash dan Linux saya. Tidak ada python
vfclists
3

Jawaban @ terdon sangat bagus tetapi lebih mudah untuk melakukan ini menggunakan dpkg-queryyang tidak seperti apt-filediinstal secara default pada sistem Debian.

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

Ini menghasilkan daftar paket.

jcoffland
sumber
1

Taruhan terbaik Anda adalah menemukan paket yang benar-benar mendukung distribusi Anda. Tetapi jika itu tidak akan berhasil untuk Anda maka saya hanya tahu satu cara lain.

Jalankan ldd seperti yang Anda miliki, lalu instal dependensi tersebut secara manual.

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

Bagi saya berarti menginstal apt-get install libpango:i386dan berdoa agar versi di Debian tidak stabil cukup baik.

Anda harus melewati setiap baris ldd, Google, lihat di repositori yang tersedia, dan pada dasarnya menjadi beruntung. Kemudian instal satu per satu. Sampai program benar-benar berjalan. ldd hanya akan bekerja untuk program "sederhana". Program yang memanggil plugin atau yang menjalankan kode arbitrer adalah masalah yang berbeda secara bersamaan. Bagi Anda, Anda perlu menjalankan dari konsol, dan memperbaiki crash / kesalahan saat terjadi.

Yang mengatakan, biner hanya dapat dijalankan sangat sulit untuk mempertahankan. Anda mungkin ingin mempertimbangkan untuk menggunakan sesuatu yang lain. Jika distro Anda sedikit di depan, atau sedikit di belakang sistem yang membangun executable itu, Anda mungkin tidak akan pernah berhasil.

kapas
sumber