Yürütülebilir dosyayı desteklemek için hangi paketlerin veya kitaplıkların yüklenmesi gerektiğini belirlemenin bir yolu var mı?


11

Yeniden paketleyemediğim, paket olarak oluşturulmamış bir bilgisayara yüklemek istediğim bir yürütülebilir dosya var ve bunları çalıştırmak için gereken kütüphaneleri indirmek istiyorum.

Aşağıda, lddüzerinde çalışan çıktının bir parçasıdır

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)

Disk kullanımını en aza indirgemek için hangi paketlerin indirilmesi veya daha iyi olması gerektiğini, ancak yalnızca listelenen kitaplıkları ve bağımlılıklarını ayıklamak için bu bilgileri kullanabilen bir araç var mı? Sistem başsız bir sanal makinede çalışıyor ve program VNC üzerinden görüntüleniyor.

Tam bir üfleme grafik masaüstü gerekli kütüphanelerin çoğunu sağlayacağından şüphelenmeme rağmen, sadece gerekli kütüphaneleri, bağımlılıklarını ve bunu desteklemek için yeterli X Windows paketini indirmek istiyorum.


1
Hangi işletim sistemi? Paketler ve adları ile paket yöneticisi dağıtımlar arasında değişir (ve bu bir çeşit Linux çalıştırdığınız varsayılmaktadır).
terdon

Bu durumda Debian ve Ubuntu
vfclists

Bu durumda cevabım senin için işe yaramalı.
terdon

Aslında gecikmeksizin test etmek üzereyim. Bunu unuttum ve sadece benzer bir soru sordum, bu da en çok ilgili soru olarak
görünmesine

Yanıtlar:


14

Hangi işletim sistemini kullandığınızı söylemediniz, bu yüzden Linux'u alacağım ve Debian'ı örnek olarak kullanacağım. Sorunuzun hızlı cevabı bildiğim kadarıyla değil. Bu yararlı bir çözüm olabilir:

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

Bu, lddçıktıyı ayrıştırır ve daha sonra apt-cache, adı ve açıklaması tarafından döndürülen kitaplık adının ilk bölümünü içeren paketleri aramak için depolarda arama yapmak üzere çalışır (bunu işletim sisteminizin eşdeğeriyle değiştirin) ldd.

Bu, hepsini bulamayacak ve bazıları için (örneğin libc) çok fazla sonuç verecektir, ancak yardımcı olabilir.


@FaheemMitha apt-filebunun daha iyi bir yol olabileceğini belirtti. Örneğin:

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

Bu, bağlı kitaplıkları sağlayan paket adlarının bir listesini döndürür.


1
apt-file searchasıl dosyada okun sağ tarafında daha etkili olabilir.
Faheem Mitha

@FaheemMitha çok iyi bir nokta, teşekkürler. Yanıt düzenlendi.
terdon

İndirilmesi gerekenleri bulmak için komut sistemde kütüphanenin varlığını test edecek şekilde nasıl ayarlanabilir? Sanırım son zamanlarda sorduğum soru bu çizgiden daha fazla. Yeniden açılmasını istiyorum.
vfclists

@vfclists buna gerçekten değmez, sadece apt-get installhepsi ve zaten yüklü olanlar göz ardı edilir.
terdon

Bunun nedeni, hızlı indirmeler için gereksiz kitaplıkları olmayan bir sanal makine oluşturmaktır. Paket yüklemeleri gereksiz birçok öğe içerir ve sadece çalıştırılabilir dosyaların gerektirdiği kütüphane dosyalarına ve bağımlılıklarına ihtiyacım var.Ayrıca bana bash ve Linux becerilerimi geliştirme şansı veriyor. Python yok.
vfclists

3

@ terdon'un cevabı harika, ancak Debian sistemlerinde varsayılan olarak dpkg-queryfarklı apt-fileolanı kullanarak bunu yapmak daha da kolay .

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

Bu paketlerin bir listesini üretir.


1

En iyi seçeneğiniz, dağıtımınızı gerçekten destekleyen bir paket bulmaktır. Ama eğer bu senin için işe yaramayacaksa, o zaman başka bir yol biliyorum.

Ldd dosyasını istediğiniz gibi çalıştırın, sonra bu bağımlılıkları el ile yükleyin.

Örneğin libpango-1.0.so.0 => /usr/lib/i386-linux-gnu/libpango-1.0.so.0 (0xb702f000)

Benim apt-get install libpango:i386için Debian'daki kararsız versiyonun yeterince iyi olması için dua etmek ve dua etmek anlamına gelir .

Ldd, Google'ın her satırından geçmeniz, mevcut depolarınıza bakmanız ve temelde şanslı olmanız gerekir. Sonra bunları tek tek kurun. Program gerçekten çalışana kadar. ldd sadece "basit" programlar için çalışacaktır. Eklentileri çağıran veya rasgele kod çalıştıran programlar hep birlikte farklı bir konudur. Bunlar için konsoldan çalıştırmanız ve çökmeleri / hataları gerçekleştikçe düzeltmeniz gerekecektir.

Bununla birlikte, sadece bir ikili çalıştırılabilirin bakımı korkunç derecede zordur. Başka bir şey kullanmayı düşünebilirsiniz. Dağıtımınız biraz ilerideyse veya yürütülebilir dosyayı oluşturan sistemin biraz gerisindeyse, onu asla işe yaramayabilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.