Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 减少GHC生成的可执行文件的大小_Haskell_Executable_Ghc - Fatal编程技术网

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

Haskell 减少GHC生成的可执行文件的大小,haskell,executable,ghc,Haskell,Executable,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.

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

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

更新:


使用UPX或gzexe压缩可执行文件,以减小可执行文件的大小。

LLVM在链接时比大多数其他编译器能做更多的优化。也许GHC有一个LLVM后端,您可以重新编译并将部分/所有依赖项与-O4链接。

您应该看看问题:-我已将您的问题标记为可能的重复问题。这不是真的-我删除了文件,与未删除的版本没有任何区别。所以我仍然在寻找减少二进制文件大小的方法。你是否尝试过动态链接——正如你在@donstewart的回答中看到的那样,这使二进制文件的方式更加紧凑,而不仅仅是剥离符号。但我远不是一个专家。我相信(从7.4.1开始)-O3也在做同样的事情-O2实际上-O3是有票的,它似乎不是很活跃,因为使用动态链接就像将大小从一个文件移动到另一个文件。如果我想将我的应用程序发送给最终用户怎么办?我还需要打包所有这些DLL,所以静态链接非常有效。然而,可执行文件的大小仍然让我感到悲哀。如果您可以假设您的客户已经安装了dll,那么动态链接是值得的,否则您将dll与应用程序一起交付,并链接您自己的版本(windows方法),这与静态链接具有相同的空间含义。你到底担心什么?应用程序运行时的内存使用情况或可交付成果的磁盘空间?如果是后者,你可以用
UPX
()或
gzexe
压缩你的可执行文件。实际上我不喜欢可执行文件里面有很多奇怪的文本数据。几乎每个可执行文件里面都有文本数据,使用UPX打包,它将减小到原始大小的25%,并且只包含以下ASCII字符串:
$Info:此文件使用UPX可执行打包器打包http://upx.sf.net $$Id:UPX 3.08版权所有(C)1996-2011 UPX团队。版权所有$