2012-09-09 20 views
19

Mit GHC-Version 7.4.2 mit Flags wie -O3, ich bekomme immer noch große ausführbare Datei produziert. Ich verstehe, dass GHC statische Linken der Fall ist, und Abhängigkeiten der binären wie folgt aussieht:Reduzieren Größe der ausführbaren Datei von 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 

so weit es ziemlich gut aussieht, aber in der binären ich die Zeilen sehen:

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. 

und eigentlich ein Viele Textzeilen, einschließlich Namen meiner Funktionen, Funktionen, die in anderen Modulen definiert sind usw. Die Frage ist - ist es möglich, diese Texte zu entfernen, und kann GHC ungenutzten Code aus externen Bibliotheken entfernen?

+4

sollten Sie sich die Frage ansehen: http: //stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-huge-binary? Lq = 1 - Ich habe Ihre markiert Frage als ein mögliches Duplikat davon. – epsilonhalbe

+0

es ist nicht wirklich wahr - ich habe die Datei entfernt und keinen Unterschied mit der nicht-abgestreiften Version bekommen. Also bin ich immer noch auf der Suche nach der Möglichkeit, die Größe der Binärdatei zu reduzieren. – jdevelop

+1

und haben Sie dynamische Verknüpfung versucht - wie Sie in @ Donstewarts Antwort sehen, machte dies die binäre Weise kompakter, als nur die Symbole zu entfernen. Aber ich bin weit von einem Experten entfernt. – epsilonhalbe

Antwort

1

Wenn Sie das gcc-Backend verwenden, können Sie das Flag -optc-Os an ghc übergeben, um die Ausgabe für die Größe zu optimieren. Vielleicht können Sie Ihre Binärdatei um einige Bytes reduzieren. Aber ich würde auch vorschlagen, dynamische Verknüpfung wie vorgeschlagen, mit all seinen Vor- und Nachteilen zu verwenden.

UPDATE:

Komprimieren Sie Ihre ausführbare Datei mit UPX http://en.wikipedia.org/wiki/UPX oder gzexe die Größe der ausführbaren Datei zu reduzieren.

+0

Dynamic Linking ist wie Verschieben von Größe von einer Datei in eine andere. Was ist, wenn ich meine Anwendung an Endbenutzer versenden möchte? Ich werde alle diese DLLs auch verpacken müssen, so statische Verknüpfung funktioniert super.Allerdings macht mich die Größe der ausführbaren Datei immer noch traurig. – jdevelop

+0

Dynamic Linking zahlt sich aus, wenn Sie davon ausgehen können, dass Ihr Kunde die DLL bereits installiert hat, andernfalls liefern Sie die DLL mit Ihrer Anwendung und verknüpfen Ihre eigene Version (Windows-Ansatz) mit der gleichen räumlichen Implikation wie die statische Verknüpfung. Was ist genau dein Anliegen? Speichernutzung bei laufender Anwendung oder Festplattenplatz des Ergebnisses? Wenn es Letzteres ist, können Sie Ihre ausführbare Datei mit 'UPX' (http://en.wikipedia.org/wiki/UPX) oder' gzexe' komprimieren. –

+0

eigentlich mag ich nicht die Tatsache, dass die ausführbare Datei eine Menge seltsamer Textdaten enthält. – jdevelop

2

LLVM kann mehr zur Linkzeit optimieren als die meisten anderen Compiler. Vielleicht hat GHC ein LLVM-Backend und Sie können einige/alle Ihre Abhängigkeiten mit -O4 neu kompilieren und verknüpfen.

Verwandte Themen