What is the search order for symbol lookup when resolving dynamic relocations?
When resolving symbols for a shared library does the loader first search in the 'main executable' (to let the main executable override definitions...) or what?
What is the search order for symbol lookup when resolving dynamic relocations?
When resolving symbols for a shared library does the loader first search in the 'main executable' (to let the main executable override definitions...) or what?
Per my understanding, each executable object has its own "lookup scope":
LD_PRELOAD
facility are added to the global lookup scope, right after the main executable.DF_SYMBOLIC
flag, then symbol references that originate within that object will look for definitions within the object before searching in the global lookup scope.dlopen()
may have their own dependencies. If theRTLD_GLOBAL
flag was not set during the call todlopen()
, these dependencies are added to the lookup scope for that object, but do not affect the global lookup scope. If theRTLD_GLOBAL
flag was passed todlopen()
, then the shared object (and its dependencies) will be added to the "global" lookup scope, changing the behavior of subsequent symbol lookups.Ulrich Drepper's guide "How to Write Shared Libraries" is recommended reading on this topic.
Yes, exactly. The dynamic loader has a linked list of loaded ELF objects (the head of the list is
_r_dynamic.r_map
) and searches dynamic symbol tables of objects in that list linearly, until it finds the symbol definition it is looking for.The head of the list always points to the main executable. If a given symbol is exported from the main executable, then it (almost) always "wins" (overrides other definitions).
However, note that
-Bsymbolic
linker flag changes the picture a bit.