8

में समान स्थैतिक चर प्रारंभ करती है क्या किसी को पता है कि dlopen() के भीतर प्रारंभ की गई लाइब्रेरी मुख्य प्रोग्राम के स्वामित्व वाले स्थिर चर को प्रारंभ करेगी। मुख्य कार्यक्रम और साझा पुस्तकालय दोनों में स्थिर चर की एक प्रति है, लेकिन किसी कारण से साझा लाइब्रेरी स्थिर प्रोग्राम की मुख्य प्रोग्राम की प्रति को फिर से शुरू करती है और इसे नष्ट कर देती है, जिसके कारण मुख्य प्रोग्राम इसे नष्ट करने का प्रयास करता है।मुख्य कार्यक्रम और साझा लाइब्रेरी __static_initialization_and_destruction_0

क्या यह प्रतीक तालिका में गलत नाम का गलत मामला है?

उत्तर

7

यह एक ऐसा मामला है जहां रनटाइम लिंकर केवल प्रक्रिया में एक प्रतीक की एक सक्रिय प्रतिलिपि चाहता है। यदि दोनों साझा ऑब्जेक्ट और निष्पादन योग्य के पास प्रतीक की एक प्रति है, तो रनटाइम लिंकर उन सभी में से किसी एक संदर्भ को हल करेगा।

साझा समस्या का निर्माण करते समय लिंक संपादक के version command का उपयोग करके आप प्रतीक कमी को कम करने के लिए क्या कर सकते हैं। सुनिश्चित करें कि स्थैतिक चर के लिए प्रतीक वैश्विक नहीं है और आपको वह व्यवहार मिलेगा जिसे आप ढूंढ रहे हैं।

+0

एचआरएम, मुझे संस्करण स्क्रिप्ट को कार्यान्वित करने और लिंकर को पास करने में कोई समस्या हो रही है। यह एक वाक्यविन्यास त्रुटि के बारे में शिकायत कर रहा है। यहां दी गई स्क्रिप्ट फ़ाइल है: "{global: local: *;}" कोई विचार? मैंने उदाहरणों की तलाश की लेकिन वे सभी सिंटैक्स चेक में विफल होने लगते हैं। या क्या स्रोत में सीधे __asm__ निर्देश डालना बेहतर है? – Paul

+0

@ पॉल - मेरी स्क्रिप्ट 'VERSION {{global: ...; स्थानीय *; }; } 'और फिर मैं लिंकर कमांड लाइन पर उस फ़ाइल के फ़ाइल नाम का उपयोग करता हूं। –

+0

@ सैमुएल - संस्करण स्क्रिप्ट को पूरा करने और वैश्विक संदर्भ में कुछ प्रतीकों को जोड़ने के बाद यह एक गुच्छा धन्यवाद, अब यह काम करता है! – Paul

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