嘿, 我正在學習Haskell,我有興趣使用它來製作靜態庫,以便在Python和C中使用。經過一些Google搜索後,我發現如何讓GHC輸出共享對象,但它動態地依賴於在GHC的圖書館。 在GHC中編譯生成的ELF只能動態地依賴於C庫,並且它的大小略低於MB - 它已經與GHC的libs靜態鏈接。如何以及如果這可以實現共享對象?當前狀態的如何將Haskell編譯爲靜態庫?
例子:
$ ghc --make -dynamic -shared -fPIC foo.hs -o libfoo.so
$ ldd libfoo.so
linux-vdso.so.1 => (0x00007fff125ff000)
libHSbase-4.2.0.2-ghc6.12.3.so => /usr/lib/ghc-6.12.3/base-4.2.0.2/libHSbase-4.2.0.2-ghc6.12.3.so (0x00007f7d5fcbe000)
libHSinteger-gmp-0.2.0.1-ghc6.12.3.so => /usr/lib/ghc-6.12.3/integer-gmp-0.2.0.1/libHSinteger-gmp-0.2.0.1-ghc6.12.3.so (0x00007f7d5faac000)
libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f7d5f816000)
libHSghc-prim-0.2.0.0-ghc6.12.3.so => /usr/lib/ghc-6.12.3/ghc-prim-0.2.0.0/libHSghc-prim-0.2.0.0-ghc6.12.3.so (0x00007f7d5f591000)
libHSffi-ghc6.12.3.so => /usr/lib/ghc-6.12.3/libHSffi-ghc6.12.3.so (0x00007f7d5f383000)
libc.so.6 => /lib/libc.so.6 (0x00007f7d5f022000)
/lib/ld-linux-x86-64.so.2 (0x00007f7d60661000)
$ ghc foo.hs
$ ldd foo
linux-vdso.so.1 => (0x00007fff2d3ff000)
libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f50014ec000)
libm.so.6 => /lib/libm.so.6 (0x00007f5001269000)
librt.so.1 => /lib/librt.so.1 (0x00007f5001061000)
libdl.so.2 => /lib/libdl.so.2 (0x00007f5000e5d000)
libc.so.6 => /lib/libc.so.6 (0x00007f5000afc000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007f50008df000)
/lib/ld-linux-x86-64.so.2 (0x00007f5001759000)
如果我嘗試(沒有 '-dynamic')進行編譯:
$ ghc --make -shared -fPIC foo.hs -o libfoo.so
Linking libfoo.so ...
/usr/bin/ld: foo.o: relocation R_X86_64_32S against `stg_CAF_BLACKHOLE_info' can not be used when making a shared object; recompile with -fPIC
foo.o: could not read symbols: Bad value
collect2: ld returned 1 exit status
在谷歌上搜索,我發現一些有關這整個問題 - 它可能來自GHC以特定方式編譯(動態/靜態?)的事實,因此靜態鏈接是不可能的。如果這是真的,ELF二進制文件如何可能靜態鏈接?
無論如何,我希望有人能夠說明這一點,因爲大量的谷歌搜索給我留下了比我更多的問題。
非常感謝。
你用什麼系統?看來它是x86_64 Linux。 GHC版本也很重要,因爲它可能實際上是一個已經修復的bug。動態鏈接在過去有一些缺陷,它可能是其中之一。 – Tener 2011-03-01 22:45:43
@Tener | Glasgow Haskell編譯器版本6.12.3,適用於Haskell 98,第2階段由GHC版本6.12.1引導|也許我應該嘗試GHC 7,看看它是否覆蓋了這個問題。 – kuratkull 2011-03-02 23:09:11
@Tener。我開始安裝GHC7,但它仍然無法正常工作,雖然它給了我一些不同的錯誤。 = >>> ' - > ghc --make -shared -fPIC bwt.hs -o libbwt.so [1 of 1]編譯Main(bwt.hs,bwt.o) 鏈接libbwt.so .. 。 的/ usr /斌/ LD:/usr/lib/ghc-7.0.2/base-4.3.1.0/libHSbase-4.3.1.0.a(Base__90.o):針對 「stg_upd_frame_info」 重定位R_X86_64_32S不能使用時製作一個共享對象;使用-fPIC重新編譯 /usr/lib/ghc-7.0.2/base-4.3.1.0/libHSbase-4.3.1.0.a:無法讀取符號:錯誤值 collect2:ld返回1退出狀態# – kuratkull 2011-03-15 19:46:21