2010-06-02 17 views
6

Unix tabanlı sistemde gecikme yükü eşdeğeri ne kadardır.Unix tabanlı sistemlerde Gecikme Yükü eşdeğeri

Bir kodum var foo.cpp, gcc ile derlerken Paylaşılan nesnelere bağladım (tamamen üç .so dosyası var.) .farklı seçenek için .so dosyasının her biri.

./foo -v ihtiyaçları libversion.so ./foo -update O kütüphaneler için sembol ihtiyaç

libupdate.so ihtiyaçlar çalışma zamanında sadece çözülmesi gerektiğini . Libopdate.so kütüphanesi olmasa bile kopmayacaktır.

Gecikme yükleme seçeneğini kullanarak pencerelerde çalışıyor (dll özelliklerinde). Unix sistemlerinde eşdeğeri nedir.

'-lazy' seçeneği UNIX? 'De aynısını yapar. Öyleyse, bu seçeneği nereye ekleyelim? (makefile veya linker ld ile).

Unix'te iyi değilim. Lütfen yardım edin .. Şimdiden teşekkürler.

+1

Hala 5 yıl sonra bu soruya bir cevap duymak istiyorum. – Lothar

cevap

2

Dlopen() için sisteminizdeki referansa bakın. Kütüphaneleri manuel olarak açabilir ve çalışma zamanında bağlantı süresinden ziyade harici sembolleri çözebilirsiniz.

Kazdık dışarı bir örnek:

int main(int argc, char **argv) {     
    void *handle=NULL;         
    double (*myfunc)(double);      
    char *err=NULL;         

    handle = dlopen ("/lib/libm.so.1", RTLD_LAZY); 
    if (!handle) {         
     err=dlerror(); 
     perror(err); 
     exit(1);         
    }            

    myfunc = dlsym(handle, "sin");     
    if ((err = dlerror()) != NULL) {   
     perror(err); 
     exit(1);         
    }            

    printf("sin of 1 is:%f\n", (*myfunc)(1.));    
    dlclose(handle);    
    return 0;     
}             
+1

Teşekkürler. Ancak dlopen kullanmak yerine linker'daki Gecikmeli yük eşdeğeri seçeneğini belirtebilirsem daha iyi olur. GCC'de libxxx.so dosyasının tembel yükünü yüklemek için herhangi bir seçenek yok mu? Tembel yükleme için linker ayarlamak için tembel yükleme seçeneklerini geçmek için gcc -WI kullanamaz mıyız? linker tembel yük için varsayılan ayarlanmış olacak mı? Lütfen bana yardım edin.Teşekkürler – saran

+1

Hayır, dlopen()/dlsym() kullanılarak unix'te taşınabilir yoldur. Bazı sistemlerin özel bağlayıcıları bunu işleyebilir (ör: http://docs.sun.com/app/docs/doc/817-1983/6mhm6r4er?l=tr&a=view), ancak GNU ld'nin böyle bir seçeneği yoktur. – pra

+0

@pra İfadenizi destekleyen bazı belgeler hazırladıysanız ve bunu bir yanıt olarak gönderdiyseniz, bunu kabul ediyorum. –

0

ben hala ...

Gecikme yük GNU sistemlerinde kutusundan dışarı dışarı desteklenmez 8 yıl ancak oldu ama bunu kendiniz taklit edebilir biliyorum gerekli tüm sembolleri sağlayan küçük bir statik saplama oluşturarak ve ilk çağrıda (hatta program başlangıcında bile) dlopen gerçek uygulama oluşturarak. Böyle alt projeye özel komut dosyası tarafından veya Implib.so tool üzerinden oluşturulan elle yazılabilir:

# Replace 
$ gcc -o foo foo.c -lversion 
# with 
$ gen-implib.py libversion.so 
$ gcc -o foo foo.c libversion.tramp.S libversion.init.c