# 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
|