SPRAB89A September 2011 – March 2014
Linux adopts the convention that with respect to symbol resolution, dynamic linking preserves the behavior of static linking. Preemption occurs when there are multiple definitions of the same symbol: specifically, a symbol defined in a library is masked by a definition in an earlier executable or library. Earlier in this sense is according to the breadth-first ordering established by the dependence tree formed by the executable and its dependent libraries.
A symbol can be preempted only if all references to it, even those in the module that defines it, use GOT-based addressing. The dynamic linker carries out the preemption by simply patching the address of the overriding symbol into the appropriate slot of the GOT.