Kaynak kod kullanılabilirliği bulunmayan bir dinamik yürütülebilir dosyadan statik hale getirmenin açık kaynaklı bir yolu var mı?


20

Sorunu bir örnekle açıklayayım. Gündelik çalışmalarımda bazı eski programları kullanıyorum, örneğin xfig ve pdfedit .

Şimdi, bu programlar oldukça eski ve çok sık güncellenmiyor; Korkum, bir gün ya da diğerinin, bazı kütüphane eksiklikleri veya uyumsuz güncellemelerden dolayı artık çalışmayacaklarıdır.

Programın şimdi derlenmesi kolaysa , çalışan bir sistemde çözüm kullanışlıdır: kaynağı bir kenara bırakmaya çalışın ve statik olarak derleyin --- elde edilen çalıştırılabilir büyük olacak ve çok verimli olmayacak, ancak öngörülebilir gelecek (1). Bu durum böyle görünüyor xfigve mümkün olan en kısa sürede deneyeceğim.

Ancak, örneğin, pdfeditQt3'e bağlıdır ve derlemek için bir sistem kurmak şu anda oldukça karmaşıktır. Neyse ki şu anda çalıştırılabilir , çünkü ihtiyaç duyduğu kütüphanenin hiçbir şeyle çelişmemesidir. Ancak bu gelecekte değişebilir, bu yüzden bu sorunu çözmek istiyorum:

Eğer Ubuntu'da dinamik bir kütüphaneye ve bütün kütüphanelere sahipsem ama kaynak kod yoksa, statik bir ikili (veya benzeri şey) yapabilirim?

Ben araştırdım. Bir olasılık, statifier (2) 'dir, ancak adres randomizasyonu ile ilgili birçok problemi vardır , bu yüzden hayır-hayır. Özgür olmayan versiyon Ermine işe yarıyor gibi görünüyor, ancak gerçekten açık kaynaklı bir seçeneği tercih ederim.

Diğer bir olasılık ise liman işçisi veya benzer bir paketleme sistemi kullanmaktır. Ancak bulduğum tüm eğitim oldukça RedHat odaklı ; ve dürüst olmak gerekirse, takip etmesi oldukça karmaşık.


Dipnotlar :

(1) çok çılgın değil. Bir kullanmak statik ffmpeg örneğin Tamam çalışıyor ve herhangi bir uyumluluk sorunları olmadan ...

(2) derlemek için statifierbkz. Https://stackoverflow.com/questions/23498237/compile-program-for-32bit-on-64bit-linux-os-causes-fatal-error

Yanıtlar:


19

Sorununuzu başka ve daha basit bir şekilde çözebilirsiniz:

lddBağlantılı kütüphaneleri görmek için çalıştırılabilir programınızı kullanın , örneğin:

$ ldd /bin/bash
linux-vdso.so.1 =>  (0x00007fffb2fd4000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fac9ef91000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fac9ed8d000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac9e9c6000)
/lib64/ld-linux-x86-64.so.2 (0x00007fac9f1e1000)

Ardından bir klasördeki tüm kütüphaneleri toplayın ve programınızı çalıştırmadan önce bu klasörü işaret edecek şekilde LD_LIBRARY_PATH ortam değişkenini ayarlayın:

$ LD_LIBRARY_PATH="/opt/my_program/lib" /opt/my_program/start

Alternatif olarak, lib klasörü için bir giriş ekleyebilirsiniz /etc/ld.so.conf.d/. Ancak bu değişiklik sistem genelinde geçerli olacaktır.


Bu iyi bir fikir --- tüm bunları yürütülebilir bir paketlemek için gerçekten bir yol bulmak istememe rağmen; bu çözüm yükleyicideki değişikliklerden etkilenebilir (umarım kimse böyle bir şeyi geriye dönük olarak uyumlu şekilde yapmayacaktır). Daha iyi bir çözüm ortaya çıkmazsa ödül kazanacak --- teşekkürler.
Rmano

Bunu küçük bir kurulum betiğine ekleyebilir ve yerel yola bağlayabilirsiniz. Bu çözümü beğendim, bir süre önce kullanabilirdi.
WalyKu

1
@Klaus, linux-vdso.so.1 görülecek hiçbir yer yok, sanırım çekirdekte, doğru mu?
Rmano

1
Evet. Kimden man 7 vdso: "" vDSO "(sanal dinamik paylaşılan nesne), çekirdeğin tüm kullanıcı alanı uygulamalarının adres alanına otomatik olarak eşlediği küçük bir paylaşılan kütüphanedir."
Klaus D.

Bu kesinlikle sorunun cevabı olmasa da, makul bir çözüm. Teşekkürler.
Rmano

2

Statifier ile ilgili bir öneri :

Adres alanı düzeni rasgele (ASLR) başarısız olmasına neden oluyorsa, tüm makine için kapatmanız gerekmez. Sadece bu işlem için onu kapatabilirsiniz:

$ setarch `uname -m` -R statified_pdfedit [args...]

Bu komutu rasgele düzen devre dışı bırakılmış şekilde çalıştıracaktır (root olmanız gerekmez).


Vay ilginç. Şimdi derleyebilseydim statifier...
Rmano

Derlendi ve kontrol edildi. xfig_statifiedHala çekirdek döküntüler ... yazık. Yine de teşekkürler.
Rmano

Evet, yazık. 64bitlik bir sorun olmazsa merak ediyorum, belki 32bit bir kurulumda statifier çalıştırmayı deneyin?
lemonsqueeze 11:14

32 bitlik bir makinede kontrol edilir, hala çekirdek dökümü olur.
Rmano
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.