[Haskell-cafe] GHC 6.6.1 and SELinux issues

Alexander Vodomerov alexander.vodomerov at gmail.com
Sun Sep 2 14:32:40 EDT 2007


On Wed, Aug 29, 2007 at 01:03:56PM -0700, Stefan O'Rear wrote:
> > So it is not clear if GHC does really need this PROT_EXEC. Can someone 
> > familiar with GHC internals answer why PROT_EXEC is used in getMBlocks?
> 
> It's not possible to correctly implement 'foreign import ccall
> "wrapper"' without self-modifying code on any mainstream computer
> architecture.  Does this program work on your no-PROT_EXEC ghc? :
> 
> {-# OPTIONS_GHC -ffi #-}
> import Foreign
> 
> foreign import ccall "wrapper" wrap :: IO () -> IO (FunPtr (IO ()))
> foreign import ccall "dynamic" call :: FunPtr (IO ()) -> IO ()
> 
> main = call =<< wrap (print "hi!")

Thanks, that is exactly what I asked for.

This program compiles with my no-PROT_EXEC ghc, but doesn't work:

$ ghc -o 1 1.hs
$ ./1
1: internal error: makeExecutable: failed to protect 0x0x2b115597e000

    (GHC version 6.6.1 for x86_64_unknown_linux)
    Please report this as a GHC bug:  http://www.haskell.org/ghc/reportabug
Aborted
$

The errors comes from rts/posix/OSMem.c, function setExecutable which
tries to mprotect block of memory with PROT_EXEC and PROT_WRITE.

What is so special about wrapper and dynamic functions?

I've never used Haskell FFI, but I've heavily used Python-C interface
and Ocaml-C interface, calling both C from Ocaml and Ocaml from C and
even Ocaml from Python via C and etc.  It all worked fine without any
runtime code generation or self-modifying code.

Can you please give some ideas how self-modifying code can be used in
FFI implementation?

With best regards,
   Alexander.


More information about the Haskell-Cafe mailing list