Skip to content
Browse files

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>
  • Loading branch information...
1 parent 0a7dedc commit a3d6c14e6c4a1b80d4f4b1d5036c0e87bc53e1f8 Keir Fraser committed with jsgf Aug 19, 2011
Showing with 2 additions and 8 deletions.
  1. +0 −2 arch/ia64/minios-ia64.lds
  2. +0 −2 arch/x86/minios-x86_32.lds
  3. +0 −2 arch/x86/minios-x86_64.lds
  4. +2 −2 main.c
View
2 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__ = .;
View
2 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__ = .;
View
2 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__ = .;
View
4 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();

0 comments on commit a3d6c14

Please sign in to comment.
Something went wrong with that request. Please try again.