Greg, I hacked the .s file for my stack check test program.
The C code: > # cat stack-overflow.c#include <stdio.h> > > void overflow( int i ) { > > /* Allocate automatic array j[256] so stack limit checking works. */ > > int j[256]; > > /* Stack limit checking tests only whether the stack is large enough for */ > /* the initial stack allocation: saved registers and automatic variables. */ > /* Stack limit checking does not test for stack overflow in the body of a */ > /* function. That is what happens when j[] is not present. When j[] is */ > /* too large, the program will abnormally terminate on its own (illegal */ > /* instruction trap?). j[256] works. */ > > i++; > printf( "i = %i\n", i ); > overflow( i ); > > } > > int main() { > > overflow( 0 ); > > return 0; > > } # toolchains/freescale-coldfire-2011.09-patched/bin/m68k-uclinux-gcc -mcpu=5208 -fomit-frame-pointer -fno-common -fno-builtin -fno-dwarf2-cfi-asm -msep-data -fstack-limit-symbol=__stack_start -S -o stack-overflow.s stack-overflow.c The original .s file: > # cat stack-overflow.s > #NO_APP > .file "stack-overflow.c" > .section .rodata > .LC0: > .string "i = %i\n" > .text > .align 2 > .globl overflow > .type overflow, @function > overflow: > move.l __stack_start@GOT(%a5),%a0 > lea (1028,%a0),%a0 > cmp.l %sp,%a0 > bls.s .+4 > trap #7 > lea (-1024,%sp),%sp > move.l %a5,-(%sp) > addq.l #1,1032(%sp) > move.l .LC0@GOT(%a5),%d0 > move.l 1032(%sp),-(%sp) > move.l %d0,-(%sp) > move.l printf@GOT(%a5),%d0 > move.l %d0,%a0 > jsr (%a0) > addq.l #8,%sp > move.l 1032(%sp),-(%sp) > move.l overflow@GOT(%a5),%d0 > move.l %d0,%a0 > jsr (%a0) > addq.l #4,%sp > move.l (%sp)+,%a5 > lea (1024,%sp),%sp > rts > .size overflow, .-overflow > .align 2 > .globl main > .type main, @function > main: > move.l __stack_start@GOT(%a5),%a0 > addq.l #4,%a0 > cmp.l %sp,%a0 > bls.s .+4 > trap #7 > move.l %a5,-(%sp) > clr.l -(%sp) > move.l overflow@GOT(%a5),%d0 > move.l %d0,%a0 > jsr (%a0) > addq.l #4,%sp > clr.l %d0 > move.l (%sp)+,%a5 > rts > .size main, .-main > .ident "GCC: (GNU) 4.6.1 20120905 (patched)" > .section .note.GNU-stack,"",@progbits My hacked .s file to add printf's: > # cat stack-overflow.s > #NO_APP > .file "stack-overflow.c" > .section .rodata > .LC0: > .string "i = %i\n" > .LC1: > .string "__stack_start = %p\n" > .LC2: > .string "%%sp = %p\n" > .text > .align 2 > .globl overflow > .type overflow, @function > overflow: > move.l __stack_start@GOT(%a5),%a0 > lea (1028,%a0),%a0 > cmp.l %sp,%a0 > bls.s .+4 > trap #7 > lea (-1024,%sp),%sp > move.l %a5,-(%sp) > addq.l #1,1032(%sp) > move.l .LC0@GOT(%a5),%d0 > move.l 1032(%sp),-(%sp) > move.l %d0,-(%sp) > move.l printf@GOT(%a5),%d0 > move.l %d0,%a0 > jsr (%a0) > addq.l #8,%sp > move.l %sp,-(%sp) > move.l .LC2@GOT(%a5),-(%sp) > move.l printf@GOT(%a5),%a0 > jsr (%a0) > addq.l #8,%sp > move.l 1032(%sp),-(%sp) > move.l overflow@GOT(%a5),%d0 > move.l %d0,%a0 > jsr (%a0) > addq.l #4,%sp > move.l (%sp)+,%a5 > lea (1024,%sp),%sp > rts > .size overflow, .-overflow > .align 2 > .globl main > .type main, @function > main: > move.l __stack_start@GOT(%a5),%a0 > addq.l #4,%a0 > cmp.l %sp,%a0 > bls.s .+4 > trap #7 > move.l %a5,-(%sp) > move.l __stack_start@GOT(%a5),-(%sp) > move.l .LC1@GOT(%a5),-(%sp) > move.l printf@GOT(%a5),%a0 > jsr (%a0) > addq.l #8,%sp > move.l %sp,-(%sp) > move.l .LC2@GOT(%a5),-(%sp) > move.l printf@GOT(%a5),%a0 > jsr (%a0) > addq.l #8,%sp > clr.l -(%sp) > move.l overflow@GOT(%a5),%d0 > move.l %d0,%a0 > jsr (%a0) > addq.l #4,%sp > clr.l %d0 > move.l (%sp)+,%a5 > rts > .size main, .-main > .ident "GCC: (GNU) 4.6.1 20120905 (patched)" > .section .note.GNU-stack,"",@progbits # toolchains/freescale-coldfire-2011.09-patched/bin/m68k-uclinux-gcc -mcpu=5208 -fomit-frame-pointer -fno-common -fno-builtin -fno-dwarf2-cfi-asm -msep-data -fstack-limit-symbol=__stack_start -o check-stack-overflow stack-overflow.s When I run the hacked version, the stack pointer is nowhere near __stack_start, yet I suspect a stack overflow has clobbered something and caused the hardware watchdog timer to trip: > / # /usr/bin/check-stack-overflow > > __stack_start = 0x406148b4 > > %sp = 0x40617ee4 > > i = 1 > > %sp = 0x40617ad8 > > i = 2 > > %sp = 0x406176cc > > i = 3 > > %sp = 0x406172c0 > > i = 4 > > %sp = 0x40616eb4 > > i = 5 > > %sp = 0x40616aa8 > > i = 6 > > %s > > > > Watchdog Timer Reset > There must be code between __stack_start and the initial stack pointer. Yes? binfmt_flat.c knows all? By the way, where is binfmt_flat.c? I'm on vacation for five days. I'll pick this up again when I get back. Thanks, Larry Baker US Geological Survey 650-329-5608 ba...@usgs.gov
_______________________________________________ uClinux-dev mailing list uClinux-dev@uclinux.org http://mailman.uclinux.org/mailman/listinfo/uclinux-dev This message was resent by uclinux-dev@uclinux.org To unsubscribe see: http://mailman.uclinux.org/mailman/options/uclinux-dev