Modern operating systems promote the use of shared libraries for efficiency. Linking against shared libraries results in smaller program sizes on disk, and also requires less physical memory at run time. Moreover, shared libraries can be fixed and improved without rebuilding executables.
The use of shared libraries leads to executable files containing unresolved references. At program loading time, the system should load the libraries upon which executable files depend, and then it should fix unresolved references to point to the right definitions. This is called dynamic linking.
Dynamic linking requires cooperation between development tools, object file formats and operating system components. For example, a common technique for supporting dynamic linking is by making indirections through linkage tables, which are placed in the executable file by the static linker, and then used by the dynamic linker at load time. Usually, the system's Application Binary Interface (ABI) defines the object file format and these data structures.
During the last years, many vendors are adopting the System V r4 ABI , or at least parts of it. IRIX, Solaris, Linux, FreeBSD or HP-UX currently support ELF as the object file format and use similar dynamic linking conventions. ELF is the file format originally introduced in System V r4.
The standardization of binary interfaces makes possible to take a generic approach for extending the available functionality (we currently have a running version for IRIX and Linux sharing a 70% of source code), as well as for manipulating bindings both at program loading time or at run time.