编译 FFI 示例时 libHSghc-prim 出现未定义符号错误
Undefined symbol errors with libHSghc-prim when compiling FFI sample
我正在尝试编译 FFI chapter of the GHC User's Guide 中的示例代码,我可以使用另一台计算机编译它:
Foo.hs
module Foo where
foreign export ccall foo :: Int -> IO Int
foo :: Int -> IO Int
foo n = return (length (f n))
f :: Int -> [Int]
f 0 = []
f n = n:(f (n-1))
Foo.c
#include <stdio.h>
#include "HsFFI.h"
#ifdef __GLASGOW_HASKELL__
#include "Foo_stub.h"
#endif
int main(int argc, char *argv[])
{
int i;
hs_init(&argc, &argv);
for (i = 0; i < 5; i++) {
printf("%d\n", foo(2500));
}
hs_exit();
return 0;
}
编译执行
ghc --make -dynamic -shared -fPIC Foo.hs -o libfoo.so
ghc -no-hs-main Foo.c libfoo.so
LD_LIBRARY_PATH=. ./a.out
但是当 运行ning a.out
我得到错误 "./a.out: symbol lookup error: /usr/lib/ghc-8.4.3/ghc-prim-0.5.2.0 /libHSghc-prim-0.5.2.0-ghc8.4.3.so: 未定义符号: stg_traceMarkerzh"
在编译其他简单的 FFI 代码时,我收到有关 libHSghc-prim 中其他未定义符号的错误。
如果我运行objdump -t libHSghc-prim-0.5.2.0-ghc8.4.3.so
,我看到符号table中没有符号。收到错误后,我将 Arch Linux 存储库中的 GHC 从 8.4.2 更新到 8.4.3,这将 libHSghc-prim 从版本 0.5.0.0 更新到 0.5.2.0,所以我假设这些新安装的文件是为了。我该如何解决这个问题?
ldd libHSghc-prim-0.5.2.0-ghc8.4.3.so
linux-vdso.so.1 (0x00007ffc9e7a4000)
/lib/$LIB/liblsp.so => /lib/lib/liblsp.so (0x00007ff31abdf000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007ff31a84a000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007ff31a48e000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007ff31a28a000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007ff31b272000)
我找到了解决方案。由于 Arch Linux 存储库中的 ghc 版本使用动态链接,这使得可执行文件的大小小得多并且也是 documented,我必须使用动态链接编译我的程序,所以我只需要添加一个标志:
ghc -dynamic -no-hs-main Foo.c libfoo.so
我正在尝试编译 FFI chapter of the GHC User's Guide 中的示例代码,我可以使用另一台计算机编译它:
Foo.hs
module Foo where
foreign export ccall foo :: Int -> IO Int
foo :: Int -> IO Int
foo n = return (length (f n))
f :: Int -> [Int]
f 0 = []
f n = n:(f (n-1))
Foo.c
#include <stdio.h>
#include "HsFFI.h"
#ifdef __GLASGOW_HASKELL__
#include "Foo_stub.h"
#endif
int main(int argc, char *argv[])
{
int i;
hs_init(&argc, &argv);
for (i = 0; i < 5; i++) {
printf("%d\n", foo(2500));
}
hs_exit();
return 0;
}
编译执行
ghc --make -dynamic -shared -fPIC Foo.hs -o libfoo.so
ghc -no-hs-main Foo.c libfoo.so
LD_LIBRARY_PATH=. ./a.out
但是当 运行ning a.out
我得到错误 "./a.out: symbol lookup error: /usr/lib/ghc-8.4.3/ghc-prim-0.5.2.0 /libHSghc-prim-0.5.2.0-ghc8.4.3.so: 未定义符号: stg_traceMarkerzh"
在编译其他简单的 FFI 代码时,我收到有关 libHSghc-prim 中其他未定义符号的错误。
如果我运行objdump -t libHSghc-prim-0.5.2.0-ghc8.4.3.so
,我看到符号table中没有符号。收到错误后,我将 Arch Linux 存储库中的 GHC 从 8.4.2 更新到 8.4.3,这将 libHSghc-prim 从版本 0.5.0.0 更新到 0.5.2.0,所以我假设这些新安装的文件是为了。我该如何解决这个问题?
ldd libHSghc-prim-0.5.2.0-ghc8.4.3.so
linux-vdso.so.1 (0x00007ffc9e7a4000)
/lib/$LIB/liblsp.so => /lib/lib/liblsp.so (0x00007ff31abdf000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007ff31a84a000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007ff31a48e000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007ff31a28a000)
/usr/lib64/ld-linux-x86-64.so.2 (0x00007ff31b272000)
我找到了解决方案。由于 Arch Linux 存储库中的 ghc 版本使用动态链接,这使得可执行文件的大小小得多并且也是 documented,我必须使用动态链接编译我的程序,所以我只需要添加一个标志:
ghc -dynamic -no-hs-main Foo.c libfoo.so