haskell static-libraries ghc ffi fpic

haskell - Compilando ghc con soporte-fPIC



static-libraries ffi (2)

Estoy tratando de instalar GHC con soporte -fPIC en Fedora. He agarrado un tarball de origen ya que parece que ningún binario tiene esto.

En Build.mk he cambiado el tipo de compilación rápida a

ifeq "$(BuildFlavour)" "quick" SRC_HC_OPTS = -H64m -O0 -fasm -fPIC GhcStage1HcOpts = -O -fasm -fPIC GhcStage2HcOpts = -O0 -fasm -fPIC GhcLibHcOpts = -O -fasm -fPIC SplitObjs = NO HADDOCK_DOCS = NO BUILD_DOCBOOK_HTML = NO BUILD_DOCBOOK_PS = NO BUILD_DOCBOOK_PDF = NO endif

desafortunadamente, al compilar todavía me sale el error de ld

ghc -fglasgow-exts --make -shared -oHs2lib.a /tmp/Hs2lib924498/Hs2lib.hs dllmain.o -static -fno-warn-deprecated-flags -O2 -package ghc -package Hs2lib -i/home/phyx/Documents/Haskell/Hs2lib -optl-Wl,-s -funfolding-use-threshold=16 -optc-O3 -optc-ffast-math Linking a.out ... /usr/bin/ld: /tmp/Hs2lib924498/Hs2lib.o: relocation R_X86_64_32 against `ghczmprim_GHCziUnit_Z0T_closure'' can not be used when making a shared object; recompile with -fPIC /tmp/Hs2lib924498/Hs2lib.o: could not read symbols: Bad value

Así que parece que GHC-prim todavía no está compilado con -FPIC. También le he dicho a Cabal que compile cualquier paquete con -fPIC y compartido.

¿Alguien tiene alguna idea?

EDIT: Gracias a dcouts he podido hacer algunos progresos. Pero ahora estoy en el punto en el que creo que libffi no está compilado con -fPIC. He editado el archivo makefile (.in) para él pero hasta ahora, no hay suerte.

El nuevo comando es:

ghc -fPIC -shared dllmain.o Hs2lib.o /usr/local/lib/ghc-7.0.3/libHSrts.a -o Hs2lib.so

donde dllmain.c y Hs2lib.hs se han compilado usando -fPIC. El error que recibo es:

/usr/bin/ld: /usr/local/lib/ghc-7.0.3/libHSffi.a(closures.o): relocation R_X86_64_32 against `.rodata'' can not be used when making a shared object; recompile with -fPIC /usr/local/lib/ghc-7.0.3/libHSffi.a: could not read symbols: Bad value

collect2: ld devolvió 1 estado de salida


Después de ver este error, haga lo siguiente:

cd /tmp/Hs2lib924498/ ghc -fglasgow-exts --make -shared -oHs2lib.a /tmp/Hs2lib924498/Hs2lib.hs dllmain.o -static -fno-warn-deprecated-flags -fPIC -O2 -package ghc -package Hs2lib -i/home/phyx/Documents/Haskell/Hs2lib -optl-Wl,-s -funfolding-use-threshold=16 -optc-O3 -optc-ffast-math

Tenga en cuenta que agregué -fPIC al comando ghc fallido.

Una vez que el comando tenga éxito, continúe la compilación desde el directorio tmp sin limpiar los archivos ya compilados. Debe omitirlos y continuar donde terminó.


Hay una entrada de preguntas frecuentes sobre este tema en la página Haskell Stack.

Básicamente dice que el problema está relacionado con el medio ambiente y, a veces, no es determinista.

El problema puede estar relacionado con el uso de indicadores de endurecimiento en algunos casos, específicamente aquellos relacionados con la producción de ejecutables independientes de posición (PIE).

También hay una sugerencia de trabajo para Arch Linux:

En Arch Linux, la instalación del paquete ncurses5-compat-libs de AUR resuelve este problema.