Dynamic linking is ubiquitously used, but it's hard to find a detailed, accurate description of how it works. Nevertheless, it is a remarkable example of advanced software engineering, and no modern system is possible without it. Why Solaris abandoned static linking: http://blogs.oracle.com/rie/entry/static_linking_where_did_it == Reading Read the "Dynamic linking and loading" chapter in John Levine's "Linkers and Loaders" (http://www.iecc.com/linker/). Concentrate on ELF linking and loading, but have a look at the Microsoft section if you are curious. Read your dynamic linker's man page. On Linux and Solaris: ld.so == Addtional reading: "Cheating the ELF. Subversive Dynamic Linking to Libraries" by the grugq. http://althing.cs.dartmouth.edu/local/subversiveld.pdf "Modern Day ELF Runtime infection via GOT poisoning" by Ryan O'Neill http://vxheavens.com/lib/vrn00.html == Suggested homework: Use a dynamically compiled executable on your system (which, say, prints "Hello world" in a loop 10 times) and a debugger to observe the stack and GOT just before and after dynamic linking. What are the arguments that the dynamic linker entry point receives when entered through GOT[]? What else is stored in GOT? Observe how the symbol to be linked is referenced from the PLT stub. Useful GDB tips: http://www.unknownroad.com/rtfm/gdbtut/gdbadvanced.html Remember that /proc//maps will show you the process' memory layout with all of its currently mapped code, libraries and stack.