Oye, Estoy aprendiendo Haskell y estoy interesado en usarlo para hacer bibliotecas estáticas para usar en Python y probablemente C. Después de buscar en Google descubrí cómo hacer que GHC produzca un objeto compartido, pero depende dinámicamente en las bibliotecas de GHC. El ELF resultante de la compilación en GHC depende dinámicamente y solo en C libs y tiene un tamaño algo menor que MB, se ha vinculado estáticamente con las librerías de GHC. ¿Cómo y si se puede lograr esto para los objetos compartidos?¿Cómo compilar Haskell a una biblioteca estática?
Ejemplo del estado actual:
$ ghc --make -dynamic -shared -fPIC foo.hs -o libfoo.so
$ ldd libfoo.so
linux-vdso.so.1 => (0x00007fff125ff000)
libHSbase-4.2.0.2-ghc6.12.3.so => /usr/lib/ghc-6.12.3/base-4.2.0.2/libHSbase-4.2.0.2-ghc6.12.3.so (0x00007f7d5fcbe000)
libHSinteger-gmp-0.2.0.1-ghc6.12.3.so => /usr/lib/ghc-6.12.3/integer-gmp-0.2.0.1/libHSinteger-gmp-0.2.0.1-ghc6.12.3.so (0x00007f7d5faac000)
libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f7d5f816000)
libHSghc-prim-0.2.0.0-ghc6.12.3.so => /usr/lib/ghc-6.12.3/ghc-prim-0.2.0.0/libHSghc-prim-0.2.0.0-ghc6.12.3.so (0x00007f7d5f591000)
libHSffi-ghc6.12.3.so => /usr/lib/ghc-6.12.3/libHSffi-ghc6.12.3.so (0x00007f7d5f383000)
libc.so.6 => /lib/libc.so.6 (0x00007f7d5f022000)
/lib/ld-linux-x86-64.so.2 (0x00007f7d60661000)
$ ghc foo.hs
$ ldd foo
linux-vdso.so.1 => (0x00007fff2d3ff000)
libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f50014ec000)
libm.so.6 => /lib/libm.so.6 (0x00007f5001269000)
librt.so.1 => /lib/librt.so.1 (0x00007f5001061000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f5000e5d000)
libc.so.6 => /lib/libc.so.6 (0x00007f5000afc000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f50008df000)
/lib/ld-linux-x86-64.so.2 (0x00007f5001759000)
Si intento compilar con (y sin '-dynamic'):
$ ghc --make -shared -fPIC foo.hs -o libfoo.so
Linking libfoo.so ...
/usr/bin/ld: foo.o: relocation R_X86_64_32S against `stg_CAF_BLACKHOLE_info' can not be used when making a shared object; recompile with -fPIC
foo.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
Cuando google he encontrado algo acerca de toda esta cuestión - que puede provenir del hecho de que GHC se compila de una manera específica (dinámica/estática?) y por lo tanto no es posible establecer enlaces estáticos. Si esto es cierto, ¿cómo es posible que el binario ELF esté vinculado estáticamente?
De todos modos, espero que alguien pueda arrojar algo de luz sobre esto ya que una gran cantidad de google me dejó con más preguntas de las que comencé.
Muchísimas gracias.
qué sistema utiliza? Parece que es x86_64 Linux. La versión de GHC también es importante, ya que podría ser un error que se haya solucionado desde entonces. La vinculación dinámica ha tenido algunos errores en el pasado y podría ser uno de ellos. – Tener
@Tener | Compilador Haskell de Glasgow, Versión 6.12.3, para Haskell 98, etapa 2 arrancada por GHC versión 6.12.1 | Tal vez debería probar GHC 7 para ver si tiene este problema cubierto. – kuratkull
@Tener.Llegué a la instalación de GHC7, y todavía no está funcionando, aunque me está dando un error un poco diferente. = >>> '-> ghc --make -shared -fPIC bwt.hs -o libbwt.so [1 of 1] Compilación principal (bwt.hs, bwt.o) Enlazando libbwt.so .. /usr/bin/ld: /usr/lib/ghc-7.0.2/base-4.3.1.0/libHSbase-4.3.1.0.a(Base__90.o): la reubicación R_X86_64_32S contra "stg_upd_frame_info" no se puede usar cuando hacer un objeto compartido; recompile con -fPIC /usr/lib/ghc-7.0.2/base-4.3.1.0/libHSbase-4.3.1.0.a: no se pudieron leer símbolos: valor incorrecto collect2: ld devuelto 1 estado de salida ' – kuratkull