2012-09-09 8 views
19

-O3のようなフラグを使用してGHCバージョン7.4.2を使用すると、まだ大きな実行可能ファイルが生成されます。私は、GHCは静的リンクをしていることを理解し、バイナリの依存関係は次のようになります。GHCによって生成された実行可能ファイルのサイズを小さくする

GHCi runtime linker: fatal error: I found a duplicate definition for symbol 
* Specifying the same object file twice on the GHCi command line 

    ....BlockedIndefinitelyOnMVar.......BlockedIndefinitelyOnSTM........AsyncException..base....GHC.IO.FD.......FD......GHC.IO.FD.setSize. 

と実際:

linux-vdso.so.1 (0x00007fff49bff000) 
    libpcre.so.1 => /usr/lib/libpcre.so.1 (0x00007fe658d6c000) 
    librt.so.1 => /usr/lib/librt.so.1 (0x00007fe658b64000) 
    libutil.so.1 => /usr/lib/libutil.so.1 (0x00007fe658961000) 
    libdl.so.2 => /usr/lib/libdl.so.2 (0x00007fe65875d000) 
    libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007fe658541000) 
    libcurl.so.4 => /usr/lib/libcurl.so.4 (0x00007fe6582e3000) 
    libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007fe658074000) 
    libm.so.6 => /usr/lib/libm.so.6 (0x00007fe657d7a000) 
    libgcc_s.so.1 => /usr/lib/libgcc_s.so.1 (0x00007fe657b65000) 
    libc.so.6 => /usr/lib/libc.so.6 (0x00007fe6577be000) 
    /lib/ld-linux-x86-64.so.2 (0x00007fe658fca000) 
    libssh2.so.1 => /usr/lib/libssh2.so.1 (0x00007fe657595000) 
    libssl.so.1.0.0 => /usr/lib/libssl.so.1.0.0 (0x00007fe65732b000) 
    libcrypto.so.1.0.0 => /usr/lib/libcrypto.so.1.0.0 (0x00007fe656f22000) 
    libz.so.1 => /usr/lib/libz.so.1 (0x00007fe656d0c000 

はこれまでのところ、それは私がラインを見ることができますが、バイナリの内側に、かなりよさそうです私の関数の名前、他のモジュールで定義された関数などのテキスト行がたくさんあります。問題は、それらのテキストを削除することが可能であり、GHCは外部ライブラリから未使用のコードを削除できるかどうかです。

+4

http://stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-huge-binary?lq = 1 - 私はあなたにフラグを立てましたそれの可能な複製としての質問。 – epsilonhalbe

+0

それは実際には真実ではありません - 私はファイルを取り除き、剥ぎ取られていないバージョンとの違いはありませんでした。だから私はまだバイナリのサイズを減らす方法を探しています。 – jdevelop

+1

あなたはダイナミックリンクを試しましたか?@ donstewartの答えに見られるように、これはシンボルを取り除くだけでなく、バ​​イナリ方法をよりコンパクトにしました。しかし、私は専門家からは遠いです。 – epsilonhalbe

答えて

1

gccバックエンドを使用する場合、-optc-Osフラグをghcに渡して、サイズの出力を最適化することができます。バイナリをいくらか減らすことができます。 しかし私はまた、前に示唆したようにダイナミックリンクを使用することを提案します。すべての点で賛否両論です。

UPDATE:

実行ファイルのサイズを小さくするためにUPX http://en.wikipedia.org/wiki/UPXまたはgzexeを使用して実行可能ファイルを圧縮します。

+0

ダイナミックリンクを使用することは、あるファイルから別のファイルにサイズを移動するようなものです。しかし実行可能ファイルのサイズはまだ私を悲しいものにしています。 – jdevelop

+0

ダイナミックリンクは、顧客にdllが既にインストールされていると仮定すると、あなたのアプリケーションでdllを配信し、静的リンクと同じ意味を持つ独自のバージョン(ウィンドウアプローチ)をリンクします。あなたの懸念事項は何ですか?アプリケーションが実行されているときのメモリ使用量または配信可能なディスク容量後者の場合、実行ファイルを 'UPX'(http://en.wikipedia.org/wiki/UPX)または' gzexe'で圧縮することができます。 –

+0

実際、実行可能ファイルには奇妙なテキストのデータがたくさんあるというのは嫌です。 – jdevelop

2

LLVMは、他のほとんどのコンパイラよりもリンク時に多くの最適化を行うことができます。たぶんGHCにはLLVMバックエンドがあり、依存関係の一部またはすべてを-O4で再コンパイルしてリンクすることができます。

関連する問題