[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] stubdom: support constructors and destructors
# HG changeset patch # User Keir Fraser <keir.fraser@xxxxxxxxxx> # Date 1211465348 -3600 # Node ID e7eb66a4c5f7ff55cf7f9a8122a9a22e9e044aac # Parent f472d708b9af3a74a5cdaddac009819b11c180ac stubdom: support constructors and destructors Signed-off-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxxx> --- extras/mini-os/arch/ia64/minios-ia64.lds | 17 +++++++++++++++++ extras/mini-os/arch/x86/minios-x86_32.lds | 18 +++++++++++++++++- extras/mini-os/arch/x86/minios-x86_64.lds | 18 +++++++++++++++++- extras/mini-os/main.c | 8 ++++++++ 4 files changed, 59 insertions(+), 2 deletions(-) diff -r f472d708b9af -r e7eb66a4c5f7 extras/mini-os/arch/ia64/minios-ia64.lds --- a/extras/mini-os/arch/ia64/minios-ia64.lds Thu May 22 15:08:48 2008 +0100 +++ b/extras/mini-os/arch/ia64/minios-ia64.lds Thu May 22 15:09:08 2008 +0100 @@ -52,6 +52,23 @@ SECTIONS .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) } diff -r f472d708b9af -r e7eb66a4c5f7 extras/mini-os/arch/x86/minios-x86_32.lds --- a/extras/mini-os/arch/x86/minios-x86_32.lds Thu May 22 15:08:48 2008 +0100 +++ b/extras/mini-os/arch/x86/minios-x86_32.lds Thu May 22 15:09:08 2008 +0100 @@ -28,9 +28,25 @@ SECTIONS .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 */ diff -r f472d708b9af -r e7eb66a4c5f7 extras/mini-os/arch/x86/minios-x86_64.lds --- a/extras/mini-os/arch/x86/minios-x86_64.lds Thu May 22 15:08:48 2008 +0100 +++ b/extras/mini-os/arch/x86/minios-x86_64.lds Thu May 22 15:09:08 2008 +0100 @@ -28,9 +28,25 @@ SECTIONS .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 */ diff -r f472d708b9af -r e7eb66a4c5f7 extras/mini-os/main.c --- a/extras/mini-os/main.c Thu May 22 15:08:48 2008 +0100 +++ b/extras/mini-os/main.c Thu May 22 15:09:08 2008 +0100 @@ -19,6 +19,8 @@ extern int main(int argc, char *argv[], 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 @@ static void call_main(void *p) __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 @@ static void call_main(void *p) 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); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |