Hi, I'm manage to link statically all haskell libraries to a dynamically loadable postgreSQL extension written in haskell using:
SRC_HC_OPTS += -fPIC SRC_CC_OPTS += -fPIC in build.mk and passing these options to every package cabal builds: --ghc-option=-fPIC --ghc-option=-optc-fPIC I'm using nix but it should work in any environment if you make sure every package cabal build gets these options (maybe by setting them in $HOME/.cabal/config?) HTH, Alberto On Tue, Dec 26, 2017 at 9:11 PM, Viacheslav Lotsmanov <[email protected] > wrote: > Hi there. My actual main goal is to build my own shared library written in > Haskell that would be compatible with application written in C even without > knowing that is is written in Haskell. So for now I compiled my shared > library but I only could dynamically link it to Haskell dependencies such > as "base" and "ghc-prim" packages. But I want to statically link Haskell > dependencies but I realized it isn't simple and straightforward task. > > On Freenode's #haskell I was advised I should build GHC from scratch with > -fPIC, on the Linux (I'm using Fedora Workstation 25 on x86_64) I couldn't > go forward without this step. So I wrote some Dockerfile based on Debian 9, > skipping first part which is containing 'apt-get update' and installing > 'build-essential' here is what I have: > 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/{} > > And as you can see I just use my own prepared *my-build.mk > <http://my-build.mk>* file which is: > 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 > > I just combined it from parts I found in the internet during searching > answers to my questions. So I built this container, I also installed > dependencies by this commands: > cd /mnt > cabal update > cabal sandbox init > cabal install --enable-shared --ghc-option=-fPIC happy alex > cabal install --enable-shared --ghc-option=-fPIC base-unicode-symbols > filepath process directory lens containers qm-interpolated-string > > And when I tried to build my app by following commands (first command > compiles some C-code to automatically initialize Haskell runtime, see link > posted below, not sure if *-static*, *-shared* or *-fPIC* means something > here but it's work in progress): > ghc -static -shared -fPIC -optc-DMODULE=Foo src/lib-autoinit.c -outputdir > builddir > ghc -package-db=SOME_CABALS_SANDBOX_PKGDB_DIR --make -static -shared -fPIC > src/Foo.hs builddir/src/lib-autoinit.o -o builddir/libfoo.o -isrc > -outputdir builddir -Wall -O2 > > I failed with a lot of similar errors like this one: > /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 > > What have I missed? What should I do to make this happen? > > Any progress could be found here (Dockerfile, sources of modules, > build-scripts): https://github.com/unclechu/haskell-experiment-shared- > library-for-c-application > Related stack overflow issue: https://stackoverflow.com/ > questions/47978884/how-do-i-recompile-ghc-with-fpic > > _______________________________________________ > ghc-devs mailing list > [email protected] > http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs > >
_______________________________________________ ghc-devs mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/ghc-devs
