减少GHC生成的可执行文件的大小
使用带有-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可以从外部库中删除未使用的代码?
与大多数其他编译器相比,LLVM可以在链接时进行更多优化。 也许GHC有一个LLVM后端,你可以用-O4重新编译和链接你的一些/所有的依赖关系。
如果您使用gcc后端,则可以将-optc-Os
标志传递给ghc
以优化输出的大小。 也许你可以减少一些字节的二进制文件。 但是我也建议使用前面建议的动态链接,它有所有优点和缺点。
更新:
使用UPX http://en.wikipedia.org/wiki/UPX或gzexe压缩您的可执行文件以减小可执行文件的大小。
链接地址: http://www.djcxy.com/p/33319.html