【问题标题】:Reduce size of executable produced by GHC减少 GHC 生成的可执行文件的大小
【发布时间】:2012-09-02 11:37:57
【问题描述】:

使用带有 -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 是否可以从外部库中删除未使用的代码?

【问题讨论】:

  • 您应该看看问题:stackoverflow.com/questions/6115459/… - 我已将您的问题标记为可能重复。
  • 这不是真的 - 我剥离了文件并且与未剥离的版本没有任何区别。所以我仍在寻找减少二进制文件大小的方法。
  • 您是否尝试过动态链接 - 正如您在@donstewart 的回答中看到的那样,这使得二进制方式更加紧凑,而不仅仅是剥离符号。但我远非专家。
  • 我相信(从 7.4.1 开始)-O3 也在做同样的事情 -O2
  • 实际上有票 -O3 hackage.haskell.org/trac/ghc/ticket/1371 虽然它似乎不是很活跃

标签: haskell executable ghc


【解决方案1】:

LLVM 可以在链接时进行比大多数其他编译器更多的优化。也许 GHC 有一个 LLVM 后端,您可以使用 -O4 重新编译和链接您的部分/全部依赖项。

【讨论】:

    【解决方案2】:

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

    更新:

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

    【讨论】:

    • 使用动态链接就像将大小从一个文件移动到另一个文件。如果我想将我的应用程序发送给最终用户怎么办?我还需要打包所有这些 DLL,所以静态链接效果很好。但是可执行文件的大小仍然让我感到难过。
    • 如果您可以假设您的客户已经安装了 dll,则动态链接是有回报的,否则您将 dll 与您的应用程序一起交付并链接您自己的版本(windows 方法),其空间含义与静态链接。你究竟关心什么?应用程序运行时的内存使用情况或交付物的磁盘空间?如果是后者,您可以使用UPX (en.wikipedia.org/wiki/UPX) 或gzexe 压缩您的可执行文件。
    • 其实我不喜欢可执行文件里面有很多奇怪的文本数据。
    • 几乎每个exe里面都有文本数据,用UPX打包,它会缩小到原始大小的25%,只包含这个ASCII字符串:$Info: This file is packed with the UPX executable packer http://upx.sf.net $ $Id: UPX 3.08 Copyright (C) 1996-2011 the UPX Team. All Rights Reserved. $
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 2010-09-17
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多