2013-05-14 5 views
6

This पोस्ट जो मैं प्राप्त करने की कोशिश कर रहा हूं उस पर वास्तव में जानकारीपूर्ण है। मैंने एक साधारण हैलोइनीक्स बाइनरी का उत्पादन किया।अन्य मशीनों पर एक ghc संकलित बाइनरी कैसे चलाएं?

$ echo 'main = putStrLn "Hello Unix"' > HelloUnix.hs 
$ ghc -static --make HelloUnix.hs 

जो एक HelloUnix द्विआधारी बनाया, मैं -static झंडा सब कुछ के साथ उम्मीद थी द्विआधारी अंदर बंडल ताकि सभी को चलाने के लिए बाइनरी फ़ाइल में ही था की जरूरत है है। मैंने बाइनरी को एक और यूनिक्स मशीन में स्थानांतरित कर दिया, यह सुनिश्चित किया कि फाइल chmod के माध्यम से सही पहुंच विशेषाधिकार है। बाइनरी चलाएं लेकिन यह त्रुटि

bash: ./HelloUnix: cannot execute binary file 

इस पर डीबग करने के तरीके पर कोई विचार?

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

EDIT2: स्रोत मशीन:

[email protected]:~/Haskell_Program/SmallApp/HelloUnix$ uname -a 
Linux mike-1215B 3.0.0-13-generiC#22-Ubuntu SMP Wed Nov 2 13:27:26 UTC 2011 x86_64 x86_64 x86_64 GNU/Linux 
[email protected]:~/Haskell_Program/SmallApp/HelloUnix$ file HelloUnix 
HelloUnix: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xa44cf0e797cd629e0add59722d51d2b20e00fad8, not stripped 
[email protected]:~/Haskell_Program/SmallApp/HelloUnix$ ldd HelloUnix 
linux-vdso.so.1 => (0x00007fff8404f000) 
libgmp.so.10 => /usr/lib/x86_64-linux-gnu/libgmp.so.10 (0x00007fa918584000) 
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007fa91837c000) 
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fa918081000) 
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fa917e79000) 
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fa917c75000) 
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fa9178b5000) 
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fa917698000) 
/lib64/ld-linux-x86-64.so.2 (0x00007fa918810000) 

रिमोट मशीन 1:

[[email protected]] hchiao [1:59] uname -a 
SunOS rimmer 5.9 Generic_122301-48 i86pc i386 i86pc 
[[email protected]] hchiao [1:60] file HelloUnix 
HelloUnix:  ELF 64-bit LSB executable Version 1, dynamically linked, not stripped 

रिमोट मशीन 2:

[email protected]:~/cloud-haskell$ uname -a 
Linux ip-10-240-88-224 3.2.0-36-virtual #57-Ubuntu SMP Tue Jan 8 22:21:19 UTC 2013 i686 i686 i386 GNU/Linux 
[email protected]:~/cloud-haskell$ file HelloUnix 
HelloUnix: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xa44cf0e797cd629e0add59722d51d2b20e00fad8, not stripped 

EDIT3: मैं अब में कोड संकलन कर रहा हूँ मशीन 2 और मशीन में बाइनरी चलाने की कोशिश कर रहा है 1. मुझे लगता है क्योंकि उनमें से दोनों i386 हैं इसलिए बाइनरी अन्य मशीन पर चलने में सक्षम होना चाहिए। (? गतिशील जोड़ने शायद): हालांकि मैं इस त्रुटि मिल रही है

HelloUnix: Cannot find /lib/ld-linux.so.2 
Killed 

मुझे लगता है यह कह रहा है कि एक पुस्तकालय (ld-linux.so.2) बाइनरी पर निर्भर अपने लक्षित मशीन में नहीं है। मैं झंडे -static क्या किया था पर थोड़ा उलझन में हूँ? मैंने ध्वज के साथ माना, सभी निर्भरताओं को बाइनरी में बंडल किया जाएगा। हास्केल कोड पोर्टेबल बनाने का सबसे अच्छा तरीका क्या होगा?

+6

शायद समस्या आपकी फ़ाइल और लक्ष्य मशीन की बेमेल आर्किटेक्चर है। आप इसे जांचने के लिए 'uname -a' और' HelloUnix 'फ़ाइल चला सकते हैं। –

+3

शायद यह कम से कम उपयोगी त्रुटि संदेश है जिसके लिए मैं आशा करता हूं। स्रोत मशीन क्या थी? लक्ष्य मशीन क्या है? शेष गतिशील पुस्तकालय क्या हैं ('ldd' का उपयोग करें)? क्या वे लक्ष्य पर उपलब्ध हैं? –

+1

'i386' मशीन 'x86-64' निष्पादन योग्य नहीं चलाएगी। –

उत्तर

5

यदि आप एक ही वास्तुकला को लक्षित कर रहे हैं, तो इसे बिना किसी झगड़े के काम करना चाहिए (जब तक आवश्यक डेटा फ़ाइलों को भी वितरित किया जाता है)।

यदि आप एक अलग वास्तुकला को लक्षित कर रहे हैं, जैसे कि आपके मामले में, आपको लक्ष्य प्लेटफॉर्म के लिए क्रॉस-संकलन करना होगा; GHC wiki देखें।

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