减少GHC生成的可执行文件的大小

jde*_*lop 19 executable haskell ghc

使用GHC版本7.4.2和-O3之类的标志,我仍然可以获得巨大的可执行文件.我理解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
Run Code Online (Sandbox Code Playgroud)

到目前为止它看起来相当不错,但是在二进制文件中我可以看到这些行:

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.
Run Code Online (Sandbox Code Playgroud)

实际上有很多文本行,包括我的函数名,其他模块中定义的函数等等.问题是 - 是否可以删除这些文本,并且GHC可以从外部库中删除未使用的代码吗?

Fal*_*ger 2

如果您使用 gcc 后端,您可以将-optc-Os标志传递给ghc来优化输出的大小。也许您可以将二进制文件减少一些字节。但我也建议使用之前建议的动态链接,尽管它有优点也有缺点。

更新:

使用 UPX http://en.wikipedia.org/wiki/UPX或 gzexe 压缩可执行文件以减小可执行文件的大小。

  • 几乎每个 exe 里面都有文本数据,用 UPX 打包它,它会减少到原始大小的 25%,并且只包含这个 ASCII 字符串:`$Info:这个文件是用 UPX 可执行加壳器打包的 http://upx.sf .net $ $Id:UPX 3.08 版权所有 (C) 1996-2011 UPX 团队。版权所有。$` (5认同)