24 lines
1.2 KiB
Markdown
24 lines
1.2 KiB
Markdown
|
# Linker combreloc
|
|||
|
|
|||
|
The GNU linker has a `-z combreloc` option, which is enabled by default (it can
|
|||
|
be turned off via `-z nocombreloc`). I just implemented this in gold as well.
|
|||
|
This option directs the linker to sort the dynamic relocations. The sorting is
|
|||
|
done in order to optimize the dynamic linker.
|
|||
|
|
|||
|
The dynamic linker in glibc uses a one element cache when processing relocs: if
|
|||
|
a relocation refers to the same symbol as the previous relocation, then the
|
|||
|
dynamic linker reuses the value rather than looking up the symbol again. Thus
|
|||
|
the dynamic linker gets the best results if the dynamic relocations are sorted
|
|||
|
so that all dynamic relocations for a given dynamic symbol are adjacent.
|
|||
|
|
|||
|
Other than that, the linker sorts together all relative relocations, which
|
|||
|
don’t have symbols. Two relative relocations, or two relocations against the
|
|||
|
same symbol, are sorted by the address in the output file. This tends to
|
|||
|
optimize paging and caching when there are two references from the same page.
|
|||
|
|
|||
|
This may seem like a micro-optimization, but it can have a real effect on
|
|||
|
program startup time, especially if the program has lots of shared libraries.
|
|||
|
I’ve seen a case where a program starts up 16% faster because the relocations
|
|||
|
were sorted.
|
|||
|
|