[GHC] #11561: Have static ghci link against its own copy of its libraries
GHC
ghc-devs at haskell.org
Tue Feb 9 00:34:41 UTC 2016
#11561: Have static ghci link against its own copy of its libraries
-------------------------------------+-------------------------------------
Reporter: rwbarton | Owner:
Type: feature | Status: new
request |
Priority: low | Milestone:
Component: Runtime | Version: 8.1
System (Linker) |
Keywords: | Operating System: Unknown/Multiple
Architecture: | Type of failure: Runtime
Unknown/Multiple | performance bug
Test Case: | Blocked By:
Blocking: | Related Tickets:
Differential Rev(s): | Wiki Page:
-------------------------------------+-------------------------------------
When ghci is built dynamically, there is just one copy of each of the
libraries that make up ghci (the ghc library, and base and ghc-prim and
all the other dependencies of ghc or ghci) loaded, which is used both by
ghc(i) itself directly, and also by the code run inside ghci. Could we do
the same for statically-built ghci?
Here is a possibility.
* Ensure through suitable linker flags that ''all'' objects in the
archives for the libraries that make up ghci are linked into the ghci
executable. (Or link the .o files that we also produce (except for ghc
itself), instead.)
* Through more linker flags, add ''dynamic symbol table'' entries for all
the symbols in the ghci executable that might be referenced from code run
inside ghci; say all the symbols that the runtime linker would add to its
internal symbol table.
This is a bit weird, because the ghci executable is not relocatable. But
I can't see any specific reason why it is wrong to do.
* In the runtime linker, don't load any library that was linked into ghci.
Instead, trust that `dlsym()` (or the OS-specific equivalent) will find
symbols from those libraries.
Pros:
* ghci startup time (and time to load other libraries linked into ghc)
should be reduced since the runtime linker doesn't need to process a bunch
of relocations. ghci startup time is particularly noticeable on, say, ARM.
(On my tablet it takes about a second.) Not sure whether the dynamic
loader has to process the executable's dynamic symbol table at startup
time, but I assume that even if it does, that process is much faster.
* We can eliminate the .o file for each library linked into ghci from the
binary distribution, at the cost of having to link that entire .o file
into ghci. The net savings would be whatever part of that object file
would have been linked into ghci anyways. (Note that we do not currently
distribute a .o file for the ghc library anyways. My estimate for the
total savings is on the order of 20MB.)
Unknown
* The total process size of ghci might go up or down. For each library
that is eventually loaded into ghci anyways, we save space equal to the
amount of code that would have been linked into ghci from that library.
For each library that is not eventually loaded into ghci, we use
additional space equal to the amount of code in that library that would
not have been linked into ghci.
We could exclude some libraries from this treatment if they make for
particularly bad tradeoffs here and are not depended on by other libraries
that we want to include. We might exclude the ghc package just because it
is rarely loaded into ghci, even though most or all of it will be linked
into ghci anyways, to leave more flexibility for its dependencies.
Cons:
* ?
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/11561>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list