. file- and functionality-compatible with previous situation
          (FreeBSD csu) (with a crt1.o -> crt0.o symlink in /usr/lib)
        . harmonizes source with netbsd
        . harmonizes linker invocation (e.g. clang) with netbsd
        . helpful to get some arm code in there for the arm port project
		
	
			
		
			
				
	
	
		
			64 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
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.
 |