2010-12-10 18 views
6

Paylaşılan bir kitaplık (paylaşılan nesne) oluşturursam bunu aşağıdaki iki yolla kullanabilirim:
İlk olarak bir statik kitaplık kullanacağım gibi paylaşılan bir kitaplık kullanıyorum.Unix'te paylaşılan kütüphaneler hakkında ikilem Dilim hakkında

  #include "myLib.h" 
      //... 
      //afterwards I can use functions defined in mylib.h 
      myFunction(); 

paylaşılan kütüphaneyi kullanan ikinci yolu dinamik yükleyici API fonksiyonlarını çağırarak geçerli: dlopen, dlsym ve dlfcn.h den dlclose. Örneğin, bir eklenti deseni uygulamak istediğimde bu şekilde paylaşılan kütüphaneyi kullanırdım. şu şekilde görünecektir Listeleme:

#include <dlfcn.h> 

void *myLib;    /* Handle to shared lib file */ 
void (*myFunction)();  /* Pointer to loaded function */ 

    //... 

    //load shared object 
    myLib = dlopen("/home/dlTest/myLib.so",RTLD_LAZY); 
    dlerror(); 

    //get handle to function 
    myFunction = dlsym(myLib, "myFunction"); 
    dlerror(); 

    //execute function 
    (*myFunction)(); 

    //close lib 
    dlclose(myLib); 
    dlerror(); 

Şimdi benim ilk soru geçerli: yükleme süresi açısından paylaşılan nesnenin bu iki kullanımlar arasındaki fark nedir? Paylaşılan kitaplığı ilk olarak kullanarak, yüklenen zamanda ana uygulamaya paylaşımlı kütüphaneyi bağlar/yüklüyoruz ve ikincisi çalışma zamanında aynı şeyi yapıyoruz.

İkinci soru. Bu iki kullanımın adı nedir? Birincisi, statik olarak bağlantılı paylaşımlı kütüphane, diğeri ise dinamik olarak bağlantılı/yüklü paylaşımlı kütüphane olarak adlandırılıyor?

Üçüncü soru-fPIC bayrağı olmadan bağımsız bir kütüphane kurduysam (sürümden bağımsız kod), ikinci bir şekilde kullanabilir miyim?

Alkış

cevap

4

Bu iki kullanım modları tipik örtük ve açık olarak adlandırılır. Doğru olarak belirttiğiniz gibi, yükleme sırasında fark, dlopen yürütüldüğünde açık bir şekilde bağlanmış dinamik kitaplığın yüklendiği ve uygulamanın belleğe yüklendiği anda örtülü olarak bağlanmış kütüphanenin yüklendiği şeklindedir. Her dlopen, kütüphane zaten yüklü değilse, tamamlanması için milisaniye sürebilir, bu durumda çok hızlıdır, bu nedenle çok sıkı gecikme gereksiniminiz varsa veya sık yükleme/boşaltma yapmanız gerekiyorsa, bağlama örtülü veya açık bir şekilde kitaplığı yüklemeye karar verebilirsiniz. Program başlangıcında ve artık kullanılmayacak kadar boş bırakmayın.

+0

Paylaşılan bir kitaplığı değiştirip yeniden derlerse, örtülü bağlantı oluşturuyorsam veya bu uygulamalar yüklendiğinde otomatik olarak yapılırsa, paylaşılan lib'i kullanan tüm ana uygulamaları yeniden bağlamalı mıyım? –

5

Ana fark, hata işlemede. Örtükleme daha kolaydır, ancak bir sorun varsa (kütüphane eksikse veya işlev kütüphanede değilse) program hiç çalışmayacaktır. Açık yükleme ile, dlopen/dlsym çağrılarını hatalar için kontrol edebilir ve bir sorun varsa, bazı alternatiflere geri dönebilirsiniz.

Üçüncü sorunuzu yanıtlamak için, aslında mimariye bağlıdır, ancak çoğu ABI'de hala -PIC olmadan derlenmiş paylaşılan bir nesneyi yükleyebilirsiniz, ancak daha yavaş yüklenebilir ve daha fazla bellek gerekebilir.

+0

Paylaşılan bir kitaplığı değiştirip yeniden derlersek, örtülü bağlantı kullanıyorum veya bu uygulamalar yüklendiğinde otomatik olarak yapılırsa, paylaşılan lib'i kullanan tüm ana uygulamaları yeniden bağlamalı mıyım? –

+0

@kobac: no - paylaşılan kütüphaneler, uygulama başladığında veya dlopen çağrıldığında yüklendiklerinde her zaman bağlanırlar –