2010-06-02 11 views
6

देरी लोड यूनिक्स आधारित प्रणाली में बराबर क्या है।यूनिक्स आधारित सिस्टम में देरी लोड बराबर

मैं जीसीसी के साथ संकलन हालांकि मैं यह साझा वस्तुओं से लिंक एक कोड foo.cpp है, (पूरी तरह से तीन .so फ़ाइलें हैं।)। अलग विकल्प के लिए .so फ़ाइल से प्रत्येक।

./foo -v जरूरतों libversion.so ./foo -update libupdate.so

मैं उन पुस्तकालयों के लिए प्रतीक जरूरत जरूरतों रन समय में केवल सुलझाया जाना चाहिए ।

./foo -v भी नहीं तोड़ चाहिए अगर libupdate.so पुस्तकालय वहाँ नहीं है।

यह देरी लोड विकल्प (dll के गुणों में) का उपयोग कर खिड़कियों में काम कर रहा है। यूनिक्स सिस्टम में इसके बराबर क्या है।

विल '-lazy' विकल्प यूनिक्स में एक ही है ?. यदि हां, तो इस विकल्प को कहां शामिल करना है? (मेकफ़ाइल या लिंकर एलडी के साथ)।

मैं यूनिक्स में अच्छा नहीं हूं। कृपया मेरी मदद करें .. अग्रिम धन्यवाद।

+1

मैं अभी भी 5 साल बाद इस प्रश्न पर एक जवाब सुनना पसंद करेंगे। – Lothar

उत्तर

2

dlopen के लिए अपने सिस्टम पर संदर्भ देखें()। आप पुस्तकालयों को मैन्युअल रूप से खोल सकते हैं और लिंक समय के बजाय रनटाइम पर बाहरी प्रतीकों को हल कर सकते हैं।

खोदा बाहर एक उदाहरण:

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

धन्यवाद। लेकिन यह बेहतर होगा अगर मैं डेलपेन का उपयोग करने के बजाय लिंकर में देरी लोड समकक्ष विकल्प निर्दिष्ट कर सकता हूं। क्या libसीसीx.so फ़ाइल को आलसी लोड करने के लिए जीसीसी में कोई विकल्प नहीं है? क्या हम आलसी लोड के लिए लिंकर सेट करने के लिए आलसी लोड विकल्प पास करने के लिए जीसीसी-वाईआई का उपयोग नहीं करते हैं? क्या लिंकर आलसी लोड के लिए डिफ़ॉल्ट सेट करेगा? कृपया मेरी मदद करें। अग्रिम धन्यवाद – saran

+1

नहीं, dlopen()/dlsym() का उपयोग करके यूनिक्स पर पोर्टेबल तरीका है। कुछ सिस्टम के कस्टम लिंकर्स इसे संभाल सकते हैं (उदा: http://docs.sun.com/app/docs/doc/817-1983/6mhm6r4er?l=en&a=view), लेकिन जीएनयू एलडी में ऐसा कोई विकल्प नहीं है। – pra

+0

@pra अगर आपने अपने कथन का समर्थन करने वाले कुछ दस्तावेज खोले हैं और इसे एक उत्तर के रूप में पोस्ट किया है, तो मैं इसे ऊपर उठाऊंगा। –

0

मैं जानता हूँ कि यह 8 साल लेकिन अभी भी ...

देरी लोड जीएनयू सिस्टम पर बॉक्स से बाहर बाहर समर्थित नहीं है किया गया है लेकिन आप इसे अपने आप को नकल कर सकते हैं एक छोटा स्थैतिक स्टब बनाकर जो सभी आवश्यक प्रतीकों और dlopen के पहले कॉल (या यहां तक ​​कि प्रोग्राम स्टार्टअप पर) पर वास्तविक कार्यान्वयन प्रदान करता है। इस तरह के उप, हाथ से लिखा जा सकता है परियोजना विशेष स्क्रिप्ट के द्वारा या Implib.so tool द्वारा उत्पन्न:

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