【发布时间】:2011-11-30 22:54:43
【问题描述】:
我正在尝试在 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,我才能取得一些进展。但是现在我正处于我认为 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 个退出状态
【问题讨论】:
-
您尝试编译哪个版本的 GHC?
-
您在命令行上不需要
-optc-fpic还是只需要-fPIC? -
@Thomas
-fPIC仅适用于本机后端 - 这就是明确给出-fasm的原因。如果 C 后端未在使用中,-optc选项无效。 -
你说你取得了一些进展,但没有提到如何。我有同样的问题。你能告诉我该怎么做吗?
-
@KaikoKaur 对不起,我从来没有让这个工作,我现在主要是作为一个 Windows 开发人员,所以我并没有真正深入研究这个。据我记得,在将 -fPIC 添加到 ghc makefile 并重新编译之后,必须在编译中手动指定 Haskell RTS。
标签: haskell static-libraries ghc ffi fpic