2009-11-10 8 views
15

सुप्रभात,मिश्रित 64 बिट/32 बिट सिस्टम में साझा पुस्तकालय कैसे काम करते हैं?

64 बिट रेडहाट बॉक्स पर हमें 32 बिट एप्लिकेशन संकलित और चलाने के लिए है। इस बीच मैंने 32 बिट में आवश्यक जीसीसी संस्करण (4.0.3) और सभी आवश्यक रनटाइम पुस्तकालयों को संकलित करने में कामयाब रहे और 32 बिट संस्करणों को इंगित करने के लिए एलडी_LIBRARY_PATH सेट किया है, लेकिन अब शेष निर्माण प्रक्रिया के दौरान, एक छोटे जावा कार्यक्रम को निष्पादित करने की आवश्यकता है 64 बिट प्रोग्राम के रूप में/usr/bin में स्थापित है, जो अब libgcc_s.so के 32 बिट संस्करण को पाता है।

सामान्य रूप से, यदि मैंने 32 बिट संस्करणों में एलडी_LIBRARY_PATH सेट किया है, तो मैंने 64 बिट प्रोग्राम तोड़ दिए और इसके विपरीत।

यह कैसे काम करना चाहिए? मुझे यकीन है कि मैं इस समस्या के साथ पहले व्यक्ति नहीं हूं। यह आमतौर पर कैसे हल किया जाता है?

सादर, स्टीफन

+0

आप अपने निर्माण को बनाए रखने के लिए क्या उपयोग कर रहे हैं? मेकफ़ाइल? –

+0

हां, मेकफ़ाइल। – struppi

उत्तर

2

समाधान के लिए, एक छोटे से खोल स्क्रिप्ट जो unset रों LD_LIBRARY_PATH और फिर निष्पादन कॉल में जावा कॉल लपेट दें। वैकल्पिक रूप से, यह भी काम कर सकते हैं:

LD_LIBRARY_PATH= java... 

नोट "=" और निष्पादन के नाम के बीच की जगह।

+0

विचार के लिए धन्यवाद, यह शायद इस विशेष मामले में काम करेगा। हालांकि मैं एक अधिक सामान्यीकृत दृष्टिकोण की तलाश में था, जिसे मशीन पर बिल्ड स्क्रिप्ट को बदलने की आवश्यकता नहीं है। – struppi

+0

हां; मुझे यकीन नहीं है कि स्वचालित पिकअप कैसे काम करता है। मैं 32 बिट ऐप इंस्टॉल करने और उस पर "ldd" चलाने का सुझाव देता हूं। यदि पुस्तकालयों की यह पसंद है, तो यह /etc/ld.conf और ldconfig में कुछ जादू होनी चाहिए: http://linux.die.net/man/8/ldconfig –

3

सोलारिस पर LD_LIBRARY32_PATH और LD_LIBRARY64_PATH का उपयोग कर सकते हैं, लेकिन यह लिनक्स पर समर्थित नहीं है।

सामान्य में, तुम सिर्फ कभी नहीं की आवश्यकता चाहिए पहली जगह में सब पर LD_LIBRARY_PATH स्थापित करने के लिए: /usr/lib32 या /usr/lib64 रूप उचित में

  • या तो जरूरत पुस्तकालयों स्थापित करें, या
  • अपने 32 का निर्माण -Wl,-rpath=/path/to/32-bit/libs
+0

क्या यह सिर्फ 'LD_LIBRARY_PATH' नहीं है,' Solaris पर LD_LIBRARY_PATH_32' और 'LD_LIBRARY_PATH_64'? – maxschlepzig

0

साथ -बिट आवेदन बस ०१२३४४८६८७१ सेट दोनों मार्गों के लिए(कोलिन्स को डिलीमिट करने के लिए उपयोग करें)। लिंकर उन पुस्तकालयों को अनदेखा कर देगा जो इसे पढ़ नहीं सकते हैं।

+0

यह अच्छा होगा, लेकिन - कम से कम मेरे पर्यावरण में - यह काम नहीं कर रहा था। लोडर शिकायत की थी; यह उन पुस्तकालयों को बस नहीं छोड़ता जो बिट-नेस से मेल नहीं खाते हैं। अफसोस की बात है! – struppi

+0

यह बहुत अजीब बात है, क्या आप वर्णन कर सकते हैं कि चीजें कैसे विफल हुईं? इसके अलावा, शायद 'ldd' के आउटपुट पोस्ट करें? –

0

मुझे 64 बिट कर्नेल चलाने वाली 32 बिट tinycore64 प्रणाली को remastering करते समय मुझे एक ही समस्या का सामना करना पड़ा है।

अधिक खोज के बाद, मैंने पाया है कि इन टिप्पणियों में से दोनों को क्यों समझदारी होगी। ।

"यह अच्छा होगा, लेकिन - कम से कम मेरी वातावरण में - यह काम करने के लिए प्रकट नहीं किया था लोडर शिकायत की थी, यह बस पुस्तकालयों कि बिट सत्ता से मेल नहीं खाते को छोड़ नहीं किया। अफसोस की बात है!" - struppi

"यह बहुत अजीब है, क्या आप वर्णन कर सकते हैं कि चीजें कैसे विफल हुईं? इसके अलावा, शायद ldd के आउटपुट को पोस्ट करें?" - एडम गूदे

और यह टिप्पणी क्यों सच साबित हो सकती है लेकिन वास्तव में गलत है।

लिंकर उन पुस्तकालयों को अनदेखा कर देगा जो इसे पढ़ नहीं सकते हैं।

यह लिंक शेड पर कुछ प्रकाश है। http://www.markusbe.com/2009/09/about-running-32-bit-programs-on-64-bit-ubuntu-and-shared-libraries/

और अधिक बिंदु पर, आपको ld.so manpage प्रबुद्धता मिल जाएगी।

यह पता चला है कि रनटाइम लिंकर ld.so लाइब्रेरी लोड होने के रूप में चुनने में पथ का नाम बदल सकता है। मेरे 64 बिट लिनक्स सिस्टम पर मेरे पास मानक वाले के अलावा विषम निर्देशिका नामों की एक श्रृंखला है। जैसे/Lib/x86_64-linux-gnu। मैंने वास्तव में सोचा कि मैं पुस्तकालयों को उस पथ में/lib64 पर ले जाकर प्रयोग करूंगा। जब मैंने ऐसा किया, तो क्या हुआ? अचानक मेरे 64 बिट ऐप (इस मामले में ब्रक्टल) काम नहीं किया और "गलत ईएलएफ कक्षा" के साथ शिकायत की। हैलो ... अब हम कुछ पर हैं।

अब मैं 100% निश्चित नहीं हूं लेकिन कुंजी आरपीएथ टोकन विस्तार से संबंधित प्रतीत होती है। मुझे संदेह है कि $ {PLATFORM} विस्तार के साथ कुछ करने के लिए हो सकता है। और x86_64 नाम का हिस्सा होना चाहिए।

किसी भी मामले में, मैंने पाया कि जब मैंने अपनी 64-बिट पुस्तकालयों को लाइब्रेरी पथों में x86_64-linux-gnu नाम दिया है, तो बस lib64 के लिए अपील की गई है, तो उन्हें 32 बिट वाले लोगों और चीजों को काम करने के लिए प्राथमिकता दी गई थी।

अपने मामले में, शायद आप 64 बिट पर 32 बिट पुस्तकालयों के लिए कुछ समान करना चाहते हैं। I386-linux-gnu आज़माएं।

mkdir /lib/x86_64-linux-gnu/ 
mkdir /usr/lib/x86_64-linux-gnu/ 
ln -s /lib/x86_64-linux-gnu /lib64 
ln -s /usr/lib/x86_64-linux-gnu /usr/lib64 

64 बिट रास्तों और 32 बिट/lib & के लिए 32 बिट पुस्तकालयों के लिए अपने 64 बिट पुस्तकालयों जोड़ें:

मेरे मामले जहां मैं एक 32 बिट userland पर 64 बिट साझा पुस्तकालयों को स्थापित करने से कर रहा हूँ में

तो, मैं निम्नलिखित पथ बनाया/usr/lib पथ केवल।

फिर ld.so.conf पर 64 बिट विशिष्ट पथ जोड़ें और ldconfig के साथ अपने कैश को अपडेट करें अब आपके 32-बिट & 64-बिट अनुप्रयोग निर्बाध रूप से चलेंगे।

8

दोनों 32-बिट और 64-बिट निर्देशिकाओं को LD_LIBRARY_PATH में जोड़ें।

यदि आप ऐसा करते हैं, तो 32-बिट या 64-बिट के लिए ld.so सही पुस्तकालयों का उपयोग करेगा।

उदा। एक 32-बिट टेस्ट ऐप "टेस्ट 32" और 64-बिट टेस्ट ऐप "टेस्ट", जीसी के सिस्टम-व्यापी इंस्टॉलेशन को क्लोब करने से बचने के लिए, उपयोगकर्ता होमएडिर में जीसीसी और बिनुटिल्स के एक (नए संस्करण) की स्थानीय रूप से स्थापित प्रतिलिपि के साथ :

 
=> export LD_LIBRARY_PATH=/home/user1/pub/gcc+binutils/lib:/home/user1/pub/gcc+binutils/lib64 

=> ldd ./test32 
    libstdc++.so.6 => /home/user1/pub/gcc+binutils/lib/libstdc++.so.6 (0x00111000) 
    libgcc_s.so.1 => /home/user1/pub/gcc+binutils/lib/libgcc_s.so.1 (0x00221000) 

=> ldd ./test 
    libstdc++.so.6 => /home/user1/pub/gcc+binutils/lib64/libstdc++.so.6 (0x00007ffff7cfc000) 
    libgcc_s.so.1 => /home/user1/pub/gcc+binutils/lib64/libgcc_s.so.1 (0x00007ffff7ad2000) 

(कम दिलचस्प पुस्तकालय पथ निकाला गया)

यह दिखाता है कि लोडर गलत वास्तुकला के पुस्तकालयों की अनदेखी करने के पता है, कम से कम इस वैज्ञानिक लिनक्स 6.3 (RHEL व्युत्पन्न) सिस्टम पर। मैं अन्य distros इसी तरह काम करने की उम्मीद करेंगे, लेकिन इसका परीक्षण नहीं किया है।

हालांकि, यह आपके (अनिर्दिष्ट) डिस्ट्रो संस्करण से हाल ही में मामला हाल ही में शुरू हो सकता है।

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