2013-08-27 35 views
10

Programım libcurl.so.3'a bağlı, ancak RHEL6'da bu gibi yumuşak bir yumuşaklık yok libcurl.so.3 ->libcurl.so.4 (programım bu bağlantıyı oluşturduğumda sorunsuz olarak çalışabilir). Ama böyle yumuşak bir bağlantı var: libcurl.so->libcurl.so.4.Doğrudan bir ikili SONAME değiştirmenin herhangi bir yolu var mı?

libcurl.so.3.0.0.0'u libcurl.so.3'dan libcurl.so'a değiştirmek istiyorum. Sonra programımı RHEL 6'da kendimden yumuşak bir bağlantı oluşturmadan çalıştırabilirim.

Belki benim çözüm aptal, ama ikili doğrudan ilginç bir şey nasıl değiştirileceğini öğrenme düşünüyorum. Teşekkür Tahnk Yorumunuza, devnull için

. belki açık söylemedim.

$ readelf -d libcurl.so.3.0.0

ofset 0x303cc de

Dinamik segmenti 25 girdileri içerir:

Etiket Tür Ad/Değer

0x00000001 (GEREKLİ) Paylaşılan kitaplık: [libssl .so.2]

0x0000000e (sONAME) Kütüphane soname: [libcurl.so.3] ---> ilibcurl.so bu değiştirmek istiyorum Uygulamanız belirli libc'nin (libc.so.6) bağlıdır zaman

+0

sen * * Bir dosya veya bu * bir ikili * değiştirerek değil bir sembolik yeniden adlandırma olduğunu bahsediyoruz ne. – devnull

+1

Sen, "libcurl.so.4" bir kopyasını oluşturmak bunu için "libcurl.so.3" adlandırmak ve "libcurl.so.3 "libcurl.so.4" dan SONAME girişini yeniden adlandırmak için onaltılık editörü kullanabilirsiniz ". Çoğu zaman bu çalışmaz, çünkü sürüm bilgisi de dinamik kütüphanelerde mevcuttur. –

+0

Bence bunu yapmanın en kolay yolu libcurl'u yeniden inşa etmek ve istediğiniz SONAME'e sahip olmak için yapı kurallarını kesmek. Yapım sonrası değişiklikler için, ikili sürümü tavsiye etmem. Http://nixos.org/patchelf.html ELF formatının yamalanması ile ilgili bir proje var, SONAME'in değiştirilmesine izin vermiyor, ancak böyle bir şeyin nasıl uygulanacağı konusunda biraz fikir verebilir. – joetde

cevap

0

Örneğin olarak, SO nesnenin versiyonunu kaldırarak kaçınmalıdır. Eğer yeni bir dosya yoluna LD_PRELOAD ayarlarsanız başvurunuz

çağırmadan önce LD_PRELOAD değişkeni kullanan başka lib kullanmak isterseniz

uygun yolu, bunu yapmak için, bu dosya herhangi önce yüklenecektir diğer kütüphane (hatta C çalışma zamanı, libc.so dahil).

2

Evet, (onun Readme itibaren) böyle patchelf kullanabilirsiniz:

patchelf --set-soname libnewname.so.3.4.5 path/to/libmylibrary.so.1.2.3 
İlgili konular