2012-08-13 8 views
5

के लिए जीएनयू अद्वितीय ऑब्जेक्ट प्रतीकों के बिना बिल्डिंग मैं वर्तमान में कोड के बड़े ढेर के लिए बिल्ड सिस्टम को अपडेट करने पर काम कर रहा हूं, जिसमें लिनक्स सी ++ प्रोजेक्ट शामिल है। यह अच्छा होगा अगर यहां पर सभी डेवलपर्स अपने विचारों के साथ हैकिंग करते समय बिल्ड चला सकते हैं, इसलिए मैं जांच कर रहा था कि लक्ष्य प्रणाली 2.6.18 होने के बावजूद यह बेहद आधुनिक लिनक्स सिस्टम पर बनाना संभव होगा।जीसीसी/जी ++: पुराने लिनक्स कर्नेल

'अस्पष्ट आधुनिक' द्वारा मैं जीसीसी 4.5+ की तरह कुछ अनुमान लगा रहा हूं, जो कि पिछले वर्ष या दो में वितरण हो सकता है। वर्तमान में मैं libstdC++ समस्या को स्थिर रूप से संकलित करके हल करता हूं, और किसी भी glibc मुद्दों को रैपर कोड के त्वरित बिट के साथ memcpy प्रतीकों (और इतने पर) के पुराने संस्करणों को रीमेप करके चारों ओर अच्छी तरह से काम किया जाता है। अब तक सब ठीक है।

एक समस्या जिसे मैं पूरी तरह से समझने के लिए प्रतीत नहीं कर सकता हूं यह है कि .o फाइलों से निष्पादन योग्य में बनाए गए कुछ प्रतीक 'यू' प्रकार हैं, जो एक जीएनयू अद्वितीय वस्तु है, जो ईएलएफ मानक का विस्तार है 2.6.18 बिल्कुल पहचान नहीं आता है। इसका मतलब यह है कि निष्पादन योग्य नहीं चलेगा क्योंकि यह प्रतीकों को नहीं ढूंढ सकता है, हालांकि वे वास्तव में मौजूद हैं (लक्ष्य पर 'प्रकार' टाइप करें, 'एनएम' से)।

कोई G ++ संकलित करते समय जीएनयू अद्वितीय वस्तुओं के उपयोग को अक्षम कर सकता है लेकिन यह बिल्कुल सबसे सुविधाजनक समाधान नहीं है। कोड को संकलित करते समय मुझे इसे अक्षम करने का कोई तरीका नहीं दिख रहा है (distro gcc/g ++ के पास हमेशा इस विकल्प पर है), और मुझे लगता है कि लक्ष्य प्रणाली को पहचानने का एकमात्र तरीका यह है कि यह ld-linux और कर्नेल को अपडेट करना होगा । यह लगभग निश्चित रूप से होने वाला नहीं है।

क्या कोई विकल्प है जो मुझे इन प्रतीक प्रकारों को अक्षम करने के लिए नहीं मिला है? या शायद इस के आसपास कुछ साफ रास्ता है, या कुछ जो मुझे याद आ रही है? मुझे संदेह है कि इसे जी ++ 4.1.x पर संकलित करना होगा, जिसका मतलब पुराने लिनक्स इंस्टॉलेशन या स्रोत से होगा।

+0

यदि यह एक गतिशील लिंकिंग प्रतीक प्रकार है, तो गतिशील लिंकर के साथ कोई समस्या होनी चाहिए, कर्नेल नहीं। यह कर्नेल से कैसे संबंधित है? – Hibou57

+0

जबकि मैंने इसे आजमाया नहीं है, मुझे लगता है कि कर्नेल को बदले बिना libld को बदलना बहुत कठिन होगा - अगर यह संभव है। तो यह सीधे कर्नेल से संबंधित नहीं है, लेकिन तथ्य यह है कि मुझे उस कर्नेल को फिर से कंपाइल करना होगा या लिंकर को इन अन्य प्रतीकों को पहचानने के लिए बस ओएस को अपग्रेड करना होगा, जैसा कि मैं समझता हूं। – rhickman

उत्तर

4

मैं एक ही समस्या से निपटने की कोशिश कर रहा था (जिसने मुझे यह प्रश्न ढूंढने का नेतृत्व किया) और अनुसंधान के एक समूह के बाद निश्चित निष्कर्ष पर आया कि नहीं, आप कुछ भी नहीं खो रहे हैं, इसके अलावा संकलन के अलावा इसके आसपास कोई रास्ता नहीं है अपने स्वयं के जी ++। जीसीसी सहायता मेलिंग सूची पर इस हाल के प्रश्न देखें:

http://gcc.gnu.org/ml/gcc-help/2013-01/msg00008.html

मैं जीसीसी सूत्रों तुलना की और पाया है कि आप शेयर 4.4 के रूप में उच्च जा सकते हैं, के रूप में अद्वितीय प्रतीक 4.5 में जोड़ा गया था। हालांकि आरएचईएल/सेंटोस 6 पर वे 4.4 तक डिफ़ॉल्ट हैं लेकिन इसमें अद्वितीय प्रतीक समर्थन है, इसलिए सामान्य रूप से वितरण-विशिष्ट जीसीसी संस्करणों से सावधान रहना चाहिए। मेरे लिए यह एक बड़ा बमर है क्योंकि इसका मतलब है कि आरएचईएल 6 पर संकलित चीजें आरएचईएल 5 पर नहीं चल सकती हैं, यहां तक ​​कि जीसीसी 4.4 + आरएचईएल 5

यहां संदेश है जहां अद्वितीय प्रतीक है समर्थन वैसे, घोषणा की गई थी:

http://www.redhat.com/archives/posix-c++-wg/2009-August/msg00002.html

आप अपने आस-खोजते हैं पाएंगे कि लोग विभिन्न कारणों के लिए अन्य सूचियों पर इसके बारे में शिकायत की है, लेकिन मुझे लगता है कि यह यहाँ है रहने के लिए।

+0

प्रतिक्रिया के लिए धन्यवाद। मुझे बस लिनक्स कर्नेल को अपग्रेड करने के बारे में ज़ोर देना होगा :) – rhickman

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