2012-05-30 11 views
33

मुझे वर्तमान यूबंटू (12.04) पर एक प्रोग्राम संकलित करना है। इस कार्यक्रम को तब पुराने कर्नेल (2.6.18) के साथ CentOS का उपयोग करके क्लस्टर पर चलाना चाहिए। दुर्भाग्यवश, मैं सीधे क्लस्टर पर संकलित नहीं कर सकता। यदि मैं बिना किसी बदलाव के प्रोग्राम को संकलित और कॉपी करता हूं तो मुझे त्रुटि संदेश "कर्नेल बहुत पुराना" मिलता है।पुराने libc के साथ संकलित (संस्करण 'GLIBC_2.14' नहीं मिला)

जिस तरह से मैंने इसे समझ लिया, इसका कारण कर्नेल संस्करण इतना नहीं है, लेकिन libc का संस्करण जिसे संकलन के लिए उपयोग किया गया था। तो मैंने क्लस्टर से libc को जोड़ने और स्थिर रूप से अन्य सभी को जोड़ने के अपने प्रोग्राम को संकलित करने की कोशिश की।

रिसर्च

वहां पहले से ही इतने पर इस बारे में सवाल का एक बहुत हैं, लेकिन जवाब में से कोई भी वास्तव में मेरे लिए काम किया। तो यहाँ उस विषय पर अपना शोध है:

  • This question कर्नेल बहुत पुराना संदेश के लिए कारण
  • This question समान है, लेकिन और अधिक विशिष्ट है बताते हैं और कोई जवाब
  • स्थिर लिंक करने के रूप में प्रस्तावित किया गया है here काम नहीं किया क्योंकि क्लस्टर पर libc बहुत पुराना है। एक उत्तर में पुराने libc का उपयोग करने का भी उल्लेख है, लेकिन यह नहीं बताता कि यह कैसे करें।
  • One way एक पुराने ओएस चलाने वाले वीएम में संकलित करना है। यह काम किया लेकिन जटिल है। मैं भी पढ़ा है कि you should not link libc statically
  • Apparently यह is possible

    मैं कॉपी किया विकल्प -rpath के साथ एक अलग libc संस्करण के लिए संकलित करने के लिए, लेकिन यह मेरे लिए काम नहीं किया है (नीचे देखें)

वर्तमान स्थिति निर्देशिका /path/to/copied/libs

  • में समूह से फ़ाइलें निम्न
  • 0 libc-2.5.so
  • libgcc_s.so.1
  • libstdC++। So.6

और विकल्प -nodefaultlibs -Xlinker -rpath=/path/to/copied/libs -Wl,-Bstatic,-lrt,-lboost_system,-lboost_filesystem -Wl,-Bdynamic,-lc,-lstdc++,-lgcc_s

संकलित बाइनरी पर ldd के उत्पादन

mybin: /path/to/copied/libs/libc.so.6: version `GLIBC_2.14' not found (required by mybin) 
mybin: /path/to/copied/libs/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by mybin) 
linux-vdso.so.1 => (0x00007ffff36bb000) 
libc.so.6 => /path/to/copied/libs/libc.so.6 (0x00007fbe3789a000) 
libstdc++.so.6 => /path/to/copied/libs/libstdc++.so.6 (0x00007fbe37599000) 
libgcc_s.so.1 => /path/to/copied/libs/libgcc_s.so.1 (0x00007fbe3738b000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fbe37bf3000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fbe37071000) 

मैं है साथ संकलन कर रहा हूँ मैं कुछ हद तक त्रुटि से उलझन में हूं, क्योंकि यह सही पथ का उपयोग करता है (यानी क्लस्टर से libc) लेकिन अभी भी एक लापता glibc संस्करण के बारे में शिकायत। क्लस्टर पर ldd चलाते समय यह not a dynamic executable देता है और ऊपर उल्लिखित दो त्रुटियों में द्विआधारी परिणाम चलाता है। ऐसा लगता है कि अन्य पुस्तकालयों में शामिल हैं (linux-vdso.so.1, ld-linux-x86-64.so.2 और libm.so.6)। क्या मुझे उन पुराने संस्करणों का भी उपयोग करना चाहिए?

तो अब मैं दो मुख्य प्रश्न हैं:

  • यह और भी सही दृष्टिकोण यहाँ है?
  • यदि हां: मैं पुराने libc को सही तरीके से कैसे लिंक करूं?

उत्तर

10

this उत्तर देखें।

यह और भी सही दृष्टिकोण यहाँ

है नहीं: आप के रूप में अपने लिंक आदेश करता है glibc के बेमेल संस्करणों का उपयोग नहीं कर सकते। आपने और ld-linux.soसे (सिस्टम-स्थापित) libc, लेकिन libc.so.6 पुराने (क्लस्टर से कॉपी) libc से उपयोग किया था। यह सिर्फ काम नहीं करेगा।

2

-rpath DT_RPATH टैग सेट लेकिन libs के लिए वहाँ देखने के लिए लिंकर नहीं बताता है, तो आप उस के लिए -L चाहते हैं।