Skip to content

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.

Edited by Ben Gamari
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information