2013-05-14 95 views
6

This对于我想实现的目标而言,发布信息是非常有用的。 我制作了一个简单的HelloUnix二进制文件。如何在其他机器上运行ghc编译的二进制文件?

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

这创造了一个HelloUnix二进制,我是用-static标志都希望是使所有需要运行的二进制文件是文件本身的二进制文件内捆绑起来。我将二进制文件转移到另一台unix机器上,通过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做什么?我假设用这个标志,所有的依赖关系都会被捆绑在二进制文件中。什么是使Haskell代码可移植的最佳方式?

+6

也许问题是你的文件和目标机器的架构不匹配。你可以运行'uname -a'和'file HelloUnix'来检查它。 – 2013-05-14 06:03:59

+3

这也许是我希望的最不有用的错误信息。源机器是什么?目标机器是什么?剩下的动态库是什么(使用'ldd')?它们是否可用于目标? – 2013-05-14 06:09:31

+1

'i386'机器不会运行'x86-64'可执行文件。 – 2013-05-15 08:50:43

回答

5

如果你的目标是相同的架构,它应该没有任何大惊小怪(只要必要的数据文件也分发)。

如果你的目标是不同的架构,就像你的情况一样,你需要为目标平台进行交叉编译;请参阅GHC wiki