Normally, the GHC runtime system begins things by called an internal function `mainPrimIO :: PrimIO ()' which, in turn, fires up `dialogueToIO :: Dialogue -> IO ()', linking in your `Main.main' to provide the `Dialogue'.
(If you give a `-fhaskell-1.3' flag, then a different `mainPrimIO' will be linked in -- that's why it is important to link with `-fhaskell-1.3'...)
To subvert the above process, you need only provide a `mainPrimIO :: PrimIO ()' of your own (in a module named `Main'). Do not use a `-fhaskell-1.3' flag!
Here's a little example, stolen from Alastair Reid:
module Main ( mainPrimIO ) where import PreludeGlaST mainPrimIO :: PrimIO () mainPrimIO = sleep 5 `seqPrimIO` _ccall_ printf "%d\n" (14::Int) sleep :: Int -> PrimIO () sleep t = _ccall_ sleep t