haskell - online - herramientas para hacer ingenieria inversa
¿Los binarios compilados ghc requieren GHC o son autocontenidos? (4)
Si un amigo quiere ejecutar mis binarios de Haskell, ¿primero tiene que instalar Haskell, o puede ejecutar el binario inmediatamente?
¿La respuesta es la misma en Mac, Windows y Linux?
GHC compila Haskell para codificar el objeto, con un tiempo de ejecución vinculado. Eso significa que no necesita un compilador Haskell instalado para ejecutar programas Haskell.
El ejecutable generado usará alguna variante de enlace estático y dinámico, para las dependencias de la biblioteca C y Haskell. Todo lo que está vinculado estáticamente no necesita ser instalado en la máquina del usuario. Todo lo que esté dinámicamente vinculado debe estar instalado.
Para ver lo que necesita enviar junto con el ejecutable, en Linux (o Cygwin), use ldd
. Puede forzar la vinculación estática de casi todo pasándolo: -static
a GHC.
Si es conveniente vincular estáticamente algunas bibliotecas C con su ejecutable Haskell, en Linux puede usar --whole-archive
con el enlazador GNU; por ejemplo:
ghc --make HelloZ.hs /
-optl-Wl,--whole-archive /
-optl/usr/lib/x86_64-linux-gnu/libffi.a /
-optl/usr/lib/x86_64-linux-gnu/libz.a /
-optl-Wl,--no-whole-archive
Si bien son bastante comunes, libz
y libz
no son omnipresentes ( libffi
es uno que a menudo veo en mis binarios Haskell).
Este enfoque me fue sugerido por primera vez recientemente, en haskell-cafe .
Una instalación de GHC no es necesaria para la mayoría de los binarios. Algunos (por ejemplo, xmonad) usan Haskell como su lenguaje de configuración; en esos casos, necesitará un compilador.
También hay una cuestión de vinculación estática vs. dinámica. Creo que, por el momento, el valor predeterminado sigue siendo el enlace estático, en cuyo caso debería ser bastante fácil migrar un binario de una máquina a otra (solo necesita tener la misma arquitectura y sistema operativo).
GHC produce binarios independientes que no requieren que GHC se instale, sin embargo, se vinculan con algunas bibliotecas dinámicas, sobre todo libgmp
. Las bibliotecas restantes se encuentran generalmente fuera de la caja en la mayoría de los sistemas Linux. Creo que la situación es similar en Windows.
Puede verificar de qué bibliotecas dinámicas depende el uso de ldd
en Linux. Esto es lo que obtengo en Ubuntu Natty para un simple programa Hello World:
$ echo ''main = putStrLn "Hello World"'' > Hello.hs
$ ghc --make Hello.hs
[1 of 1] Compiling Main ( Hello.hs, Hello.o )
Linking Hello ...
$ ldd Hello
linux-vdso.so.1 => (0x00007fffe45ff000)
libgmp.so.3 => /usr/lib/libgmp.so.3 (0x00007f8874cf9000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8874a74000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f887486b000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f8874667000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f88742d3000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f88740b4000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8874f7a000)