Looks like you want partial linking (see --relocatable
flag in ld
manual page). As I can see from the sources, cabal
uses partial linking only libraries, compiled for ghci
. From Distribution.Simple.GHC (buildLib
function):
whenVanillaLib False $ do
(arProg, _) <- requireProgram verbosity arProgram (withPrograms lbi)
Ar.createArLibArchive verbosity arProg
vanillaLibFilePath staticObjectFiles
whenProfLib $ do
(arProg, _) <- requireProgram verbosity arProgram (withPrograms lbi)
Ar.createArLibArchive verbosity arProg
profileLibFilePath profObjectFiles
whenGHCiLib $ do
(ldProg, _) <- requireProgram verbosity ldProgram (withPrograms lbi)
Ld.combineObjectFiles verbosity ldProg
ghciLibFilePath ghciObjFiles
whenSharedLib False $
runGhcProg ghcSharedLinkArgs
You can see, that for vanilla and profiling libraries, cabal
just calls ar
utility (see createArLibArchive). For ghci
it calls ld
with -r
flag (which is a shortcut for --relocatable
) (see combineObjectFiles).
So, cabal
doesn't actually do any linking for vanilla libraries, it just combines object files. Actually cabal
can't know, whether final application will use any symbol from your extra-lib
, so the behavior seems reasonable.