如何在其他机器上运行GHC编译的二进制文件?

6

这篇文章非常详细地介绍了我想要实现的内容。 我创建了一个简单的HelloUnix二进制文件。

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

使用-static标志创建了一个HelloUnix二进制文件,我希望所有内容都被捆绑到二进制文件中,这样运行二进制文件所需的只是该文件本身。我将二进制文件传输到另一台Unix机器上,并通过chmod确保文件具有正确的访问权限。但运行二进制文件时出现了错误。

bash: ./HelloUnix: cannot execute binary file

有关如何调试这个问题的任何想法吗?

编辑: 我目前正在尝试开发分布式系统,因此希望将二进制文件分发到目标机器。我需要一种在任何机器上运行二进制文件的方法,这是我的目标。

编辑2: 源机器:

mike@mike-1215B:~/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
mike@mike-1215B:~/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
mike@mike-1215B:~/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:

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

远程计算机2:

ubuntu@ip-10-240-88-224:~/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
ubuntu@ip-10-240-88-224:~/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

编辑3: 我现在在机器2上编译代码,并尝试在机器1上运行二进制文件。我假设由于它们都是i386,所以二进制文件应该能够在另一台机器上运行。然而,我遇到了这个错误:

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

我认为这是在告诉我一个库(ld-linux.so.2),二进制文件依赖于它(动态链接可能?),但在我的目标机器上不存在。我对标志-static的作用有点困惑?我以为使用该标志,所有依赖项都会打包到二进制文件中。使Haskell代码可移植的最佳方法是什么?


6
也许问题在于你的文件架构与目标机器不匹配。你可以运行 uname -afile HelloUnix 来检查它。 - Fedor Gogolev
3
这可能是我所希望的最无用的错误信息。源机器是什么?目标机器是什么?剩余的动态库有哪些(使用“ldd”)?它们在目标机器上是否可用? - Thomas M. DuBuisson
1
“i386” 机器无法运行 “x86-64” 可执行文件。 - n. m.
那么没有交叉编译的方法吗? - HHC
2
构建交叉编译器当然是可能的,但我建议先尝试安装预编译的32位GHC版本。看起来这样会更简单。 - n. m.
1个回答

5

如果目标架构相同,只要必要的数据文件也被分发,它就应该可以无需任何麻烦地工作。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接