2011-10-04 7 views
22

Estoy tratando de instalar GHC con soporte de -fPIC en Fedora. He cogido un tarball fuente ya que parece que no tiene uno binario.Compilación de ghc con soporte de -fPIC

En Build.mk He cambiado el tipo de construcció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 

por desgracia, al compilar sigo teniendo el error 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 ISN 'compilado con -FPIC También le he dicho a cabal que construya cualquier paquete con -fPIC y lo comparta.

¿Alguien tiene alguna idea?

EDIT: Gracias a dcouts, he podido hacer algunos progresos. Pero ahora estoy en el punto donde creo que libffi no está compilado con -fPIC. He editado el archivo MAKE (.in) pero hasta ahora, no tuve 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 ambos se han compilado utilizando -fPIC. El error que consigo 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ó el código de salida 1

+0

¿qué versión de GHC intenta compilar? – fuz

+0

ghc versión 7.0.3 – Phyx

+0

¿No necesita '-optc-fpic' o quizás' -fPIC' en la línea de comandos también? –

Respuesta

1

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 

Nota añadí -fPIC a la fallida comando ghc.

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

+1

Eso solo desafortunadamente no lo hará. Parece que la versión del comando que publiqué aquí carecía de -fPIC, pero eso ya está en el comando. dllmain.c también se compila con -fPIC. Avancé un poco desde que publiqué esta pregunta, y ahora llegué al punto en que el problema es libFFI. Me han dicho que build.mk no tiene ninguna influencia en su compilación, por lo que intento su archivo de configuración para soportarlo, pero hasta ahora no tuve suerte. – Phyx

+0

¿Qué dice el compilador ahora? ¿Puedes publicar el nuevo comando y mensaje de error? –

+0

Puedo publicarlo una vez que vuelva a casa en unos días – Phyx

0

Hay un FAQ entry sobre este tema en la página de Haskell Stack.

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

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

También hay un trabajo en torno sugerencia para Arch Linux:

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