使用 -fPIC 支持编译 ghc

Posted

技术标签:

【中文标题】使用 -fPIC 支持编译 ghc【英文标题】:Compiling ghc with -fPIC support 【发布时间】: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。 【参考方案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 目录中继续编译,而不清理已经编译的文件。它应该跳过它们并从它结束的地方继续。

【讨论】:

不幸的是,仅此而已。我在这里发布的命令版本似乎缺少-fPIC,但这已经在命令中。 dllmain.c 也使用 -fPIC 编译。自从我发布这个问题以来,我已经取得了一些进展,现在我已经到了 libFFI 是问题所在的地步。我被告知 build.mk 对它的编译没有影响,所以我正在尝试使用它的配置文件来支持它,但到目前为止还没有运气。 编译器现在说什么?你能发布新的命令和错误信息吗? 我过几天回家就可以发了 抱歉,出国一段时间了,我已经根据我的进度更新了问题。【参考方案2】:

在 Haskell 堆栈页面上有关于此主题的 FAQ entry。

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

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

还有一个针对 Arch Linux 的解决建议:

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

【讨论】:

以上是关于使用 -fPIC 支持编译 ghc的主要内容,如果未能解决你的问题,请参考以下文章

我如何分析GHC用于使用Stack编译项目的内存量?

如何仅使用“-auto”成本中心编译某些模块?

haskell 代码可以在 leksah 上编译,但不能在 ghc 上编译

Haskell Stack 的默认 GHC 标志

限制 GHC 的内存使用

为啥 Haskell ghc 不工作,但 runghc 工作良好?