Initialization and Termination Routines
Dynamic objects can supply code that provides for runtime initialization and termination processing. The initialization code of a dynamic object is executed once each time the dynamic object is loaded in a process. The termination code of a dynamic object is executed once each time the dynamic object is unloaded from a process or at process termination.
Before transferring control to an application, the runtime
                        linker processes any initialization sections found in the application and
                        any loaded dependencies. If new dynamic objects are loaded during process
                        execution, their initialization sections are processed as part of loading
                        the object. The initialization sections .preinit_array,
.init_array, and .init are
                        created by the link-editor when a dynamic object is built.
               
The runtime linker executes functions whose addresses are contained in the
.preinit_array and .init_array
                        sections. These functions are executed in the same order in which their
                        addresses appear in the array. The runtime linker executes an
.init section as an individual function. If an
                        object contains both .init and
.init_array sections, the
.init section is processed before the functions
                        defined by the .init_array section for that
                        object.
               
An executable can provide pre-initialization functions
                        in a .preinit_array section. These functions are executed
                        after the runtime linker has built the process image and performed
                        relocations but before any other initialization functions.
Pre-initialization functions are not permitted in
                        shared objects.
               
Note:
Any.init section within the executable is
                                called from the application by the process startup mechanism
                                supplied by the compiler driver. The .init
                                section within the executable is called last, after all
                                dependency initialization sections are executed.
               Dynamic objects can also provide termination sections. The
                        termination sections .fini_array and
.fini are created by the link-editor when a
                        dynamic object is built.
               
Any termination sections are passed to 
                     atexit(3C). These termination routines are called when
the process calls 
                     exit(2). Termination sections are also called when
			objects are removed from the running process with 
                     dlclose(3C).
               
The runtime linker executes functions whose addresses are contained in the
.fini_array section. These functions are executed
                        in the reverse order in which their addresses appear in the array. The
                        runtime linker executes a .fini section as an individual
                        function. If an object contains both .fini and
.fini_array sections, the functions defined by
                        the .fini_array section are processed before the
.fini section for that object.
               
Note:
Any.fini section within the executable is
                                called from the application by the process termination mechanism
                                supplied by the compiler driver. The .fini
                                section of the executable is called first, before all
                                dependency termination sections are executed.
               For more information on the creation of initialization and termination sections by the link-editor see Initialization and Termination Sections.