Haskell 使用-fPIC支持编译ghc

Haskell 使用-fPIC支持编译ghc,haskell,static-libraries,ghc,ffi,fpic,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 =

我正在尝试在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编译 我还告诉阴谋集团用-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退出状态

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

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目录中继续编译,而不清除已编译的文件。它应该跳过它们,然后继续它结束的地方。

Haskell Stack页面上有一个关于这个主题的链接

它基本上说这个问题与环境有关,有时是不确定的

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

对于Arch Linux,还有一个变通建议:

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


您尝试编译哪个版本的GHC?您是否不需要命令行上的
-optc fpic
或者也可能只需要
-fpic
?@Thomas
-fpic
只与本机后端一起工作-这就是为什么
-fasm
被明确给出的原因。如果C-backend未被使用,则
-optc
选项无效。您说您取得了一些进展,但没有提到如何取得进展。我也有同样的问题。你能告诉我该怎么做吗?@Kaikaur抱歉,我从来没有让它工作过,现在我又回到了一个windows开发人员的行列,所以我没有深入研究这个问题。据我记忆所及,在将-fPIC添加到ghc makefile并重新编译之后,必须在编译中手动指定Haskell RTS。不幸的是,仅此一步无法做到这一点。我在这里发布的命令版本似乎缺少-fPIC,但这已经在命令中了。dllmain.c也使用-fPIC编译。自从我发布这个问题以来,我取得了一些进步,现在我已经到了libFFI是问题所在的地步。有人告诉我build.mk对它的编译没有影响,所以我尝试使用它的配置文件来支持它,但到目前为止没有成功。编译器现在说什么?你能发布新的命令和错误消息吗?我可以在几天后回到家后发布。我在国外呆了一段时间,我已经用我目前的进展更新了这个问题。