2013-01-16 16 views
5

के लिए प्रोग्राम संकलित करना मैंने एक अद्यतित लिनक्स मशीन में एक प्रोग्राम को संकलित और लिंक किया, और इसे 9 साल की एक और लिनक्स में चलाया। यह मुझे एक त्रुटि "FATAL: कर्नेल बहुत पुराना" दिया और छोड़ दिया। विशेष रूप से, नया एक Fedora 18 (gcc 4.7.2, glibc 2.16, कर्नेल 3.7.2) है और पुराना एक RHEL4.8 (glibc 2.3.4, कर्नेल 2.6.9) है। चूंकि यह स्थैतिक लिंकिंग है, ग्लिबैक संस्करण से कोई फर्क नहीं पड़ता। मुझे लगता है कि यहां समस्या यह है कि प्रोग्राम सिस्टम कॉल को कॉल करता है जो पुराने कर्नेल में नहीं है।पुरानी कर्नेल

यदि पुराने सिस्टम पर विकास एक विकल्प नहीं है, तो मैं नए सिस्टम में प्रोग्राम कैसे बना सकता हूं और पुराने (या इससे भी बेहतर दोनों) में कैसे चला सकता हूं? मैं एक संगत मोड में जीसीसी चलाने के लिए एक रास्ता तलाश रहा था, जो केवल पुराने सिस्टम कॉल को कॉल करता है। अभी तक कोई भाग्य नहीं है।

+2

ग्लिब का पुराना संस्करण प्राप्त करें और इसके खिलाफ लिंक प्राप्त करें। नया glibc पुराने कर्नेल पर नहीं चलेंगे। –

उत्तर

5

सबसे आसान विकल्प हमेशा पुराने सिस्टम पर बनाना है।

वैकल्पिक रूप से, पुराने सिस्टम से नए सिस्टम में ग्लिबिक हेडर और स्थैतिक पुस्तकालयों की प्रतिलिपि बनाएँ और उन लोगों के खिलाफ लिंक करें।

यदि यह काम नहीं करता है, तो आपको --enable-kernel=2.6.9 या उसके जैसा कुछ ग्लिब का पुनर्निर्माण करना होगा।

+0

धन्यवाद। यदि मैं सक्षम-कर्नेल के साथ glibc का पुनर्निर्माण करता हूं, तो क्या मुझे उस glibc के साथ libjpeg जैसे अन्य सभी पुस्तकालयों का पुनर्निर्माण करना होगा? दूसरे शब्दों में, स्टॉक libjpeg के साथ मेरा कस्टम glibc लिंक कर सकते हैं? –

+0

मुझे विश्वास नहीं है। मुझे लगता है कि ध्वज केवल सिस्टम कॉल के बैकएंड उपयोग को समायोजित करता है, लेकिन आप अभी भी एक ही सी लाइब्रेरी का उपयोग कर रहे हैं। आपको पता चलेगा कि नवीनतम सी लाइब्रेरी केवल कुछ तारीखों के बाद कर्नल का समर्थन करती है, इसलिए आपको अब तक वापस जाने के लिए पुराने संस्करण में डाउनग्रेड करना पड़ सकता है। मैं सिस्टम लाइब्रेरी के रूप में पुरानी लाइब्रेरी को स्थापित करने की अनुशंसा नहीं करता। बस इसे बनाएं जहां आप इसके निर्माण के लिए इसके खिलाफ लिंक कर सकते हैं (आपको कुछ कस्टम कंपाइलर झंडे की आवश्यकता होगी)। – ams

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