2012-06-12 22 views
7

मैंने ऑब्जेक्ट एएस साझा किया है जो स्थिर रूप से libssl.a & से जुड़ा हुआ है और एक अन्य साझा ऑब्जेक्ट बीएसओ जो स्थिर रूप से libssl.a को लिंक करता है।स्टेटिक लाइब्रेरी दो बार लोड की गई

एएसओ & बीएसओ ग्लोबल स्कोप में libssl.a से प्रतीकों का प्रतीक है। मैंने इसे पढ़ा है- एएस

मेरे पास एक निष्पादन योग्य है। जो एएसओ और बीएसओ लोड करता है। जब A.out समाप्त हो जाता है तो मुझे एएसओ में libssl.a के प्रतीकों में से एक में डबल फ्री त्रुटि मिलती है।

भले ही libssl.a प्रत्येक साझा ऑब्जेक्ट से स्थिर रूप से जुड़ा हुआ है, क्योंकि वैश्विक स्तर पर का खुलासा किया गया है, यह संभव है कि यह उसी स्थानीय प्रतीक को चुनने के बजाय साझा किया जाए।

यह क्या काम है? यहां प्रतीकों को स्थानीय कैसे बनाया जाए?

कृपया

+0

मैं आपके सिद्धांत की पुष्टि करने के लिए एक डीबगर का उपयोग करने की सलाह दूंगा। – jdigital

+0

क्या आप विस्तारित कर सकते हैं? – KodeWarrior

+0

बस एक छोटी सी बात, क्योंकि मुझे नहीं पता कि इसे अपनी स्थिति में कैसे लागू किया जाए: 'dlopen' में एक RTLD_LOCAL ध्वज है जो कुछ परिस्थितियों में वास्तव में इस स्थिति में मदद करेगा। तो यदि आपने उन पुस्तकालयों को 'डलोपेन' के साथ खोला है, तो शायद उन्हें हस्तक्षेप नहीं करना चाहिए। – liori

उत्तर

5

यह वास्तव में अपेक्षित है। libssl.a का एक उदाहरण दूसरे (संभावित रूप से एक सबसेट) इंटरपोज़ करता है, और परिणाम सुंदर नहीं होते हैं। A.so और B.so से निर्यात किए जाने वाले नियंत्रण को नियंत्रित करने के लिए आप एक संस्करण स्क्रिप्ट (--version-script सीडी के लिए -Wl, के साथ) का उपयोग कर सकते हैं। अगर कुछ निर्यात नहीं किया जाता है, तो इसे या तो हस्तक्षेप नहीं किया जा सकता है।

वैकल्पिक रूप से, आप जैसे दृश्यता झंडे के साथ libssl.a संकलित कर सकते हैं। ये झंडे केवल गतिशील लिंकर को प्रभावित करते हैं और स्थिर लिंकिंग नहीं करते हैं। आपको संभवतः इसे स्वयं संकलित करने की आवश्यकता है क्योंकि .a फ़ाइलों को भेजे गए स्थान-निर्भर कोड होते हैं, जो निष्पादन योग्य में जोड़ने के लिए होते हैं। 32-बिट x86 जैसे कुछ प्लेटफ़ॉर्म आपको ऐसे ऑब्जेक्ट को साझा ऑब्जेक्ट्स और केवल टेक्स्ट स्थानान्तरण की लागत पर जोड़ने से दूर हो जाते हैं।

RTLD_LOCAL के साथ टिप्पणी में सुझाव दिया जाना चाहिए, लेकिन इस उद्देश्य के लिए dlopen का उपयोग करना हैकिश लगता है।

एक और विकल्प दोनों पुस्तकालयों में समान साझा libssl.so का उपयोग करना है।

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