【问题标题】:How to run a ghc compiled binary on other machines?如何在其他机器上运行 ghc 编译的二进制文件?
【发布时间】:2013-05-14 05:56:03
【问题描述】:

This 帖子对我想要实现的目标非常有用。 我生成了一个简单的 HelloUnix 二进制文件。

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

它创建了HelloUnix 二进制文件,我希望使用-static 标志将所有内容捆绑在二进制文件中,以便运行二进制文件所需的一切就是文件本身。我将二进制文件转移到另一台 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 代码可移植的最佳方法是什么?

【问题讨论】:

  • 也许问题是您的文件和目标机器的架构不匹配。您可以运行uname -a 和file HelloUnix 进行检查。
  • 这可能是我希望的最没用的错误消息。源机器是什么?目标机器是什么?剩下的动态库是什么(使用ldd)?它们在目标上可用吗?
  • i386 机器无法运行 x86-64 可执行文件。
  • 那么就没有办法交叉编译了吗?
  • 构建一个交叉编译器当然是可能的,但我会尝试先安装一个预构建的 32 位版本的 GHC。看起来它可以更简单。

标签: haskell linker binary executable


【解决方案1】:

如果您的目标是相同的架构,它应该可以毫不费力地工作(只要还分发了必要的数据文件)。

如果您的目标是不同的架构,如您的情况,您需要针对目标平台进行交叉编译;见GHC wiki。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2012-08-14
    • 1970-01-01
    • 2016-07-16
    相关资源
    最近更新 更多