使用-fPIC支持编译ghc

时间:2011-10-04 19:02:59

标签: haskell static-libraries ghc ffi fpic

我正在尝试在Fedora中安装带有-fPIC支持的GHC。 我已经抓住了一个源tarball,因为看起来没有二进制的这个。

在Build.mk中,我已将快速构建类型更改为

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

不幸的是,在编译时我仍然得到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

所以似乎GHC-prim仍然没有用-FPIC编译 我还告诉cabal使用-fPIC构建任何包并共享。

有人有什么想法吗?

编辑: 感谢dcouts,我已经取得了一些进展。但是现在我正处于我没有使用-fPIC编译libffi的时候。我为它编辑了makefile(.in),但到目前为止,没有运气。

新命令是:

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

其中dllmain.c和Hs2lib.hs都使用-fPIC编译。 我得到的错误是:

/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返回1退出状态

2 个答案:

答案 0 :(得分:1)

看到此错误后,请执行以下操作:

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

注意我在失败的ghc命令中添加了-fPIC。

命令成功后,从tmp目录中继续编译,而不清除已编译的文件。它应该跳过它们并在它结束的地方继续。

答案 1 :(得分:0)

在Haskell Stack页面上有关于此主题的FAQ entry

它基本上说问题与环境有关,有时也是非确定性的。

  

该问题可能与某些情况下使用强化标志有关,特别是与生成与位置无关的可执行文件(PIE)相关的标志。

还有一个关于Arch Linux的建议:

  

在Arch Linux上,从AUR安装ncurses5-compat-libs软件包解决了这个问题。