2012-02-06 13 views
5

यहां स्थिति है, मुझे एक सी ++ कोडबेस मिला है जो हाल ही में जीसीसी (4.3.3) का उपयोग कर रहा है, लेकिन मुझे जीसीसी 3.2 का उपयोग करके बनाई गई एक पुरानी लाइब्रेरी के खिलाफ लिंक करने की आवश्यकता है। 3। लाइब्रेरी का कोई नया संस्करण उपलब्ध नहीं है, मैं इसके बिना नहीं जा सकता, और यह बंद स्रोत है इसलिए इसे पुनर्निर्मित नहीं किया जा सकता है।विरासत पुस्तकालयों के खिलाफ निर्माण करने के लिए सी ++ एबीआई मिश्रण

ऐसा लगता है कि जीसीसी 4.3.3 और 3.2.3 के बीच एबीआई असंगतताएं हैं, इसलिए मैं यह देखने की कोशिश कर रहा हूं कि इसका समाधान करने के लिए मेरे विकल्प क्या हैं।

कुछ अतिरिक्त विवरण:

  • मैं सही ABI संस्करण प्राप्त करने के -fabi-संस्करण = 1 के साथ अपने codebase में सब कुछ के पुनर्निर्माण कर सकते हैं, लेकिन मैं libstdc से कुछ नई सुविधाओं पर निर्भर कर रहा हूँ ++ संस्करण 6.
  • कोडबेस के बाहर सभी सी ++ लाइब्रेरी निर्भरता ओपन सोर्स हैं, इसलिए मैं इसे एक पुस्तकालय को छोड़कर, आवश्यकतानुसार पुनर्निर्माण कर सकता हूं।
  • कई सी लाइब्रेरी निर्भरता जिन्हें पुनर्निर्माण नहीं किया जा सकता है या पुनर्निर्माण करना मुश्किल होगा।

    • -fabi-संस्करण = 1 और लिंक के साथ सभी सी ++ कोड और निर्भर पुस्तकालयों के पुनर्निर्माण:
    • पुराने पुस्तकालय 5 सुविधाओं

    मैं अब तक की कोशिश की है कुछ libstdC++ संस्करण पर निर्भर हो रहा है libstdC++ संस्करण 6 के खिलाफ। यह C++ मानक लाइब्रेरी प्रतीकों के लिए अपरिभाषित प्रतीक त्रुटियों के कुछ हद तक विफल रहता है।

  • उपरोक्त के समान लेकिन libstdC++ 5 के लिए साझा लाइब्रेरी में अतिरिक्त लिंक, यह लिंकर समस्याओं को हल करता है लेकिन परिणामस्वरूप विरासत पुस्तकालय के अंदर रनटाइम पर दो संस्करणों का मिश्रण होता है, और इससे क्रैश होता है। जो संकेत मिलता है कि यह एक आवेदन में सी ++ ABI संस्करणों मिश्रण करने पुस्तकालयों के बीच अलग-अलग निर्भरता को पूरा करने के लिए संभव हो सकता है लगता है http://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html:

मैं इस पेज को पढ़ें। यह यहां बहुत अच्छी तरह से काम नहीं कर रहा है, हालांकि, जब तक कि मुझे कुछ याद नहीं आ रहा है।

कोई विचार?

+0

लिंकर विकल्प '-स्सिम्बोलिक' और '- एक्सक्लूस-लिब्स' आपको मदद कर सकते हैं यदि आप पुरानी libstdC++ को एक साझा लाइब्रेरी में स्थिर रूप से लिंक करते हैं। –

उत्तर

3

ठीक है, अपने समाधान नहीं है करने के लिए:

  • वर्ष सी ++ पुस्तकालय के लिए एक 'सी' इंटरफ़ेस लिखते हैं, 3.2.3 के साथ संकलन तो यह काम करेंगे।
  • अब आप नए कंपाइलर में सी इंटरफ़ेस का उपयोग कर सकते हैं।

आप सी लाइब्रेरी के आस-पास कुछ सी ++ "रैपर" कोड लिख सकते हैं ताकि आप इसे सी ++ के रूप में उपयोग कर सकें लेकिन यह कोड नए कंपाइलर में बनाया जाएगा।

+1

बेशक, इसमें गोंद कोड का एक गुच्छा जोड़ने का नुकसान है, लेकिन सी कंपाइलर/संस्करणों की किसी भी जोड़ी के साथ काम करने का लाभ है। – kibibu

+0

यह एक उचित दृष्टिकोण की तरह लगता है। यदि मैं इसमें से एक साझा लाइब्रेरी बना देता हूं, तो फिर भी पुरानी libstdC++ साझा लाइब्रेरी पर निर्भरता होगी। क्या मुझे एक ही समस्या नहीं होगी? या क्या मुझे पुराने संस्करण में स्थिर रूप से लिंक करना चाहिए? –

+0

कुछ और खुदाई करने के बाद, ऐसा लगता है कि पुराने जीसीसी से इस साझा लाइब्रेरी में libstdC++ में स्थिर रूप से लिंक करना सही है।हालांकि, इसके खिलाफ जुड़ाव है, मुझे संदेह है कि काफी पर्याप्त नहीं है, क्योंकि लाइब्रेरी सीमा में प्रतीकों को साझा करने के साथ पहले आप प्रभावी रूप से एक ही समस्या का सामना करेंगे। मुझे लगता है कि आप एप्लिकेशन के अंदर एक dlopen करके और RTLD_NOW का उपयोग करके किसी भी मौके को खत्म कर सकते हैं RTLD_DEEPBIND | RTLD_LOCAL। –

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