To support the two major kinds of linking described above,
Neutrino has two kinds of libraries: static and
dynamic.
Static libraries
A static library is usually identified by a .a (for "archive") suffix (e.g. libc.a). The library contains the modules you want to include in your program and is formatted as a collection of ELF object modules
that the linker can then extract (as required by your program) and bind with your program at link time.
Dynamic libraries
A dynamic library is usually identified by a .so (for "shared object") suffix (e.g. libc.so). Like a static library, this kind of library also contains the modules that you want to include in your program, but these
modules are not bound to your program at link time. Instead, your program is linked in such a way that the Process Manager causes your program
to be bound to the shared objects at load time.
dlopen()
When a program decides at runtime that it wants to "augment" itself with additional code, it will issue the dlopen() function call. This function call tells the system that it should find the shared object referenced by the dlopen() function and create a binding between the program and the shared object. Again, if the shared object isn't present in memory
already, the system will load it. The main advantage of this approach is that the program can determine, at runtime, which
objects it needs to have access to.