2010-10-01 14 views
33

Paylaşılan kütüphaneleri linux üzerinde çalışmak nasıl bir çaylak değilim. Uygulamaların linux üzerinde çalışma zamanında aynı paylaşılan kitaplığın farklı revizyonlarını nasıl çözdüğünü anlamaya çalışıyorum.nasıl uygulamalar çalışma zamanında paylaşılan kütüphanelerin farklı sürümlerine giderebilirim?

Bildiğim kadarıyla anlamaya gibi paylaşılan kitaplık (gerçek obj dosyası yani gerçek adı) üç örneğin "isimler",

  1. libmy.so.1.2
  2. libmy.so sahiptir.
  3. libmy.so 1 (gerçek obj dosyasında gömülü olduğu SONAME,) (bağlayıcı ad, bağlantı sırasında bağlayıcı sağlanan ve yürütülebilir gömülü)

Eğer ldconfig aracılığıyla kütüphane kurmak, onu aşağıdaki symbo oluşturur lic bağlayan

  • (2) => (1)
  • (3) => (2)

Şimdi şu gerçek adıyla aynı kütüphanede başka bir versiyonunu derlemek Diyelim , libmy.so.2.0. kurallar tarafından SONAME ben "-l" bayrağıyla sağlayacak bağlayıcı adıdır hangi uygulamayı bağlantı zamanda

libmy.so.2.0 olurdu. Ben (http://www.dwheeler.com/program-library/Program-Library-HOWTO/x36.htm l) okumak yönergelerin uygulanması, bu libmy.so ve eğer öyleyse, nasıl obj dosyası iki sürüm ayırt edilecektir olmak zorunda değil ki?

cevap

38

çalışır:

sen ver gerçek adını ve soname hem paylaşılan nesne oluşturduğunuzda. Bunlar, paylaşılan nesneyi (hem nesneyi hem de ona bir bağlantı oluşturan) kurmak için kullanılır.

Yani durum ile sona erebilir: xyz.so.1.5 ile

pax> ls -al xyz* 
-rw-r--r-- 1 pax paxgroup 12345 Nov 18 2009 xyz.so.1.5 
lrwxrwxrwx 1 pax paxgroup  0 Nov 18 2009 xyz.so.1 -> xyz.so.1.5 
lrwxrwxrwx 1 pax paxgroup  0 Nov 18 2009 xyz.so -> xyz.so.1 

SONAMExyz.so.1 arasında sahip.

xyz.so linker bağlantıları, bu xyz.so.1.5 için bağlantılar yolu takip eder ve yürütülebilir saklamak için xyz.so.1 onun SONAME kullanır. Eğer koşmak yürütülebilir, bu xyz.so.1 yüklemeye çalıştığında Ardından, belirli bir xyz.so.1.N (ille sürüm 1.5) işaret eder.

xyz.so.1.6 yükleyebilir ve bunun yerine işaret etmek için xyz.so.1 bağlantısını güncelleştirebilirsiniz ve bunun yerine zaten bağlı olan yürütülebilir dosyalar bunu kullanır.Bu çok katmanlı yönteminin

bir avantajı olman gerekiyordu çünkü aynı ada (xyz.so.1.*, xyz.so.2.*) ama her büyük sürüm, serbestçe onları yükseltebilirsiniz çoklu potansiyel uyumsuz kitaplıkları sahip olmasıdır uyumlu.

yeni yürütülebilir bağladığınızda:

  • son büyük sürümü son minör sürümünü alacak xyz.so ile bağlayan olanlar. xyz.so.1 ile bağlantı
  • Diğerleri belli bir majör sürümü son minör sürümünü alacak. xyz.so.1.2 ile bağlantı Hala
  • diğerleri belirli majör versiyonunun belirli alt sürümün alacak.

    Şimdi şu gerçek adı, libmy.so.2.0 ile aynı kütüphanede başka bir versiyonunu derlemek Diyelim: Biz Yorumunuzu incelemek olarak

Şimdi akılda son paragraf tutun. Talimatlara göre SONAME, libmy.so.2.0 olacaktır.

Hayır, ben böyle inanmıyorum. soname Eğer 2.x akışa küçük güncellemeler yapmak ve en son davranışı elde böylece libmy.so.2 olması daha muhtemel olacaktır.

+5

Sen benim cevap yazma ortasında beni yakaladı. Şimdi sadece OP meraklı ise, o böyle readelf' 'ile yaptığı sistemde önceden yüklenmiş kütüphanelerin sonames kontrol olabileceğini ekleyebilirsiniz:' readelf -Wa /usr/lib/libstdc++.so.6 | grep SONAME' ve kılavuzların nasıl uygulamaya koyulduğunu görün. –

+0

Evet, bu benim bölümümde bir düzenleme hatasıydı, ben gerçekten "libmy.so.2" yi kastettim. Yani üç mermiyi doğru şekilde takip edersem, eski bir büyük versiyona karşı bağlantı kurarken, buna karşılık gelen SONAME değerini belirleyebilirim. Bu yardımcı belgelerin çoğunun bunun hakkında yanıltıcı olduğunu söylemeliyim. Bu gerçeği açıkça belirtmeksizin, her zaman en son büyük revizyona karşı bağlantı kurmanın sadece bir kısmını tartışırlar. – nisah

1

Uygulama bağlantı zamanında, -lmy belirtirseniz, linker libmy.so adlı dosyayı arayacaktır. Bu dosyayı bulabilir ve onunla birlikte çalıştırılabilir bağlantıyı kurabilir. Bu dosya sembolik bir bağlantı ise, uygulamanız sembolik linkin hedefiyle bağlantılı olacaktır.

Uygulama bağlantı süresi, uygulamanızla kullanmak istediğiniz dinamik kitaplığın hangi sürümünün belirtileceği olan 'dır. şöyle Sürüm paylaşılan nesnelerin

İlgili konular