2012-11-12 10 views
5

अब मैं 3 साझा वस्तुओं, A.so, B.so, C.soपूर्ण रूप से आमंत्रित करते समय RTLD_DEEPBIND का उपयोग कैसे करें?

A.c  
    void libA() 
    { 
     common(); 
    } 

    B.c 
    void common() 
    { 
     printf("COME HERE B\n"); 
    } 

    C.c 
    void common() 
    {  
     printf("COME HERE C\n"); 
    } 
    (just ingore the .h files) 

    test.c 
    int main() 
    { 
     libA();  
     return 1; 
    } 

complie: 
gcc -fPIC -shared libB.so libB.c 
gcc -fPIC -shared libA.so libA.c ./libB.so 
gcc -o test test.c libC.so libA.so 

मैं परिणाम चाहते हैं "यहाँ आए बी" और मैं RTLD_DEEPBIND ध्वज के साथ dlopen इस्तेमाल कर सकते हैं हो सकता है,
लेकिन यह है मेरे प्रोजेक्ट में स्पष्ट कॉल से निहित कॉल से कार्यों को बदलने के लिए बहुत अधिक समय लगता है।
क्या इस समस्या को हल करने के लिए वैसे भी है?

gcc -Wl,-Bsymbolic इस समाधान में काम नहीं करता है।

ठीक है, अगर एसी में सामान्य के कार्यान्वयन शामिल हैं। यह वास्तव में कारगर है।

उत्तर

1

ऐसा लगता है कि गतिशील लिंकर रनटाइम में एक प्रतीक की खोज करता है, यह पहले व्यक्ति को चुनता है। खोज आदेश बाइनरी के DT_NEEDED खंड में पुस्तकालयों के क्रम पर निर्भर करता है, जो बदले में संकलन के दौरान कमांड लाइन में पुस्तकालयों के सटीक क्रम पर निर्भर करता है। तो, सुनिश्चित करें कि libB.sotest.c संकलित करते समय कमांड लाइन पर libC.so से पहले है।

संबंधित मुद्दे