2011-10-04 7 views
20

डाउनलोड और संकलित glibc-2.13। जब मैं एक नमूना सी प्रोग्राम चलाने की कोशिश करता हूं जो एक malloc() करता है। मैं त्रुटि निम्न मिल elf file OS ABI invalidglibc: elf फ़ाइल ओएस एबीआई अमान्य

किसी को भी इस issue.Please टिप्पणी को हल मेरी कर्नेल संस्करण लिनक्स 2.6.35.9

+0

यह जानकारी पर थोड़ा सा छोटा है। क्या आप वाकई उस libc के खिलाफ लिंक और चल रहे हैं? – Mat

उत्तर

29

है कि मेरे किसी भी सूचक मददगार पारित कृपया यह अपने कर्नेल संस्करण यही समस्या है नहीं है।

आपके सिस्टम पर लोडर नए Linux एबीआई का समर्थन नहीं करता है। अपेक्षाकृत हाल ही में, लिनक्स ईएलएफ बाइनरी ने System V एबीआई का उपयोग किया था। हाल ही में, STT_GNU_IFUNC के समर्थन में, Linux एबीआई जोड़ा गया था। आपको अपने सिस्टम सी लाइब्रेरी को STT_GNU_IFUNC का समर्थन करने वाला लोडर रखने के लिए अपडेट करना होगा, और फिर यह Linux एबीआई प्रकार के साथ ईएलएफ ऑब्जेक्ट्स को भी पहचान लेगा।

यदि आप परवाह करते हैं तो STT_GNU_IFUNC क्या करता है, इसकी समझ प्राप्त करने के लिए Dave Miller's blog entry on STT_GNU_IFUNC for Sparc देखें।

+1

अरे धन्यवाद mkj। वह जानकारी का एक अच्छा टुकड़ा था। मैंने बस ld-linux.so को बदल दिया (मूल रूप से, ld-2.13.so) और चीजें मेरे लिए काम करना शुरू कर दिया। बस अगर आप उत्सुक हैं, तो मेरा सेटअप ऐसा है कि मैंने लिनक्स-डिस्कलेस लक्ष्य बनाया है और इसे वर्चुअल बॉक्स पर चलाया है। समस्या तब दिखाई दे रही थी जब रूट-एफएस में मैंने libc.so.6 (glibc-2.9 या so) को libc.so.6 (glibc-2.13) में बदल दिया था और पिछले libc.so के ओएस-एबीआई की तुलना करने पर। 6 यह "सिस्टम वी" दिखाया गया, जहां नए व्यक्ति के पास "लिनक्स" था, जैसा आपने कहा था। – Kapil

+0

आह, मुझे एहसास नहीं हुआ कि आपने लोडर को प्रतिस्थापित किए बिना सिस्टम सी लाइब्रेरी को प्रतिस्थापित किया है, या मैं अपनी सलाह में अधिक विशिष्ट होता। मैंने माना था कि आप वैकल्पिक पुस्तकालय लोड करने के लिए LD_LIBRARY_PATH का उपयोग करने जैसे कुछ कर रहे थे। मदद करने में खुशी हुई! – mkj

2

यह संभव है आपके glibc --enable-multiarch झंडा कि ifunc और नए लिनक्स ABI

1

का उपयोग कर कि मैं क्या बता सकता है कि --enable-multiarch डिफ़ॉल्ट सेटिंग है और आप --enable-multiarch=no निर्धारित करके इसे अक्षम करना चाहिए है से मजबूर साथ बनाया गया था।

0

यदि आप लोडर में अपने सिस्टम को नए सिस्टम से प्राप्त करते हैं, तो आप इसका उपयोग करके इसे काम करने में सक्षम हो सकते हैं। लेकिन जहां भी आपका प्रोग्राम जाए, आपको लोडर ले जाना होगा। आप या तो here समझाए गए लोडर का उपयोग करने के लिए अपने प्रोग्राम को संकलित कर सकते हैं, या अपने प्रोग्राम को संकलित कर सकते हैं और इसे बाद में पैचेलफ का उपयोग करके पैच कर सकते हैं, जैसा कि मैंने here का उल्लेख किया है। मैं एक प्रोग्राम चलाने में सक्षम था जो मुझे लिनक्स 2.6.18 (आपके से पुराना) पर OS ABI invalid त्रुटि दे रहा था जिसमें ld-2.5.so था, ld-2.15.so को कहीं और से कॉपी करके।

नोट: अपने सिस्टम ld * .so या ld-linux को ओवरराइट करें। ; -/

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