如何使用-fPIC重新编译GHC?

unc*_*chu 8 haskell shared-libraries ghc dockerfile

简介:我实际上是在尝试构建一个用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
Run Code Online (Sandbox Code Playgroud)

我应该用-fPIC构建GHC并用静态Haskell依赖关系链接我的库?

Dockerfile分叉debian:stretch,这里引用最后一个最重要的部分:

# ... apt-get update ... installing build-essential and other stuff ...

# see https://stackoverflow.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/{}
Run Code Online (Sandbox Code Playgroud)

这是整个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
Run Code Online (Sandbox Code Playgroud)