2011-07-07 29 views
11

पर dlopen() का उपयोग करके मुझे किसी अन्य प्रोग्राम से फ़ंक्शन कॉल करने की आवश्यकता है। यदि दूसरा प्रोग्राम लाइब्रेरी था, तो मैं फ़ंक्शन में हैंडल प्राप्त करने के लिए बस डलोपेन और डीएलएसआईएम का उपयोग कर सकता था। दुर्भाग्यवश, दूसरा प्रोग्राम एक यूनिक्स निष्पादन योग्य है, और इसे पुस्तकालय के रूप में बनाना एक विकल्प नहीं है। निष्पादन पर dlopen() की कोशिश कर रहा यह त्रुटि संदेश देता है:निष्पादन योग्य

dlopen([...]/testprogram, 1): no suitable image found. Did find: [...]/testprogram: can't map

इस रूप में dlopen पुस्तकालयों, नहीं निष्पादनयोग्य के साथ प्रयोग के लिए है, आश्चर्य की बात नहीं है। निष्पादन योग्य के साथ काम करने के लिए dlopen और dlsym पाने का कोई तरीका है? यदि नहीं, तो क्या वही चीज़ प्राप्त करने का एक वैकल्पिक तरीका है?

उत्तर

7

आप पुस्तकालयों के रूप में निष्पादन योग्य नहीं खोल सकते हैं। निष्पादन योग्य का प्रवेश बिंदु सी पुस्तकालय को फिर से शुरू करने का प्रयास करेगा, और brk सूचक पर ले जाएगा। यह आपके मॉलोक ढेर को दूषित कर देगा। इसके अतिरिक्त, निष्पादन योग्य किसी निश्चित पते पर मैप किए जाने की संभावना नहीं है, और यदि यह पता पहले से लोड किए गए किसी भी चीज़ से ओवरलैप हो जाता है, तो उस कारण से इसे मानचित्र करना भी संभव नहीं है।

आपको अन्य प्रोग्राम को लाइब्रेरी में दोबारा करने की आवश्यकता है, या अन्य प्रोग्राम में आरपीसी इंटरफेस जोड़ें।

ध्यान दें कि यह आवश्यक रूप से पीआईई निष्पादन योग्य के लिए आवेदन नहीं करता है। हालांकि, जब तक निष्पादन योग्य विशेष रूप से dlopen() एड होने के लिए डिज़ाइन नहीं किया गया है, यह असुरक्षित है, क्योंकि main() नहीं चलाया जाएगा, और इसलिए main() में किए गए किसी भी प्रारंभिकरण नहीं होगा।

+3

जैसा कि यहां चर्चा की गई है: http://stackoverflow.com/questions/6617099/call-function-in-unrelated-executable-linux/6619977#6619977, यह उत्तर पीआईई निष्पादन योग्य के लिए गलत है, जो वास्तव में एक विशेष रूप है साझा पुस्तकालय (और यहां तक ​​कि ET_DYN e_type भी है)। –

6

कुछ ईएलएफ सिस्टम (विशेष रूप से लिनक्स) पर, आप dlopen() पीआईई निष्पादन योग्य कर सकते हैं। जीसीसी का उपयोग कर, बस -fpie या -fPIE के साथ निष्पादन योग्य संकलन, और -pie के साथ लिंक, और --dynamic-list या -rdynamic का उपयोग कर उपयुक्त प्रतीकों निर्यात (this other SO answer में अधिक विस्तार से समझाया।

+0

ए [समान उत्तर] (http://stackoverflow.com/questions/19713517/how-to-self-dlopen-an-executable-binary/19716028#19716028)। –

0

के माध्यम से dlopen है निष्पादनयोग्य लोड करने की क्षमता को जोड़ने के लिए अस्वीकृत ग्लिबैक आरएफई (संवर्द्धन के लिए अनुरोध) के रूप में पंजीकृत। आरएफई पर एक विस्तृत रूप और कुछ विशेष मामलों के लिए एक संभावित दृष्टिकोण

[http://sourceware.org/bugzilla/show_bug.cgi?id= पर पाया जा सकता है। 11754] [1]

पीआईई को छोड़कर कई समस्याएं हो सकती हैं ऐसी कार्यक्षमता को लागू करने के लिए दृश्यों को बाधित करें।

0

उपकरण ठीक से ऐसा करने के लिए, एएसएलआर/पीआईई और गैर-एएसएलआर/पीआईई को संभालता है। X86, एआरएम और एमआईपीएस पर संकलित (केवल 32 बिट)। ARCH param सेट करने के लिए मेकफ़ाइल संपादित करें।

http://rtfc.org.uk/cliapi.html

यह मेरी उपकरण है, लेकिन यह है कि तुम क्या चाहते हो रहा है। मुझे बताएं कि यह आपके लिए काम नहीं करता है।

मुझे सराहना है कि मैं इस पार्टी के लिए कितनी देर तक हूं, लेकिन हे।

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