
#11223: Runtime linker performs eager loading of all object files -------------------------------------+------------------------------------- Reporter: Phyx- | Owner: Phyx- Type: task | Status: new Priority: normal | Milestone: 8.2.1 Component: Runtime System | Version: 7.10.3 (Linker) | Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Compile-time | Unknown/Multiple crash | Test Case: Blocked By: | Blocking: Related Tickets: #10726 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Changes (by Phyx-): * os: Windows => Unknown/Multiple Comment: The Runtime Linker is currently eagerly loading all object files on all platforms which do not use the system linker for `GHCi`. After talking with @rwbarton I have taken the approach of loading entire object files when a symbol is needed instead of doing the dependency tracking on a per symbol basis. This is a lot less fragile and a lot less complicated to implement. The changes come down to the following steps: 1) modify the linker to keep a list of required symbols. Required symbols are any symbols that are passed in from `.o` arguments to `GHCi`. 2) Change `ObjectCode`'s to be indexed but not initialized or resolved. This means we know where we would load the symbols, but haven't actually done so. 3) Mark any `ObjectCode` belonging to `.o` passed as argument as required `loadObject`. 4) During `Resolve` object calls, mark all `ObjectCode` containing the required symbols as `loadObject` 5) During `lookupSymbol` lookups, (which is called from `linkExpr` and `linkDecl` in `GHCI.hs`) is the symbol is in a not-yet-loaded `ObjectCode` then load the `ObjectCode` on demand and return the address of the symbol. Otherwise produce an unresolved symbols error as expected. This change affects all platforms and OSes which use the runtime linker. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/11223#comment:11 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler