Как выборочно связывать определенные системные библиотеки статически в двоичной программе программы Haskell?

В настоящее время я разрабатываю веб-приложение, написанное в Haskell. Все библиотеки Haskell статически связаны; хотя это "раздувает" исполняемый файл, это не так много проблемы, так как это будет единственная программа Haskell, запущенная на сервере.

Однако я также хотел бы избавиться от зависимости от libgmp.so, то есть я хотел бы связать библиотеку multiprecice статически с программой, а также сохранить все остальные системные библиотеки (такие как pthread, libc, и libm) динамически связаны.

Какой компоновщик переключается на ghc, сделайте этот трюк?

РЕДАКТИРОВАТЬ, чтобы ответить на вопрос о стороне вопроса

Можно ли отключить привязку по умолчанию стандартных библиотек, которые по умолчанию потянуты в каждую программу Haskell? Что-то вроде GCC-эквивалента -nostdlib?

Ответы

Ответ 1

dcoutts разместили это как комментарий reddit:

Вы можете сделать то же самое с ghc.

gcc -c prog.c -o prog.o
gcc prog.o libfoo.a -o prog

и lo, причем ghc это то же самое...

ghc -c prog.hs -o prog.o
ghc prog.o libfoo.a -o prog 

Ответ 2

Вы можете использовать -optl для передачи параметров непосредственно компоновщику, поэтому для связывания всех статически вы можете использовать:

ghc --make Main.hs -optl-static -optl-pthread

или поместите их в GHC-Options, если вы используете Cabal.

Вероятно, вы можете настроить это, чтобы иметь более тонкий контроль над тем, что нужно связывать статически или динамически. Опция -v (verbose) полезна здесь, чтобы увидеть окончательную команду компоновщика.