2012-09-09 17 views
19

Utilizzando GHC versione 7.4.2 con flag come -O3, ottengo ancora un enorme eseguibile prodotto. Capisco che GHC fa il collegamento statico, e le dipendenze del binario sembra che:Ridurre le dimensioni del file eseguibile prodotto da 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 

finora sembra abbastanza buono, ma all'interno del binario posso vedere le linee:

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. 

e in realtà un molte linee di testo, compresi i nomi delle mie funzioni, funzioni definite in altri moduli e così via. La domanda è: è possibile rimuovere quei testi e GHC può eliminare il codice inutilizzato dalle librerie esterne?

+4

dovresti dare un'occhiata alla domanda: http: //stackoverflow.com/questions/6115459/small-haskell-program-compiled-with-ghc-into-huge-binary? Lq = 1 - Ho contrassegnato il tuo domanda come un possibile duplicato di esso. – epsilonhalbe

+0

non è proprio vero: ho spogliato il file e non ho avuto alcuna differenza con la versione nonstata. Quindi sto ancora cercando il modo per ridurre le dimensioni del binario. – jdevelop

+1

e hai provato il collegamento dinamico: come vedi nella risposta di @ donstewart, questo ha reso il modo binario più compatto, piuttosto che rimuovere i simboli. Ma io sono lontano da un esperto. – epsilonhalbe

risposta

1

Se si utilizza il backend di gcc, è possibile passare il flag -optc-Os a ghc per ottimizzare l'output per la dimensione. Forse puoi ridurre il tuo binario di alcuni byte. Ma vorrei anche suggerire di utilizzare il collegamento dinamico come suggerito prima, con tutti i suoi pro e contro.

UPDATE:

comprimere il file eseguibile con UPX http://en.wikipedia.org/wiki/UPX o gzexe per ridurre le dimensioni del file eseguibile.

+0

utilizzando il collegamento dinamico è come spostare le dimensioni da un file a un altro.Qualora se voglio spedire la mia applicazione agli utenti finali? Avrò bisogno di pacchettizzare anche tutte quelle DLL, quindi il collegamento statico funziona alla grande.Tuttavia, la dimensione dell'eseguibile mi rende ancora triste. – jdevelop

+0

Il collegamento dinamico paga, se si può supporre che il cliente abbia già installato la dll, altrimenti si consegna la DLL con l'applicazione e si collega la propria versione (l'approccio di Windows) che ha le stesse implicazioni spaziali del collegamento statico. Qual è esattamente la tua preoccupazione? Utilizzo della memoria quando l'applicazione è in esecuzione o lo spazio su disco del deliverable? Se è quest'ultimo, puoi comprimere il tuo eseguibile con 'UPX' (http://en.wikipedia.org/wiki/UPX) o' gzexe'. –

+0

in realtà non mi piace il fatto che l'eseguibile abbia un sacco di strani dati testuali al suo interno. – jdevelop

2

LLVM può fare più ottimizzazione al momento del collegamento rispetto alla maggior parte degli altri compilatori. Forse GHC ha un backend LLVM e puoi ricompilare e collegare alcune/tutte le tue dipendenze con -O4.

Problemi correlati