20

-O3 のようなフラグを指定して GHC バージョン 7.4.2 を使用すると、依然として巨大な実行可能ファイルが作成されます。GHC が静的リンクを行っていることを理解しており、バイナリの依存関係は次のようになります。

    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

これまでのところ、非常によく見えますが、バイナリ内に次の行が表示されます。

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.

実際には、私の関数の名前、他のモジュールで定義された関数などを含む多くのテキスト行があります。問題は、これらのテキストを削除することは可能で、GHC は外部ライブラリから未使用のコードを削除できるかということです。

4

2 に答える 2

2

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

于 2012-11-17T08:59:45.970 に答える
1

gcc バックエンドを使用する場合は、-optc-Osフラグを渡しghcて出力のサイズを最適化できます。おそらく、バイナリを数バイト減らすことができます。しかし、前に提案したように、すべての長所と短所がある動的リンクを使用することもお勧めします。

アップデート:

実行可能ファイルを UPX http://en.wikipedia.org/wiki/UPXまたは gzexe で圧縮して、実行可能ファイルのサイズを縮小します。

于 2012-11-09T08:37:45.597 に答える