Создание общих библиотек Haskell в OS X - PullRequest
43 голосов
/ 24 марта 2012

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

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

Когда я компилирую с Haskell 64-bit (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)

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

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

Ответы [ 2 ]

9 голосов
/ 03 января 2013

Можно создать рабочие разделяемые библиотеки в 64-битной OS X с последним выпуском платформы Haskell (2012.4 64-битная)

У меня работает строка вызова:

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: https://github.com/bennoleslie/haskell-shared-example содержит рабочий пример.

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

1 голос
/ 19 октября 2012

Возможно, вы захотите попробовать порт ghc в Homebrew - https://github.com/mxcl/homebrew/blob/master/Library/Formula/ghc.rb

...