我正在尝试在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 和 shared 来构建任何软件包。
有人有什么想法吗?
编辑: 感谢 dcouts 的帮助,我已经取得了一些进展。但现在我认为 libffi 没有使用 -fPIC 编译。我已经编辑了它的 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
-optc-fpic
或者只使用-fPIC
吗? - Thomas M. DuBuisson-fPIC
只适用于本地后端,这就是为什么明确给出-fasm
的原因。如果未使用 C 后端,则-optc
选项无效。 - fuz