【发布时间】:2011-07-05 02:37:16
【问题描述】:
嘿, 我正在学习 Haskell,我有兴趣使用它来制作用于 Python 和 C 的静态库。经过一番谷歌搜索后,我发现了如何让 GHC 输出共享对象,但它动态地取决于 GHC 的库. 在 GHC 中编译产生的 ELF 是动态依赖的,仅依赖于 C 库,并且它的大小略低于 MB - 它已与 GHC 的库静态链接。共享对象如何以及是否可以实现这一点?
当前状态示例:
$ 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 版本也很重要,因为它实际上可能是一个已经修复的错误。动态链接过去曾有过一些错误,它可能就是其中之一。
-
@Tener | Glasgow Haskell 编译器,版本 6.12.3,用于 Haskell 98,阶段 2,由 GHC 版本 6.12.1 引导 |也许我应该试试 GHC 7 看看它是否解决了这个问题。
-
@Tener。我开始安装 GHC7,但它仍然无法正常工作,尽管它给了我一些不同的错误。 =>>>
--> ghc --make -shared -fPIC bwt.hs -o libbwt.so [1 of 1] Compiling Main ( bwt.hs, bwt.o ) Linking libbwt.so ... /usr/bin/ld: /usr/lib/ghc-7.0.2/base-4.3.1.0/libHSbase-4.3.1.0.a(Base__90.o): relocation R_X86_64_32S against "stg_upd_frame_info" can not be used when making a shared object; recompile with -fPIC /usr/lib/ghc-7.0.2/base-4.3.1.0/libHSbase-4.3.1.0.a: could not read symbols: Bad value collect2: ld returned 1 exit status -
@kuratkull 没有关于这个问题的消息?我也有同样的愿望。
标签: haskell static-libraries static-linking ghc