Neden Unix / Linux sistemleri, bağlantılı bir kütüphanenin gerekli sürümünü bulana kadar dizinler arasında geçiş yapmıyor?


17

Ben yerleştirilen bağlı bir kütüphane (libz.so.1.2.7) gerektiren "alfa" adlı bir ikili yürütülebilir dosya var /home/username/myproduct/lib/libz.so.1.2.7

Aşağıdaki komutu yürüterek ikili çalıştırılabilir dosyamı yumurtlamadan önce terminal örneğime de aktarıyorum.

export LD_LIBRARY_PATH=/home/username/myproduct/lib/:$LD_LIBRARY_PATH

Şimdi, aynı kütüphane gerektiren ancak farklı bir sürümü, yani (libz.so.1.2.8) kullanılabilir başka bir uygulama "bravo" doğurduğunda /lib/x86_64-linux-gnu/libz.so.1.2.8, sistem aşağıdaki hatayı atar.

version `ZLIB_1.2.3.3' not found (required by /usr/lib/x86_64-linux-gnu/libxml2.so.2)

Ayarlamayı LD_LIBRARY_PATHkaldırırsam, "bravo" iyi çalışır. Yukarıdaki davranış, bağlantılı kütüphaneleri ararken LD_LIBRARY_PATHtanımlanmış dizin yolları üzerinde öncelikli olduğundan /etc/ld.so.confve sonuç olarak yukarıdaki hata oluştuğunu anlıyorum . Sadece UNIX / LINUX geliştiricilerinin işletim sistemini neden farklı dizinlerdeki hiyerarşiye göre diğer dizinlerdeki bağlantılı kütüphaneleri aramak için tasarlamadığını merak ediyorum.

Basitçe söylemek gerekirse, UNIX / LINUX sistemleri gerekli kütüphaneyi bulana kadar bir dizi dizinde dolaşır. Ancak, sürümüne bakılmaksızın ilk kütüphane örneğini kabul etmek yerine beklenen sürümü bulana kadar neden aynı şeyi yapmıyor?


Tam emin değilim, ama güvenlik için tahmin ediyorum. Şahsen makinelerimin herhangi bir yerinde bir sym-link hakkında endişelenmek istemem
Joe

@Joe Kütüphanelerin çoğunda kendilerine işaret eden semboller bulunur. libz.so.1bir symlink olduğunulibz.so.1.2.8
Nasir Riley

Yanıtlar:


28

Ancak, sürümüne bakılmaksızın ilk kütüphane örneğini kabul etmek yerine beklenen sürümü bulana kadar neden aynı şeyi yapmıyor?

Farkında olduğu gibi yapar. zlib.so.1.2.7ve zlib.so.1.2.8her ikisinin de bir soyadı var zlib.so.1, bu yüzden sizin alphave bravoikili dosyalarınızın ihtiyaçları olduğunu söylüyor zlib.so.1. Dinamik yükleyici bulduğu ilk eşleşen kütüphaneyi yükler; 1.2.8 sürümünün bravoihtiyaç duyacağı ek semboller sağladığını bilmiyor . (Dağılımlar gibi ek bağımlılık bilgisi belirtmek için özen nedeni budur zlib1g (>= 1.2.8)için bravo.)

Bunun düzeltilmesi kolay olduğunu düşünebilirsiniz, ancak bunun nedeni, ikili dosyalar ve kütüphaneler ihtiyaç duydukları kütüphanelerden ayrı olarak listeledikleri için değil, böylece yükleyici verilen bir kütüphanenin tüm sembolleri sağladığını kontrol edemez. ondan gerekli. Semboller çeşitli şekillerde sağlanabilir ve semboller ile kütüphaneler arasında mevcut ikili dosyaları kırabilmelerini sağlayan bir bağlantı eklenebilir. Ayrıca, işleri karmaşıklaştırmak için (ve güvenliğe duyarlı geliştiricilerin saçlarını yırtması için) sembol araya girme eğlencesi de vardır.

Bazı kütüphaneler .gnu.version_r, burada yardımcı olacak ancak libzbunlardan biri olmayan sağlayan kütüphaneye bir bağlantıyla birlikte depolanan sürüm bilgilerini sağlar .

(Soyadları göz önüne alındığında, alphaikili kodunuzun iyi çalışmasını beklerdim zlib.so.1.2.8.)


Ayrıca, GNU tarzı kütüphane sürümlemesinin en çok alışkın olduğumuz anlamsal (-ish) sürümlemeden farklı olduğunu da belirtmek gerekir. Aynı "şu anki" sayıya sahip oldukları için, 1, zlib.so.1.2.8, zlib.so.1.2.7'nin sağlamadığı hiçbir özelliği sağlamamalıdır, bu nedenle (ABI perspektifinden) bulundu. Önemli olması bir kusur olarak görülmelidir.
John Bollinger

4
@John hayır, tek garanti, aynı soname sahip kütüphanelerin geriye dönük uyumlu olmasıdır; daha yeni kütüphaneler özellik ekleyebilir, hiçbirini kaldıramaz veya geriye doğru uyumsuz bir şekilde değiştiremez. Yani, zlib 1.2.7'ye karşı oluşturulan bir ikili, bu veya daha yeni bir zlib 1 ile çalışacaktır; ancak zlib 1.2.8'e karşı oluşturulmuş bir ikili, eski bir zlib 1 ile çalışmayabilir. (Ve anlamsal sürümleme buna izin verir; ancak soname kullanımı anlamsal sürümleme değildir.)
Stephen Kitt

1
Dediğim gibi özellikle GNU sözleşmeleri hakkında konuşuyorum ve özellikle libtool hakkında tahmin ediyorum . Her proje bu konvansiyonu izlemez, bu yüzden belki de zlib'i kusurlu olarak adlandırmak çok güçlüdür, ancak diğer taraftan, ilgili kütüphane sürüm numaralarının anlamsal versiyonlama yorumu bile aynı sonuca varır. Forvetler gibi durumlarda (ikili) uyumluluk soname'i doğasında bir vaat değil, ama olduğu bu durumda, makul bir beklenti.
John Bollinger

1
Evet, CRA sayıları ve SOVERSION arasındaki ilişkiyi orijinal noktama kadar iyi anlıyorum: OP tarafından tanımlanan durum , CRA şemasının doğru kullanımı ile tutarsız görünüyor . OP'ler gibi sorunlardan kaçınmak, bu programın temel amaçlarından biridir. Eğer zlib yeni bir (a) ikili arayüzü eklerse, C numarası arttırılmalıdır. Böyle bir yumru bir ikaz yumru yol açabilir ikincil.
John Bollinger

2
@John doğru, şiddetli bir anlaşmaya vardığımızdan ve bahsettiğiniz noktayı yanlış anladığımdan şüpheleniyorum. zaten ;-) olduğu Darwin dışında zlibkullanmaz . libtoolar
Stephen Kitt
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.