Неопределенные символьные ошибки с libHSghc-prim при компиляции образца FFI - PullRequest
0 голосов
/ 06 июня 2018

Я пытаюсь скомпилировать пример кода в главе FFI Руководства пользователя GHC , которую я могу скомпилировать с помощью другого компьютера:

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: undefined symbol: stg_traceMarkerzh "При компиляции другого простого кода FFI я получаю ошибки о других неопределенных символах в libHSghc-prim.

Если я запускаю objdump -t libHSghc-prim-0.5.2.0-ghc8.4.3.so, я вижу, что в таблице символов нет символов.После получения ошибки я обновил GHC с 8.4.2 до 8.4.3 в репозиториях Arch Linux, который обновил 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)

1 Ответ

0 голосов
/ 07 июня 2018

Я нашел решение.Поскольку версия ghc в репозиториях Arch Linux использует динамическое связывание, что делает размеры исполняемых файлов намного меньшими и также задокументировано , я должен скомпилировать свои программы с динамическим связыванием, поэтому мне просто нужно было добавить флаг:

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