2010-09-02 12 views
7

में प्रतीकों को नहीं ढूंढ सकता है, मैं एक प्रोग्राम के लिए एक प्रकार का प्लगइन आर्किटेक्चर बनाने के साथ प्रयोग कर रहा हूं, और मेरे पहले प्रयास में मुझे कोई समस्या है। क्या साझा ऑब्जेक्ट के भीतर मुख्य निष्पादन योग्य से प्रतीकों तक पहुंच बनाना संभव है? मैंने सोचा था कि ठीक होगा निम्नलिखित:साझा ऑब्जेक्ट मुख्य बाइनरी, सी ++

testlib.cpp:

void foo(); 
void bar() __attribute__((constructor)); 
void bar(){ foo(); } 

testexe.cpp:

g++ -fPIC -o testexe testexe.cpp -ldl 
g++ --shared -fPIC -o testlib.so testlib.cpp 

आउटपुट::

attempting to load 
fail: ./testlib.so: undefined symbol: _Z3foov 

#include <iostream> 
#include <dlfcn.h> 

using namespace std; 

void foo() 
{ 
    cout << "dynamic library loaded" << endl;  
} 

int main() 
{ 
    cout << "attempting to load" << endl; 
    void* ret = dlopen("./testlib.so", RTLD_LAZY); 
    if(ret == NULL) 
     cout << "fail: " << dlerror() << endl; 
    else 
     cout << "success" << endl; 
    return 0; 
} 

साथ संकलित

तो जाहिर है, यह ठीक नहीं है। तो मुझे लगता है कि मेरे पास दो प्रश्न हैं: 1) क्या साझा ऑब्जेक्ट को 2 से लोड किए गए निष्पादन योग्य में प्रतीकों को खोजने का कोई तरीका है) यदि नहीं, तो प्लगइन का उपयोग करने वाले प्रोग्राम आमतौर पर काम करते हैं कि वे मनमाने ढंग से कोड प्राप्त करते हैं अपने कार्यक्रमों के अंदर चलाने के लिए साझा वस्तुओं?

उत्तर

16

प्रयास करें:

g++ -fPIC -rdynamic -o testexe testexe.cpp -ldl 
-rdynamic बिना

(या कुछ बराबर, -Wl,--export-dynamic की तरह), आवेदन से प्रतीकों ही नहीं गतिशील जोड़ने के लिए उपलब्ध हो जाएगा।

+0

हाँ! बहुत बहुत धन्यवाद। – cheshirekow

+1

https://gcc.gnu.org/onlinedocs/gcc-4.8.3/gcc/Link-Options.html के अनुसार, जीसीसी लिंक चरण में "-गतिशील" विकल्प के साथ एक ही प्रभाव प्राप्त किया जा सकता है। –

+0

@ टॉमबरॉन धन्यवाद! मैं अपनी पोस्ट अपडेट करूंगा। –

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