Skip to content
  • Simon Marlow's avatar
    Force re-linking if the options have changed (#4451) · 814edf44
    Simon Marlow authored
    A common sequence of commands (at least for me) is this:
    
    $ ghc hello
    1 of 1] Compiling Main             ( hello.hs, hello.o )
    Linking hello ...
    $ ./hello +RTS -s
    hello: Most RTS options are disabled. Link with -rtsopts to enable them.
    $ ghc hello -rtsopts
    $
    
    grr, nothing happened.  I could use -fforce-recomp, but if this was a
    large program I probably don't want to recompile it all again, so:
    
    $ rm hello
    removed `hello'
    $ ghc hello -rtsopts
    Linking hello ...
    $ ./hello +RTS -s
    ./hello +RTS -s
    Hello World!
              51,264 bytes allocated in the heap
               2,904 bytes copied during GC
              43,808 bytes maximum residency (1 sample(s))
              17,632 bytes maximum slop
    etc.
    
    With this patch, GHC notices when the options have changed and forces
    a relink, so you don't need to rm the binary or use -fforce-recomp.
    This is done by adding the pertinent stuff to the binary in a special
    section called ".debug-ghc-link-info":
    
    $ readelf -p .debug-ghc-link-info ./hello
    String dump of section 'ghc-linker-opts':
      [     0]  (["-lHSbase-4.3.1.0","-lHSinteger-gmp-0.2.0.2","-lgmp","-lHSghc-prim-0.2.0.0","-lHSrts","-lm","-lrt","-ldl","-u","ghczmprim_GHCziTypes_Izh_static_info","-u","ghczmprim_GHCziTypes_Czh_static_info","-u","ghczmprim_GHCziTypes_Fzh_static_info","-u","ghczmprim_GHCziTypes_Dzh_static_info","-u","base_GHCziPtr_Ptr_static_info","-u","base_GHCziWord_Wzh_static_info","-u","base_GHCziInt_I8zh_static_info","-u","base_GHCziInt_I16zh_static_info","-u","base_GHCziInt_I32zh_static_info","-u","base_GHCziInt_I64zh_static_info","-u","base_GHCziWord_W8zh_static_info","-u","base_GHCziWord_W16zh_static_info","-u","base_GHCziWord_W32zh_static_info","-u","base_GHCziWord_W64zh_static_info","-u","base_GHCziStable_StablePtr_static_info","-u","ghczmprim_GHCziTypes_Izh_con_info","-u","ghczmprim_GHCziTypes_Czh_con_info","-u","ghczmprim_GHCziTypes_Fzh_con_info","-u","ghczmprim_GHCziTypes_Dzh_con_info","-u","base_GHCziPtr_Ptr_con_info","-u","base_GHCziPtr_FunPtr_con_info","-u","base_GHCziStable_StablePtr_con_info","-u","ghczmprim_GHCziTypes_False_closure","-u","ghczmprim_GHCziTypes_True_closure","-u","base_GHCziPack_unpackCString_closure","-u","base_GHCziIOziException_stackOverflow_closure","-u","base_GHCziIOziException_heapOverflow_closure","-u","base_ControlziExceptionziBase_nonTermination_closure","-u","base_GHCziIOziException_blockedIndefinitelyOnMVar_closure","-u","base_GHCziIOziException_blockedIndefinitelyOnSTM_closure","-u","base_ControlziExceptionziBase_nestedAtomically_closure","-u","base_GHCziWeak_runFinalizzerBatch_closure","-u","base_GHCziTopHandler_runIO_closure","-u","base_GHCziTopHandler_runNonIO_closure","-u","base_GHCziConcziIO_ensureIOManagerIsRunning_closure","-u","base_GHCziConcziSync_runSparks_closure","-u","base_GHCziConcziSignal_runHandlers_closure","-lHSffi"],Nothing,RtsOptsAll,False,[],[])
    
    And GHC itself uses the readelf command to extract it when deciding
    whether to relink.  The reason for the name ".debug-ghc-link-info" is
    that sections beginning with ".debug" are removed automatically by
    strip.
    
    This currently only works on Linux; Windows and OS X still have the
    old behaviour.
    814edf44