This的帖子真的很能说明我想要实现的目标。我生成了一个简单的HelloUnix二进制文件。
$ echo 'main = putStrLn "Hello Unix"' > HelloUnix.hs
$ ghc -static --make HelloUnix.hs
它创建了一个HelloUnix
二进制文件,我希望使用-static
标志,所有的东西都捆绑在二进制文件中,这样运行二进制文件所需要的就是文件本身。我将二进制文件传输到另一台unix机器上,确保该文件通过chmod
具有正确的访问权限。运行了二进制文件,但显示了以下错误
bash: ./HelloUnix: cannot execute binary file
对如何调试这个有什么想法吗?
编辑:我目前正在尝试开发一个分布式系统,因此希望只将二进制文件分发到目标机器。我需要一种方法来运行二进制文件,而不管它是在哪台机器上运行的,这就是我的目标。
EDIT2:源机器:
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
EDIT3:我现在正在机器2上编译代码,并尝试在机器1上运行二进制文件。我假设因为它们都是i386,所以二进制文件应该能够在另一台机器上运行。然而,我得到了这个错误:
HelloUnix: Cannot find /lib/ld-linux.so.2
Killed
我想这是在告诉我二进制文件所依赖的库(ld-linux.so.2
) (也许是动态链接?)不在我的目标机器上。我对标志-static
做了什么感到有点困惑?我假设有了这个标志,所有的依赖项都会被捆绑到二进制文件中。让Haskell代码可移植的最好方法是什么?
发布于 2013-05-15 12:54:15
如果您的目标是相同的体系结构,那么它应该可以正常工作(只要必要的数据文件也是分布式的)。
如果您的目标是不同的体系结构,则需要针对目标平台进行交叉编译;请参阅GHC wiki。
https://stackoverflow.com/questions/16536075
复制相似问题