Создание разделяемых библиотек 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-бит.
Ответы
Ответ 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/
Ответ 2
Возможно, вы захотите попробовать порт ghc в Homebrew - https://github.com/mxcl/homebrew/blob/master/Library/Formula/ghc.rb