stubdom: support constructors and destructors
PATCH 1/1 stubdom: support constructors and destructors
stubdom: support constructors and destructors
Signed-off-by Samuel Thibault <[email protected]>
extras/mini-os/arch/ia64/minios-ia64.lds +17 -0
@@ -52,6 +52,23 @@ .fini_array : { *(.fini_array) } PROVIDE (__fini_array_end = .); + .ctors : { + __CTOR_LIST__ = .; + LONG((__CTOR_END__ - __CTOR_LIST__) / 8 - 2) + *(SORT_BY_NAME(.ctors)) + SORT_BY_NAME(CONSTRUCTORS) + LONG(0) + __CTOR_END__ = .; + } + + .dtors : { + __DTOR_LIST__ = .; + LONG((__DTOR_END__ - __DTOR_LIST__) / 8 - 2) + *(SORT_BY_NAME(.dtors)) + LONG(0) + __DTOR_END__ = .; + } + .IA_64.unwind_info : AT(ADDR(.IA_64.unwind_info) - (((5<<(61))+0x100000000) - (1 << 20))) { *(.IA_64.unwind_info) }
extras/mini-os/arch/x86/minios-x86_32.lds +17 -1
@@ -28,9 +28,25 @@ .fini_array : { *(.fini_array) } PROVIDE (__fini_array_end = .); + .ctors : { + __CTOR_LIST__ = .; + LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2) + *(SORT_BY_NAME(.ctors)) + SORT_BY_NAME(CONSTRUCTORS) + LONG(0) + __CTOR_END__ = .; + } + + .dtors : { + __DTOR_LIST__ = .; + LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2) + *(SORT_BY_NAME(.dtors)) + LONG(0) + __DTOR_END__ = .; + } + .data : { /* Data */ *(.data) - CONSTRUCTORS } _edata = .; /* End of data section */
extras/mini-os/arch/x86/minios-x86_64.lds +17 -1
@@ -28,9 +28,25 @@ .fini_array : { *(.fini_array) } PROVIDE (__fini_array_end = .); + .ctors : { + __CTOR_LIST__ = .; + LONG((__CTOR_END__ - __CTOR_LIST__) / 8 - 2) + *(SORT_BY_NAME(.ctors)) + SORT_BY_NAME(CONSTRUCTORS) + LONG(0) + __CTOR_END__ = .; + } + + .dtors : { + __DTOR_LIST__ = .; + LONG((__DTOR_END__ - __DTOR_LIST__) / 8 - 2) + *(SORT_BY_NAME(.dtors)) + LONG(0) + __DTOR_END__ = .; + } + .data : { /* Data */ *(.data) - CONSTRUCTORS } _edata = .; /* End of data section */
extras/mini-os/main.c +8 -0
@@ -19,6 +19,8 @@extern int main (int argc,char *argv[],char *envp[]);extern void __libc_init_array (void );extern void __libc_fini_array (void ); +extern unsigned long __CTOR_LIST__[]; +extern unsigned long __DTOR_LIST__[];struct thread *main_thread;
@@ -147,6 +149,8 @@__libc_init_array (); environ = envp; +for (i =1 ; i <= __CTOR_LIST__[0 ]; i++) + ((void ((*)(void )))__CTOR_LIST__[i]) ();tzset ();exit (main (argc, argv, envp));
@@ -154,6 +158,10 @@void _exit (int ret) { +int i; + +for (i =1 ; i <= __DTOR_LIST__[0 ]; i++) + ((void ((*)(void )))__DTOR_LIST__[i]) ();close_all_files ();__libc_fini_array ();printk ("main returned %d\n" , ret);