2011-01-12 15 views
8

में ग्लोबल वेरिएबल्स कुछ प्रतिबंधों के कारण मुझे रनटाइम पर सी में लिखी गई लाइब्रेरी लोड करने के लिए मजबूर किया जा रहा है। एक तीसरी पार्टी मुझे दो पुस्तकालय प्रदान करती है जो स्थिर अभिलेखागार के रूप में हम साझा वस्तुओं में बदल जाते हैं। मैं जिस एप्लिकेशन के साथ काम कर रहा हूं, वह कुछ हार्डवेयर पैरामीटर के आधार पर रनटाइम पर पुस्तकालयों में से एक को लोड करता है। दुर्भाग्यवश पुस्तकालयों में से एक वैश्विक चर के साथ बड़े पैमाने पर कॉन्फ़िगर किया गया है।डीएलओपेन और सी/सी ++

मैं पहले से ही फ़ंक्शन संदर्भ लोड करने के लिए dlsym का उपयोग कर रहा हूं, लेकिन क्या मैं इन वैश्विक चरों के संदर्भों को लोड करने के लिए dlsym का उपयोग कर सकता हूं?

उत्तर

10

हां, आप globals तक पहुंचने के लिए dlsym का उपयोग कर सकते हैं (जब तक वे निर्यात किए जाते हैं, और स्थैतिक नहीं)। नीचे दिया गया उदाहरण सी ++ और मैक में है, लेकिन स्पष्ट रूप से सी ठीक काम करेगा।

lib.cpp:

extern "C" { 
    int barleyCorn = 12; 
} 

uselib.cpp

#include <dlfcn.h> 
#include <iostream> 
using namespace std; 

main() 
{ 
    void * f = dlopen ("lib.dylib", RTLD_NOW); 
    void * obj = dlsym (f, "barleyCorn"); 
    int * ptr = (int *) obj; 
    cout << *ptr << endl; 
} 

आउटपुट:

% ./a.out 
12 
+0

और यदि आप सी रनटाइम से सी ++ लाइब्रेरी लोड करते हैं तो भी आपकी सभी वैश्विक वस्तुओं का निर्माण किया जाएगा! और जब आप इसे अनलोड करते हैं तो नष्ट हो जाता है – yanpas

1

हां, आप dlsym() का उपयोग कर गतिशील लाइब्रेरी में किसी भी निर्यात किए गए प्रतीक का पता लगा सकते हैं।

1

हाँ आप मैं वास्तव में कर सकते हैं और लोड कार्यों के बजाय ऐसा करना पसंद करते हैं। मेरा मानक आईओसी मॉडल इस तरह से करता है।

मैं इसे पसंद करते हैं क्योंकि:

  • एक वस्तु के लिए सूचक को एक शून्य * से डाली कि एक समारोह सूचक की तुलना में तकनीकी रूप से सुरक्षित है, हालांकि स्पष्ट रूप से प्रणाली शून्य का उपयोग करता है * dlsym साथ की अनुमति देनी होगी आप सूचक को बदलने के लिए। (माइक्रोसॉफ्ट के GetProcAddress अपना खुद का सूचक प्रकार देता है, जो इस मामले में मुझे लगता है कि एक बेहतर विकल्प है क्योंकि अगर उन्हें आवश्यकता हो तो वे इसके वास्तविक अर्थ को बाद में बदल सकते हैं)।

  • क्योंकि मैं इसे सी ++ में करता हूं, मैं यह लागू कर सकता हूं कि ऐसी कोई भी निर्यात वस्तु एक सामान्य बेस क्लास से प्राप्त होती है, और फिर मैं उस वर्ग से डायनामिक_कास्ट का उपयोग वास्तविक रूप से कर सकता हूं, जिसे मैं उम्मीद करता हूं। इसका मतलब यह है कि अगर मैं बाद की कक्षा से प्राप्त नहीं करता, तो बाद में रनटाइम त्रुटियों को सहेजता हूं तो मैं एक त्रुटि पकड़ सकता हूं।

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