编译FFI样本时libHSghc-prim的未定义符号错误

时间:2018-06-06 15:47:50

标签: haskell gcc compilation linker ghc

我正在尝试编译FFI chapter of the GHC User's Guide中的示例代码,我可以使用另一台计算机正常编译:

Foo.hs

RewriteEngine on
RewriteCond %{HTTP_HOST} ^oldsite.com [NC,OR]
RewriteCond %{HTTP_HOST} ^www.oldsite.com [NC]
RewriteRule ^(.*)$ http://newsite.com/$1 [L,R=301,NC]

foo.c的

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))

编制和执行

#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 时,我收到错误“./a.out:符号查找错误:/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中其他未定义符号的错误。

如果我运行a.out,我发现符号表中没有符号。收到错误后,我在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

objdump -t libHSghc-prim-0.5.2.0-ghc8.4.3.so

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。由于Arch Linux存储库中的ghc版本使用动态链接,这使得可执行文件的大小更小,也是documented,我必须使用动态链接编译我的程序,所以我只需要添加一个标志:

ghc -dynamic -no-hs-main Foo.c libfoo.so