GCC may require constructors to be initialized at start up and
destructors to be called on exit. This behavior is captured in the
GCC functions __do_global_ctors
and
__do_global_dtors
. There is some complexity
associated with this functionality, since there may be separate
lists for the main code and shared libraries that are dynamically
loaded.
It is usual to wrap this functionality in two functions,
init
and fini
, which are
placed in their own sections, .init
and
.fini
. The .init
section is
loaded before all other text sections and the
.fini
section after all other text sections.
The start up code should call init
to handle
any constructors.
l.jal init l.nop
The fini
function is passed to the library
function _atexit
to ensure it is called on a
normal exit.
l.movhi r3,hi(fini) l.jal _atexit l.ori r3,r3,lo(fini) /* Delay slot */