Как мне перекомпилировать GHC с -fPIC?
Введение: я на самом деле пытаюсь создать разделяемую библиотеку, написанную на Haskell, совместимую с C (можно использовать из кода C, не зная, что она написана на Haskell), но я хочу, чтобы все зависимости Haskell были статически связаны, сейчас я могу только динамически связывать все зависимости (для каждого пакета, включая пакеты "base" и "ghc-prim". Этот эксперимент представлен здесь.
Я попытался решить эту проблему, написав Dockerfile, где я собираю GHC 8.2.2 с нуля с замененным файлом mk/build.mk с этим содержимым (я просто сделал то же самое, что видел в других проблемах переполнения стека, подобных этой), но когда я пытаюсь связать с --make -static -shared -fPIC
Я получаю много подобных ошибок при связывании "ghc-prim", пример последнего:
/usr/bin/ld.gold: error: /ghc-8.2.2-fpic/lib/ghc-8.2.2/ghc-prim-0.5.1.1/libHSghc-prim-0.5.1.1.a(Classes.o): requires dynamic R_X86_64_PC32 reloc against 'stg_ap_0_fast' which may overflow at runtime; recompile with -fPIC
Что я должен сделать, чтобы собрать GHC с -fPIC и связать мою библиотеку со статическими зависимостями Haskell?
Dockerfile
раздвоенный от debian:stretch
Вот цитата из последней наиболее важной части:
# ... apt-get update ... installing build-essential and other stuff ...
# see https://stackru.com/a/28131655/774228
# for info about customizations in 'build.mk'
COPY my-build.mk /my-build.mk
RUN mkdir /compile && cd /compile \
&& wget https://downloads.haskell.org/~ghc/8.2.2/ghc-8.2.2-src.tar.xz \
&& tar -xvf ghc-8.2.2-src.tar.xz \
&& rm ghc-8.2.2-src.tar.xz \
&& cd ghc-8.2.2/ \
&& ./configure --prefix=/ghc-8.2.2-fpic --disable-library-profiling --enable-shared \
&& cp /my-build.mk mk/build.mk \
&& make install \
&& cd /usr/local/bin \
&& ls /ghc-8.2.2-fpic/bin/ | xargs -I{} ln -s /ghc-8.2.2-fpic/bin/{}
А вот целое my-build.mk
файл:
SRC_HC_OPTS = -H64m -O
EXTRA_HC_OPTS = -fPIC
SRC_CC_OPTS = -fPIC -O
GhcStage1HcOpts = -fasm -O0
GhcStage2HcOpts = -fasm -O0
GhcLibHcOpts = -fasm -O2
GhcLibWays = v dyn
DYNAMIC_GHC_PROGRAMS = YES
DYNAMIC_BY_DEFAULT = NO
SplitObjs = NO
HADDOCK_DOCS = NO
BUILD_DOCBOOK_HTML = NO
BUILD_DOCBOOK_PS = NO
BUILD_DOCBOOK_PDF = NO
V = 1
LATEX_DOCS = NO
HSCOLOUR_SRCS = NO
BeConservative = YES