[Haskell-cafe] Haskell plugin dynamic linking issue
Lana Black
lanablack at amok.cc
Mon Apr 10 14:16:09 UTC 2017
On 10/04/17 13:50, Niklas Hambüchen wrote:
> I'm not sure if it's the solution to your problem already, but there's a
> Cabal bug that makes it not pass cc-options and ld-options to GHC as
> ghc-options correctly:
>
> https://github.com/haskell/cabal/issues/4435
>
> You need to additionally pass these options as `ghc-options: "-optl
> -lyourlib"` if you want to be sure.
>
> Further, looking at an example I have around, my cabal `library` output
> (say I have mypackage.cabal with a "library" in there, it's called
> "dist/build/libHSmypackage-...so") link against things like
> libHSghc-prim, but not against the RTS (libHSrts...so). I think this
> makes sense, because as far as I can tell, the RTS is only linked in
> when you compile the final executable, and which RTS .so file is chosen
> depends on whether you link in the standard runtime, the -threaded
> runtime, the debug runtime, etc.
>
> So I believe that when loading Haskell from C you will have to dlopen()
> the RTS you want explicitly, before loading your own .so file. You
> probably also need to load the RTS with the RTLD_GLOBAL dlopen flag so
> that when you later load your .so, it can see the RTS symbols.
>
> An alternative is probably to add HSrts-ghc-VERSION to
> `extra-libraries`, like I do here:
> https://github.com/nh2/call-haskell-from-anything/blob/0ba6737ea17a45e59704dfdc21c971fe10b7d692/detect-ghc-buildinfo.py#L25.
> That links it explicitly like you planned to do.
>
> According to
> https://github.com/nh2/call-haskell-from-anything/issues/19#issuecomment-263688677
> there is now a `foreign-library` stanza in Cabal that is supposed to
> free you of manually having to link/load the RTS. I haven't tried it
> yet, since at the time that comment was written, it wasn't released yet.
> Now it might be.
>
> Detail documentation of that feature:
> https://github.com/haskell/cabal/blob/db26fa21cba92097d9fdeb580ddf797c35af8ed0/Cabal/doc/developing-packages.rst#foreign-libraries
>
> Hope this helps!
>
> Niklas
>
Unfortunately, adding rts to extra-libraries section doesn't help. Now I
get a build error from cabal:
Process exited with code: ExitFailure 1
Logs have been written to:
/home/void/dev/hs/test/.stack-work/logs/test-0.1.log
Configuring test-0.1...
Cabal-simple_mPHDZzAJ_1.24.2.0_ghc-8.0.2: Missing dependency on a
foreign
library:
* Missing C library: HSrts-ghc8.0.2
This problem can usually be solved by installing the system package that
provides this library (you may need the "-dev" version). If the
library is
already installed but in a non-standard location then you can use
the flags
--extra-include-dirs= and --extra-lib-dirs= to specify where it is.
Relevant cabal file options:
extra-lib-dirs: /usr/lib/ghc-8.0.2/rts
extra-libraries: HSrts-ghc8.0.2
ghc-options: -Wall -Werror -shared -fPIC -dynamic
Note that this is a library, not an executable as in
call-haskell-from-anything.
More information about the Haskell-Cafe
mailing list