An insightful passage on dynamic linking, global offset tables, and procedure linkage tables, from Jan Hubicka : Much as the global offset table redirects position-independent address calculations to absolute locations, the procedure linkage table redirects position-independent function calls to absolute locations. The link editor cannot resolve execution transfers (such as function calls) from one executable or shared object to another. Consequently, the link editor arranges to have the program transfer control to entries in the procedure linkage table. On the AMD64 architecture, procedure linkage tables reside in shared text, but they use addresses in the private global offset table. The dynamic linker determines the destinations' absolute addresses and modifies the global offset table's memory image accordingly. The much lauded paper " How to Write Shared Libaries " by Ulrich Drepper explains this and much more in great detail. (ELf structures, relocations, sym...