使用-fPIC支持编译ghc

22

我正在尝试在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


你尝试编译哪个版本的 GHC? - fuz
你不需要在命令行上加上 -optc-fpic 或者只使用 -fPIC 吗? - Thomas M. DuBuisson
1
@Thomas -fPIC 只适用于本地后端,这就是为什么明确给出 -fasm 的原因。如果未使用 C 后端,则 -optc 选项无效。 - fuz
你说你有一些进展,但没有提到具体是怎么做的。我也遇到了同样的问题。你能告诉我该怎么做吗? - Kaiko Kaur
@KaikoKaur 抱歉,我从未让它正常工作,现在我主要是一个Windows开发人员,所以我没有深入研究。据我记得,进展是在将 -fPIC 添加到 ghc makefile 并重新编译后,在编译中手动指定 Haskell RTS。 - Phyx
2个回答

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
仅仅这样做是不够的。看起来我在这里发布的命令版本缺少-fPIC,但是已经在命令中了。dllmain.c也使用-fPIC编译。自从我发布这个问题以来,我已经有所进展,现在libFFI是问题所在。有人告诉我build.mk对其编译没有影响,所以我正在尝试修改它的配置文件以支持它,但是到目前为止还没有成功。 - Phyx
编译器现在说什么了?你能发新的命令和错误信息吗? - user1080697
我可以在几天后回家后发布它。 - Phyx
抱歉,我出国了一段时间,现在已经更新了我的进展情况。 - Phyx

0

在Haskell Stack页面上有一个常见问题条目与此主题相关。

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

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

对于Arch Linux,还有一个解决方法建议:

在Arch Linux上,从AUR安装ncurses5-compat-libs软件包可以解决此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接