[Haskell-cafe] cabal: problem building ffi shared library and
significance of __stginit
Duncan Coutts
duncan.coutts at googlemail.com
Wed May 19 13:01:12 EDT 2010
On Tue, 2010-05-18 at 17:31 -0400, Anthony LODI wrote:
> Hello,
>
> I'm trying to build some haskell code as a .so/.dll so that it can
> ultimately be used by msvc. I have it working when I compile by hand
> (listed below) but I can't get the exact same thing built/linked with
> cabal. On linux everything builds fine, but when I try to link the
> resulting .so file, I get an error about a missing
> '__stginit_CInterface' reference. Indeed I couldn't find that name in
> any of the cabal-generated .dyn_o files. I checked the output of
> 'cabal build -v' and it seems to be executing about the same thing
> that I'm executing manually so I'm not sure what could be going wrong.
> On windows cabal won't even configure since '--enable-shared' seems
> to imply '-dynamic' (right?), and that's not currently supported.
>
> Also, when I remove the line 'hs_add_root(__stginit_CInterface);', and
> the corresponding forward declaration, the program runs fine! Does
> ghc no longer need this call or are my toy programs just being lucky
> sofar?
For reference for other people, Anthony and I worked this out today.
full example:
http://pastebin.com/aLdyFMPg
The difference between doing it manually and building a library via
Cabal is the package name.
When building directly with ghc, the default package name is "" aka the
main package. When building a ghc/Haskell package, the package name gets
set (ghc -package-name test-0.0). This package name gets encoded into
the symbol names. So we get:
__stginit_testzm0zi0_CInterface
vs __stginit_CInterface
(testzm0zi0 is the Z-encoding of test-0.0)
What is bad here is that the __stginit stuff is even necessary. Anthony
is going to file a ghc ticket and/or complain on the ghc users list,
citing this example.
Duncan
More information about the Haskell-Cafe
mailing list