22

Fedoraで-fPICをサポートするGHCをインストールしようとしています。バイナリのtarballにはこれがないように思われるので、ソース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つの終了ステータスを返しました

4

2 に答える 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 ディレクトリ内からコンパイルを続行します。それらをスキップして、終了したところから続行する必要があります。

于 2011-12-10T02:05:04.620 に答える