aboutsummaryrefslogtreecommitdiffstats
path: root/extras
diff options
context:
space:
mode:
authorJeremy Fitzhardinge <jeremy@goop.org>2011-08-19 09:57:42 +0100
committerJeremy Fitzhardinge <jeremy@goop.org>2011-08-19 09:57:42 +0100
commitb57bd6d2732468362c1dd3be0b26ccf5f4afbf0d (patch)
tree9c5b64dd6eeed9cb071da6223ce5bc5191221899 /extras
parent51f03ec421fb50d2c24a48716a222b8646eab305 (diff)
downloadxen-b57bd6d2732468362c1dd3be0b26ccf5f4afbf0d.tar.gz
xen-b57bd6d2732468362c1dd3be0b26ccf5f4afbf0d.tar.bz2
xen-b57bd6d2732468362c1dd3be0b26ccf5f4afbf0d.zip
mini-os: work around ld bug causing stupid CTOR count
I'm seeing pvgrub crashing when running CTORs. It appears its because the magic in the linker script is generating junk. If I get ld to output a map, I see: .ctors 0x0000000000097000 0x18 0x0000000000097000 __CTOR_LIST__ = . 0x0000000000097000 0x4 LONG 0x25c04 (((__CTOR_END__ - __CTOR_LIST__) / 0x4) - 0x2) *(.ctors) .ctors 0x0000000000097004 0x10 /home/jeremy/hg/xen/unstable/stubdom/mini-os-x86_32-grub/mini-os.o 0x0000000000097014 0x4 LONG 0x0 0x0000000000097018 __CTOR_END__ = . In other words, somehow ((0x97018-0x97000) / 4) - 2 = 0x25c04 The specific crash is that the ctor loop tries to call the NULL sentinel. I'm seeing the same with the DTOR list. Avoid this by terminating the loop with the NULL sentinel, and get rid of the CTOR count entirely. From: Jeremy Fitzhardinge <jeremy@goop.org> Signed-off-by: Keir Fraser <keir@xen.org>
Diffstat (limited to 'extras')
-rw-r--r--extras/mini-os/arch/ia64/minios-ia64.lds2
-rw-r--r--extras/mini-os/arch/x86/minios-x86_32.lds2
-rw-r--r--extras/mini-os/arch/x86/minios-x86_64.lds2
-rw-r--r--extras/mini-os/main.c4
4 files changed, 2 insertions, 8 deletions
diff --git a/extras/mini-os/arch/ia64/minios-ia64.lds b/extras/mini-os/arch/ia64/minios-ia64.lds
index 8b54c0f394..2866a4a644 100644
--- a/extras/mini-os/arch/ia64/minios-ia64.lds
+++ b/extras/mini-os/arch/ia64/minios-ia64.lds
@@ -55,7 +55,6 @@ SECTIONS
.ctors : AT(ADDR(.ctors) - (((5<<(61))+0x100000000) - (1 << 20)))
{
__CTOR_LIST__ = .;
- QUAD((__CTOR_END__ - __CTOR_LIST__) / 8 - 2)
*(.ctors)
CONSTRUCTORS
QUAD(0)
@@ -65,7 +64,6 @@ SECTIONS
.dtors : AT(ADDR(.dtors) - (((5<<(61))+0x100000000) - (1 << 20)))
{
__DTOR_LIST__ = .;
- QUAD((__DTOR_END__ - __DTOR_LIST__) / 8 - 2)
*(.dtors)
QUAD(0)
__DTOR_END__ = .;
diff --git a/extras/mini-os/arch/x86/minios-x86_32.lds b/extras/mini-os/arch/x86/minios-x86_32.lds
index 13796db768..f5cabb6a11 100644
--- a/extras/mini-os/arch/x86/minios-x86_32.lds
+++ b/extras/mini-os/arch/x86/minios-x86_32.lds
@@ -30,7 +30,6 @@ SECTIONS
.ctors : {
__CTOR_LIST__ = .;
- LONG((__CTOR_END__ - __CTOR_LIST__) / 4 - 2)
*(.ctors)
CONSTRUCTORS
LONG(0)
@@ -39,7 +38,6 @@ SECTIONS
.dtors : {
__DTOR_LIST__ = .;
- LONG((__DTOR_END__ - __DTOR_LIST__) / 4 - 2)
*(.dtors)
LONG(0)
__DTOR_END__ = .;
diff --git a/extras/mini-os/arch/x86/minios-x86_64.lds b/extras/mini-os/arch/x86/minios-x86_64.lds
index 6a5c0bb2f9..3da0a9f130 100644
--- a/extras/mini-os/arch/x86/minios-x86_64.lds
+++ b/extras/mini-os/arch/x86/minios-x86_64.lds
@@ -30,7 +30,6 @@ SECTIONS
.ctors : {
__CTOR_LIST__ = .;
- QUAD((__CTOR_END__ - __CTOR_LIST__) / 8 - 2)
*(.ctors)
CONSTRUCTORS
QUAD(0)
@@ -39,7 +38,6 @@ SECTIONS
.dtors : {
__DTOR_LIST__ = .;
- QUAD((__DTOR_END__ - __DTOR_LIST__) / 8 - 2)
*(.dtors)
QUAD(0)
__DTOR_END__ = .;
diff --git a/extras/mini-os/main.c b/extras/mini-os/main.c
index 6b53df5e63..b95b889e16 100644
--- a/extras/mini-os/main.c
+++ b/extras/mini-os/main.c
@@ -153,7 +153,7 @@ static void call_main(void *p)
__libc_init_array();
environ = envp;
- for (i = 1; i <= __CTOR_LIST__[0]; i++)
+ for (i = 0; __CTOR_LIST__[i] != 0; i++)
((void((*)(void)))__CTOR_LIST__[i]) ();
tzset();
@@ -164,7 +164,7 @@ void _exit(int ret)
{
int i;
- for (i = 1; i <= __DTOR_LIST__[0]; i++)
+ for (i = 0; __DTOR_LIST__[i] != 0; i++)
((void((*)(void)))__DTOR_LIST__[i]) ();
close_all_files();
__libc_fini_array();