Подтвердить что ты не робот

Создание разделяемых библиотек Haskell на OS X

Я пытаюсь создать общую библиотеку из исходного кода Haskell.

Я пробовал следовать инструкции здесь: http://weblog.haskell.cz/pivnik/building-a-shared-library-in-haskell/, но мне просто не повезло.

Когда я компилирую с 64-разрядным Haskell (ghc 7.0.4 от 2011.4.0.0), я получаю следующую ошибку:

ld: pointer in read-only segment not allowed in slidable image, used in 
                 ___gmpn_modexact_1c_odd 

В качестве альтернативы я также попробовал 32-битную версию и в зависимости от точных флагов, которые я использую для ссылок, получаю такие ошибки, как:

Library not loaded: /usr/local/lib/ghc-7.0.4/base-4.3.1.0/libHSbase-4.3.1.0-ghc7.0.4.dylib

Мне удалось получить немного больше, добавив -lHSrts в линию компоновщика. Это позволило мне успешно связывать и загружать библиотеку, но я не смог найти имя функции, используя dlsym (или вручную используя nm | grep)

Приветствуются любые подсказки, оценка файла make или build, которая успешно построила (и использовала) общую библиотеку в OS X. Я совершенно новичок в Haskell и не знаю, должен ли я продолжать стучать головой, полагая, что проблема на моем конце, или по разным причинам я не должен ожидать, что это будет работать на OS X.

A git repo со всеми комбинациями, которые я пробовал, доступен здесь: https://github.com/bennoleslie/haskell-shared-example Мне удалось получить что-то, работающее для 32-битного ghc, но еще не 64-бит.

4b9b3361

Ответ 1

Возможно создание рабочих разделяемых библиотек в 64-разрядной ОС X с последней версией Haskell Platform (2012.4 64bit)

Линия вызова работает для меня:

ghc -O2 --make \
-no-hs-main -optl '-shared' -optc '-DMODULE=Test' \
-o libTest.so Test.hs module_init.c

module_init.c должно выглядеть примерно так:

#define CAT(a,b) XCAT(a,b)
#define XCAT(a,b) a ## b
#define STR(a) XSTR(a)
#define XSTR(a) #a

#include <HsFFI.h>

extern void CAT(__stginit_, MODULE)(void);

static void library_init(void) __attribute__((constructor));
static void library_init(void)
{
  /* This seems to be a no-op, but it makes the GHCRTS envvar work. */
  static char *argv[] = { STR(MODULE) ".so", 0 }, **argv_ = argv;
  static int argc = 1;

  hs_init(&argc, &argv_);
  hs_add_root(CAT(__stginit_, MODULE));
}

static void library_exit(void) __attribute__((destructor));
static void library_exit(void)
{
  hs_exit();
}

Этот git repo: https://github.com/bennoleslie/haskell-shared-example содержит рабочий пример.

Все кредиты относятся к этому исходному источнику: http://weblog.haskell.cz/pivnik/building-a-shared-library-in-haskell/