minix/lib/csu
Lionel Sambuc 0cdf705cc6 Enable optional GCC install and GCC improvements
-By adding MKGCC=yes and MKGCCCMDS=yes on the make commandline
   it is now possible to compile and install GCC on the system.

   Before doing this, if you are not using the build.sh script,
   you will need to call the fetch scripts in order to retrieve
   the sources of GCC and its dependencies.

 -Reduce difference with NetBSD share/mk

   Move Minix-specific parameters from bsd.gcc.mk to bsd.own.mk,
   which is anyway patched, so that bsd.gcc.mk is now aligned
   on the NetBSD version.

 -Clean libraries dependencies, compiles stdc++ only if gcc is
   also compiled (it is part of the gcc sources)

 -Correct minix.h header sequence, cleanup spec headers.

 -Fix cross-compilation from a 32bit host targeting MINIX/arm

Change-Id: I1b234af18eed4ab5675188244e931b2a2b7bd943
2013-07-12 14:22:03 +02:00
..
alpha Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
arch Enable optional GCC install and GCC improvements 2013-07-12 14:22:03 +02:00
arm_elf Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
common Enable optional GCC install and GCC improvements 2013-07-12 14:22:03 +02:00
common_elf Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
hppa Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
ia64 Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
m68k_elf Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
mips Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
powerpc Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
powerpc64 Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
sh3_elf Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
sparc64 Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
sparc_elf Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
vax_elf Libraries updates and cleanup 2013-01-14 11:36:26 +01:00
Makefile Gold linker support for entire source tree 2013-06-11 22:51:02 +02:00
README switch to netbsd csu 2012-04-12 13:26:24 +02:00

Overview of the common runtime support

The common runtime support contains two modules, crtbegin and crtend.
crtbegin is linked before all other object files of the program or
dynamic library, crtend after all other object files.  They frame the
lists of constructors, destructors, Java types and exception handling frames.

If done correctly, crtend contains no code and is therefore position
independent.  crtendS.o is therefore just a link to crtend.o.

crtbegin should be position-independent code.  crtbeginT.o doesn't have
to be PIC as it is statically linked.  The overhead is generally not
worth the trouble though.


Section types:
.ctor: writeable
.dtor: writeable
.eh_frame: read-only if platform allows mixing read-only and read-write
sections.  This is supported by GNU ld.
.jcr: writeable
.init: executable
.fini: executable


Non-local symbols:

Weak references:
- _Jv_RegisterClasses,
- __cxa_finalize (crtbeginS.o)
- __deregister_frame_info
- __register_frame_info

Hidden:
- __dso_handle: pointer to self for crtbeginS.o, NULL otherwise.
- __CTOR_LIST_END__


Initialisation (called from .init):

1.  Check that the init code hasn't started already, otherwise bail out.
2.  If __register_frame_info is NULL, skip to 4
3.  Call __register_frame_info with start of .eh_frame as first argument
    and a data object of at least 8 pointers as second argument.
4:  If _Jv_RegisterClasses is NULL, skip to 6
5:  Call _Jv_RegisterClasses with the first pointer of the .jcr section
    as argument.
6:  Iterate from the end of the .ctor section to the start.  Skip the
    terminating NULL and stop when reaching the starting (void *)-1 element.
    Call the pointers as void (*)(void) functions.


Deinitialisation (called from .fini):

1.  Check if the init code has already started, otherwise bail out.
2.  If this is not crtbeginS.o or __cxa_finalize is NULL, skip to 4.
3.  Call __cxa_finalize with a pointer into this Dynamic Shared Object (DSO)
    as first argument.
4.  Iterate from the start of the .dtor section to the send.  Skip the
    initial (void *)-1 and stop when reaching the terminating NULL element.
    Call the pointers as void (*)(void) functions.
5.  If __deregister_frame_info is NULL, return.
6.  Call __deregister_frame_info with the start of .eh_frame as the argument.