Linking hsc2hs .c output on Windows w/ build system: is it just
me..?
Sigbjorn Finne
sof at galois.com
Tue Apr 28 20:23:51 EDT 2009
Thanks Simon,
sorry for not noticing your reply amidst the flow of g-h-b ticket reports
before now. As there is no need to sail that close to the wind of
playing with the delicate linking & loading orders of the CRT and
base DLLs like kernel32, my suggestion would be simply to avoid
it. You don't do any explicit "-lgcc -lc" trickery when invoking gcc/ld
on other platforms, so why be different?
Apart from the changes to Win32.cabal and base.cabal mentioned
in the original e-mail, injecting addDLL() calls for kernel32 and
msvcrt in initLinker() ought to do it.
--sigbjorn
On 4/27/2009 04:58, Simon Marlow wrote:
> On 24/04/2009 23:04, Sigbjorn Finne wrote:
>> I've been experiencing repeated woes over the past 4-5 months
>> when trying to spin up build trees on Windows with the new build
>> system. This is happening on the 3-4 boxes that I regularly develop on,
>> which leads me to believe that this may not be limited to just me..
>>
>> The problem is that hsc2hs generated .c files (Foo_hsc_make.c) when
>> compiled and linked via the 'ghc' that's configured against, will
>> produce
>> .exe's that crashes right out of the gates. gdb'ing the generated
>> binaries,
>> the crash is happening in the CRT startup code & with some further
>> poking
>> around I've been able to determine that it is the explicit presence
>> of "-l"
>> options for 'kernel32' and 'msvcrt' when linking that's the cause.
>> This is
>> with a variety of versions of 'ld' and binutils snapshots (2.17.x --
>> 2.19).
>> Using the 2.19.1 version that ships with gcc4.3.3 snapshots for mingw is
>> well-behaved, but ghc is still using gcc-3.4.5.
>
> We have seen this problem here on Satnam Singh's machine, but we
> eventually put it down to a conflict between versions of certain MSYS
> bits. There may indeed be a real problem here, I don't know.
>
> On Satnam's machine we established that the problem was provoked by
> updating binutils, and the solution was "don't do that" (Satnam had
> originally done this because the windres that comes with MSYS was
> incompatible with GHC, but that can be worked around by just copying
> in a suitable windres).
>
> We also tracked it down as far as compiling a trivial C program with
> -lmsvcrt.
>
> Incedentally if you follow the instructions on the wiki exactly, you
> won't run into this problem:
> http://hackage.haskell.org/trac/ghc/wiki/Building/Preparation/Windows.
>
>> There's a couple of things that are odd here:
>>
>> * base.cabal files have kernel32 and msvcrt as extra-libraries. This is
>> clearly
>> not required when doing invocations via ld(1), and causes considerable
>> mischief,
>> so it'd be good if there was a way in .cabal files to distinguish
>> between stuff that
>> goes into 'extraLibraries' and 'extraGHCiLibraries' in package.conf's
>> InstalledPackageInfos. (Is there? Couldn't locate anything appropriate
>> while
>> working with the Cabal sources..)
>>
>> * 'base' needing to include these two dependencies even for GHCi
>> usage. A
>> running RTS will have these loaded already, so it really ought to have
>> primed
>> the list of opened DLLs by explicitly loading them upon initialization
>> of the linker.
>> [I've got a trivial patch against rts/Linker.c that does this; can
>> forward/commit if
>> of interest..]
>
> I've no idea why these library dependencies are there. It might well
> be historical. I'm happy to defer to Windows experts such as yourself
> on whether we should have them or not (I guess not?).
>
>> * In addition to the patch referred to above, to solve these problems, I
>> had to scrub
>> libraries/base/base.cabal of 'kernel32' and 'msvcrt' + the
>> package.conf's for the
>> versions of ghc I'm building against had to be edited, limiting the use
>> of 'kernel32'
>> and 'msvcrt' to extraGHCiLibraries for both the 'base' and 'Win32'
>> packages.
>>
>> Long and rambling..hope you made it this far ;-) Is anyone else running
>> into this issue &
>> should we do something about it? If not, details of compilation
>> environment that
>> you've got that avoids running into this issue would be most welcome.
>> It's a bit of a
>> chore spinning up new builds, as is.
>
> One open question is whether we should expect "gcc foo.c -lmsvcrt" to
> work. It works with older versions of MSYS/mingw, but apparently not
> with more recent versions. On the face of it this seems like it ought
> to be harmless, since msvcrt will eventually be linked in anyway.
>
> Cheers,
> Simon
More information about the Glasgow-haskell-bugs
mailing list