2013-05-14 13 views
6

This投稿は私が達成しようとしていることに関して本当に有益です。 私は単純なHelloUnixバイナリを作成しました。 HelloUnixバイナリを作成しghcコンパイルされたバイナリを他のマシンで実行するには?

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

すべてがファイルそのものだったバイナリを実行するために必要とされるように-staticフラグすべてがバイナリの内側にまでバンドルされていると、私は期待していました。バイナリを別のUNIXマシンに転送し、そのファイルがchmod経由で正しいアクセス権を持っていることを確認しました。バイナリを実行するが、このエラーが表示されました

bash: ./HelloUnix: cannot execute binary file 

これをデバッグする方法についてのアイデアはありますか?

EDIT: 私は現在、分散システムを開発しようとしています。したがって、ターゲットマシンにバイナリを配布することを望んでいました。私は実行している魔法のマシンに関係なくバイナリを実行する方法が必要です。それはとにかくターゲットです。

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'を実行して確認することができます。 –

+3

これはおそらく私が望む最も有用でないエラーメッセージです。ソースマシンは何ですか?ターゲットマシンとは何ですか?残りの動的ライブラリは何ですか( 'ldd'を使います)?それらはターゲット上で利用可能ですか? –

+1

'i386'マシンは' x86-64'実行ファイルを実行しません。 –

答えて

5

同じアーキテクチャをターゲットにしている場合は、必要なデータファイルも配布されている限り、問題なく動作します。

異なるアーキテクチャをターゲットにしている場合は、ターゲットプラットフォームでクロスコンパイルする必要があります。 GHC wikiを参照してください。

関連する問題