![](/img/trans.png)
[英]OSError: /usr/lib/ghc/ghc-prim-0.5.2.0/libHSghc-prim-0.5.2.0-ghc8.4.4.so: undefined symbol: stg_gc_unpt_r1
[英]Undefined symbol errors with libHSghc-prim when compiling FFI sample
我正在嘗試在《 GHC用戶指南》的FFI章節中編譯示例代碼,可以使用另一台計算機進行編譯:
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
但是,當運行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中得到有關其他未定義符號的錯誤。
如果運行objdump -t libHSghc-prim-0.5.2.0-ghc8.4.3.so
,我會看到符號表中沒有符號。 收到錯誤后,我在Arch Linux系統信息庫中將GHC從8.4.2更新到8.4.3,后者將libHSghc-prim從版本0.5.0.0更新到了0.5.2.0,因此我假設這些新安裝的文件是按順序排列的。 如何解決此問題?
編號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版本使用動態鏈接,這使可執行文件的大小變得更小,並且也有文檔記錄 ,因此我必須使用動態鏈接來編譯程序,因此我只需要添加一個標志即可:
ghc -dynamic -no-hs-main Foo.c libfoo.so
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.