GHC fails to link all StaticPointers-defining modules of a library in an executable
Consider that you have a package called lib
which exposes these modules,
module ALib.Types where
data AThing = AThing String
deriving (Show)
{-# LANGUAGE StaticPointers #-}
module ALib.Things where
import GHC.StaticPtr
import ALib.Types
thing1 :: StaticPtr AThing
thing1 = static (AThing "hello")
Now consider that you have a server which reads a StaticKey
of StaticPtr AThing
and shows it,
import ALib.Types
main :: IO ()
main = do
key <- readFingerprint <$> getContents :: IO StaticKey
Just thing <- unsafeLookupStaticPtr key :: IO (Maybe (StaticPtr AThing))
print $ deRefStaticPtr thing
Naturally this executable will link against lib
. However, this executable as-written will fail if given the key of ALib.Things.thing1
. Fixing this requires that the executable explicitly import and use a definition from ALib.Things
.
The problem appears to be that the linker elides the ALib.Things
object from the final executable unless it refers to a symbol. Note that things also work fine if the server executable is dynamically linked.