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.