[GHC] #10885: Crashes on FFI calls to Visual Studio-built C library

GHC ghc-devs at haskell.org
Tue Sep 15 13:49:14 UTC 2015


#10885: Crashes on FFI calls to Visual Studio-built C library
-------------------------------------+-------------------------------------
              Reporter:  mwu         |             Owner:
                  Type:  bug         |            Status:  new
              Priority:  high        |         Milestone:
             Component:  Compiler    |           Version:  7.10.1
              Keywords:              |  Operating System:  Windows
          Architecture:  x86_64      |   Type of failure:  Runtime crash
  (amd64)                            |
             Test Case:              |        Blocked By:
              Blocking:              |   Related Tickets:
Differential Revisions:              |
-------------------------------------+-------------------------------------
 I want to call third-party C library using ffi on Windows. Everything
 works fine with 32-bit GHC distribution, however 64-bit program crashes as
 soon the ffi call is being made. Interestingly, the same program works
 when run with {{{runghc}}}. Just the compiled .exe crashes.

 Consider the following C++ library code:
 {{{#!c++
 // adder.cpp

 extern "C"
 {
         __declspec(dllexport) int _cdecl add(int a, int b)
         {
                 return a + b;
         }
 }
 }}}

 and the following Haskell code using the library:
 {{{#!hs
 import Foreign.C

 foreign import ccall unsafe "add" add :: CInt -> CInt -> IO CInt

 main = (add 5 2) >>= print
 }}}

 It does work on 32-bit architecture and in ghci (on all architectures).
 Why does it not work as 64-bit executable?

 Notes:
 * it works if the library is built with MinGW. However, this is not an
 acceptable workaround for me, since the library I want to call is external
 and closed-source
 * the problem seems to be related to the import library file handling — if
 I replace the MSVC-generated one with the MinGW-generated .lib import
 library, it works (even with MSVC-generated .dll)


 = Repro =
 I attach archive {{{repro_src.7z}}} with source files (as presented here)
 and a {{{build.bat}}} script building binaries. It needs to have both
 GCC/GHC and MSVC compilers in the path. (so it should be called from
 MSVC's {{{x64 Native Tools Command Prompt}}})

 It creates two folder — in one it builds the library with MinGW, in the
 another one — with MSVC. The Haskell program crashes only with MSVC build
 of library. However, the Haskell source file works fine with runghc/ghci.
 Run the {{{build.bat}}} and ender the bin-msvc directory. The
 {{{Caller.exe}}} program crashes. However, {{{runghc -ladder
 ..\src\Caller.hs}}} gives the expected result.

 If you don't have MSVC installed, I provide also a package with all the
 sources built — {{{repro_bin.7z}}}. I have used Microsoft Visual Studio
 2013 and MinGHC 7.10.1, both 64-bit targeting. Same happens with GHC
 7.8.4.

 Please let me know, if you need any further information to investigate
 this report.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/10885>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list