#4036: Compiled FFI static imports are invalid when imported in GHCI
-------------------------------+--------------------------------------------
    Reporter:  jmillikin       |       Owner:                             
        Type:  bug             |      Status:  new                        
    Priority:  normal          |   Component:  Compiler (FFI)             
     Version:  6.12.1          |    Keywords:                             
          Os:  Linux           |    Testcase:                             
Architecture:  x86_64 (amd64)  |     Failure:  Incorrect result at runtime
-------------------------------+--------------------------------------------
 When I try to use the FFI syntax for static storage, only modules running
 in interpreted mode (ie GHCI) work properly. Compiled modules have invalid
 pointers, and do not work. I asked in #haskell, and tommd suggested that
 this might be an architecture-dependent error in GHC.

 Here's the code used to reproduce the problem. I'm using {{{sys_siglist}}}
 declared in {{{<signal.h>}}}, since it's similar to how I originally found
 the problem, but I suspect this will occur for any static data.

 Given the following modules:

 {{{
 -- A.hs
 {-# LANGUAGE ForeignFunctionInterface #-}
 module A where
 import Foreign
 import Foreign.C

 foreign import ccall "&sys_siglist"
     siglist_a :: Ptr CString
 }}}

 {{{
 -- B.hs
 {-# LANGUAGE ForeignFunctionInterface #-}
 module B where
 import Foreign
 import Foreign.C

 foreign import ccall "&sys_siglist"
     siglist_b :: Ptr CString
 }}}

 {{{
 -- Main.hs
 {-# LANGUAGE ForeignFunctionInterface #-}
 module Main where
 import Foreign
 import Foreign.C
 import A
 import B

 foreign import ccall "&sys_siglist"
     siglist_main :: Ptr CString

 main = do
     putStrLn $ "siglist_a    = " ++ show siglist_a
     putStrLn $ "siglist_b    = " ++ show siglist_b
     putStrLn $ "siglist_main = " ++ show siglist_main

     peekSiglist "a   " siglist_a
     peekSiglist "b   " siglist_b
     peekSiglist "main" siglist_main

 peekSiglist name siglist = do
     ptr <- peekElemOff siglist 2
     str <- maybePeek peekCString ptr
     putStrLn $ "siglist_" ++ name ++ "[2] = " ++ show str
 }}}

 Running the application via GHCI gives correct output:

 {{{
 $ runhaskell Main.hs
 siglist_a    = 0x00007f53a948fe00
 siglist_b    = 0x00007f53a948fe00
 siglist_main = 0x00007f53a948fe00
 siglist_a   [2] = Just "Interrupt"
 siglist_b   [2] = Just "Interrupt"
 siglist_main[2] = Just "Interrupt"
 }}}

 However, if one of them is compiled, its pointer will be invalid:

 {{{
 $ ghc -c A.hs
 $ runhaskell Main.hs
 siglist_a    = 0x0000000040378918
 siglist_b    = 0x00007fe7c029ce00
 siglist_main = 0x00007fe7c029ce00
 siglist_a   [2] = Nothing
 siglist_b   [2] = Just "Interrupt"
 siglist_main[2] = Just "Interrupt"
 }}}

 I thought this might be related to

-- 
Ticket URL: <http://hackage.haskell.org/trac/ghc/ticket/4036>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
_______________________________________________
Glasgow-haskell-bugs mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to