haskell - run - Reducir el tamaño del ejecutable producido por GHC.
haskell tutorial (2)
Al utilizar la versión 7.4.2 de GHC con marcas como -O3, todavía se produce un enorme ejecutable. Entiendo que GHC realiza enlaces estáticos, y las dependencias del binario se parecen a:
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
hasta ahora se ve bastante bien, sin embargo dentro del binario puedo ver las líneas:
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.
y, en realidad, muchas líneas de texto, incluidos los nombres de mis funciones, las funciones definidas en otros módulos, etc. La pregunta es: ¿es posible eliminar esos textos y GHC puede eliminar el código no utilizado de las bibliotecas externas?
LLVM puede hacer más optimización en el momento del enlace que la mayoría de los otros compiladores. Tal vez GHC tiene un backend LLVM y puede recompilar y vincular algunas / todas sus dependencias con -O4.
Si usa el backend gcc, puede pasar el -optc-Os
a ghc
para optimizar la salida para el tamaño. Quizás puedas reducir tu binario en algunos bytes. Pero también sugeriría usar enlaces dinámicos como se sugirió antes, con todos sus pros y sus contras.
ACTUALIZAR:
Comprima su ejecutable con UPX http://en.wikipedia.org/wiki/UPX o gzexe para reducir el tamaño del ejecutable.