2015-12-16 32 views
6

मेरे प्रोग्राम को संकलित करने का प्रयास करते समय मेरे पास एक अनसुलझे प्रतीक त्रुटि है जो शिकायत करती है कि उसे __dso_handle नहीं मिल रहा है। यह फ़ंक्शन आमतौर पर किस फ़ंक्शन में परिभाषित होता है?__dso_handle कहां परिभाषित किया गया है?

क्या निम्नलिखित परिणाम nm on libstdc++.so.6 से संबंधित हैं इसका मतलब है?

मैंने इसके खिलाफ लिंक करने का प्रयास किया लेकिन त्रुटि अभी भी होती है।

nm libstdc++.so.6 | grep dso 
00000000002fc480 d __dso_handle 

उत्तर

8

__dso_handle एक "गार्ड" वह यह है कि used to identify dynamic shared objects during global destruction है।

यथार्थ रूप से, आपको यहां पढ़ना बंद करना चाहिए। यदि आप __dso_handle के साथ गड़बड़ करके ऑब्जेक्ट पहचान को हराने की कोशिश कर रहे हैं, तो कुछ गलत होने की संभावना है।

हालांकि, चूंकि आपने पूछा कि यह कहां परिभाषित किया गया है: उत्तर जटिल है। इसकी परिभाषा के स्थान (जीसीसी के लिए) की सतह पर, सी ++ फ़ाइल में iostream का उपयोग करें, और उसके बाद, extern int __dso_handle; करें। किसी प्रकार के संघर्ष के कारण घोषणा के स्थान को सतह पर रखना चाहिए (स्रोत के लिए this forum thread देखें)।

कभी-कभी, यह defined manually है।

कभी-कभी, इसे संकलक द्वारा स्थापित "रनटाइम" द्वारा परिभाषित/आपूर्ति किया जाता है (व्यावहारिक रूप से, सीआरटी आम तौर पर केवल बाइनरी हेडर/एंट्री पॉइंट-प्रबंधन कोड का एक समूह होता है, और कुछ निकास गार्ड/हैंडलर)। जीसीसी में (यकीन नहीं अन्य compilers इस का समर्थन करता है, तो, यदि हां, यह उनके स्रोतों में हो जाएगा):

अक्सर, उस में परिभाषित किया गया है stdlib:

अतिरिक्त पठन:

0

मैं इस समस्या में पड़ गए।

  1. जी ++ C/C++ मानक पुस्तकालय के बिना जोड़ने: -nostdlib (ठेठ छोटे एम्बेडेड परिदृश्य) यहाँ की स्थिति जो मज़बूती से परेशानी उत्पन्न करने के लिए लग रहे हैं।
  2. एक स्थिर आवंटित मानक लाइब्रेरी ऑब्जेक्ट को परिभाषित करना; मेरे मामले के लिए विशिष्ट std::vector है। पहले यह std::array किसी भी समस्या के बिना स्थैतिक रूप से आवंटित किया गया था। स्पष्ट रूप से सभी std:: स्थैतिक रूप से आवंटित ऑब्जेक्ट्स समस्या का कारण नहीं बनेंगे।
  3. ध्यान दें कि मैं किसी भी प्रकार की साझा लाइब्रेरी का उपयोग नहीं कर रहा हूं।
  4. GCC/ARM cross compiler उपयोग में है।

यदि यह आपके उपयोग के मामले तो केवल अपने संकलन/लिंक कमांड लाइन करने के लिए कमांड लाइन विकल्प जोड़ने है: -fno-use-cxa-atexit

यहाँ __dso_handle usage as 'handle to dynamic shared object' लिए एक बहुत अच्छा संबंध है।

वहाँ पेज लिखने में कोई गलती हो गया लगता है, लेकिन मुझे नहीं पता कि जो पुष्टि करने के लिए संपर्क करने के लिए है:

के बाद आप वस्तुओं 'निर्माता विनाशकर्ता कहा जाता है जीसीसी स्वचालित रूप से फ़ंक्शन को कॉल ...

मैं और लगता है कि यह पढ़ना चाहिए "एक बार सभी विनाशकर्ता जीसीसी फ़ंक्शन को कॉल बुलाया गया है" ...

एक तरीका यह पुष्टि करने के लिए __cxa_atexit समारोह को लागू किया जाएगा के रूप में उल्लेख तो एक कदम कार्यक्रम है और यह जहां देखना बुलाया जाता है मैं इन दिनों में से एक कोशिश करूँगा, लेकिन अभी नहीं।

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