簡體   English   中英

使用-fPIC支持編譯ghc

[英]Compiling ghc with -fPIC support

我正在嘗試在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,我已經取得了一些進展。 但是現在我正處於我沒有使用-fPIC編譯libffi的時候。 我為它編輯了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頁面上有關於此主題的FAQ條目

它基本上說問題是與環境有關的,有時是非確定性的。

該問題可能與在某些情況下使用強化標志有關,特別是與生成與位置無關的可執行文件(PIE)有關的標志。

還有一個關於Arch Linux的建議:

在Arch Linux上,從AUR安裝ncurses5-compat-libs軟件包解決了這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM