64-बिट VM पर 32-बिट प्रोग्राम चलाने में असमर्थ


12

मैंने Ubuntu 10.04 32 बिट मशीन पर एक छोटा "हैलो वर्ल्ड" सी प्रोग्राम संकलित किया। फिर मैंने निष्पादन योग्य (a.out) को Ubuntu 12.10 (64 बिट) VMWare वर्चुअल मशीन पर रखा और इसे (./ a.out) निष्पादित करने का प्रयास किया। OS फ़ाइल की पहचान नहीं करता है और कहता है कि 'ऐसी कोई फ़ाइल या निर्देशिका' नहीं है। लेकिन जब मैं उबंटू 12.10 (64 बिट) पर 64 बिट लैपटॉप पर एक ही निष्पादन योग्य लगाता हूं, तो यह ठीक चलता है और मुझे वांछित आउटपुट मिलता है। VM IBM ब्लेड सर्वर पर चल रहा है। मैं जानना चाहता था कि वीएम के लिए परिणाम क्यों?

जवाबों:


20

संदेश No such file or directoryआपकी निष्पादन योग्य फ़ाइल को संदर्भित नहीं करता है a.out:। इसके बजाय यह एक सहायक कार्यक्रम को संदर्भित करता है जिसे 32 बिट गतिशील रूप से जुड़े निष्पादन योग्य चलाने की आवश्यकता होती है a.out

अब, मैंने इन सभी को इस अच्छे लेख में बहुत अच्छी तरह से समझाया:

स्थैतिक और गतिशील संबंध

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

डायनामिकली लिंक्ड प्रोग्राम अलग तरीके से काम करते हैं: प्रोग्राम में लाइब्रेरी फ़ंक्शन को नाम से भी संदर्भित किया जाता है। कार्यक्रम का निर्माण करते समय, दो सूचियों को इकट्ठा किया जाता है और कार्यक्रम के साथ संग्रहीत किया जाता है: पुस्तकालय की एक सूची का उपयोग किन स्थानों पर किया जाता है, और पुस्तकालयों की एक सूची जिसमें कार्यक्रम द्वारा उपयोग किए जाने वाले कार्य शामिल हैं। कार्यक्रम के निर्माण के लिए बस इतना ही।

बाद में, निष्पादन के समय , एक विशेष सहायक कार्यक्रम, तथाकथित गतिशील लिंकर, पुस्तकालय सूची पर प्रत्येक पुस्तकालय के लिए फ़ाइल सिस्टम में विशिष्ट स्थानों पर दिखता है और इसे मेमोरी में लोड करता है। अब डायनामिक लिंकर से पता चलता है कि लाइब्रेरी के कार्यों के लिए कौन सी मेमोरी पते हैं। यह लाइब्रेरी फ़ंक्शन को कॉल करने वाले सभी स्थानों में सही पता लिखने के लिए पहली सूची का उपयोग करता है। फिर गतिशील रूप से जुड़ा कार्यक्रम चलाया जा सकता है।


3
यह "कोई फ़ाइल नहीं मिली" त्रुटि संदेश ने मुझे पहली बार ° then ° भी उलझन में डाल दिया, तो मुझे समझ में आया कि ऐप द्वारा आवश्यक कुछ फ़ाइल गायब थी।
रामचंद्र आप्टे

@Radu Reandeanu, आप एक सहायक कार्यक्रम को क्या कहते हैं ? मुझे लगता है कि एक गतिशील रूप से जुड़ा हुआ पुस्तकालय है। यदि ऐसा है, तो इसे एक सहायक कार्यक्रम कहना केवल स्पष्टीकरण को गलत बताता है।
गोलेम

इस मुद्दे को समझने के लिए मुझे उपयोगी एक लिंक मिला है - 64-बिट सिस्टम पर 32-बिट बाइनरी चलाने पर "नहीं मिला" संदेश प्राप्त करना
golem
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.