I have been chasing what I suspect are stack overflows in NTP. I spotted mention of that there was a gcc option, -fstack-check-symbol=__stack_start, for run-time stack checking on uClinux. I tried that, but it caused an internal compiler error. My development environment is the Sourcery (now Mentor Graphics) CodeBench Lite for ColdFire uClinux SDK. I modified their GCC source to add support for -fstack-limit-symbol. Unfortunately, using the __stack_start symbol to detect stack overflow does not seem to be working out. For my test uClinux executable, 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; } the stack is allocated 4K (0x1000). When I hacked the .s file to print out the stack pointer and __stack start, it shows that there is more than 4K between the value in the stack pointer and __stack_start: %sp = 0x405f3ee4 __stack_start = 0x405f08b4 That is not what I was expecting. Can someone shed some light on why %sp is not roughly __stack_start + 0x1000? __stack_start is defined in the linker script from the Sourcery SDK, m68k-uclinux/lib/elf2flt.ld, right after .bss and before .junk: .bss : { . = ALIGN(0x4) ; _sbss = ALIGN(0x4) ; __bss_start = . ; *(.dynsbss) *(.sbss) *(.sbss.*) *(.scommon) *(.dynbss) *(.bss) *(.bss.*) *(.bss*) *(.gnu.linkonce.b*) *(COMMON) . = ALIGN(0x10) ; _ebss = . ; _end = . ; end = . ; } > flatmem .stack : { . = ALIGN(0x4); __stack_start = .; } .junk 0 : { *(.rel*) *(.rela*) } /* Stabs debugging sections. */ .stab 0 : { *(.stab) } .stabstr 0 : { *(.stabstr) } .stab.excl 0 : { *(.stab.excl) } .stab.exclstr 0 : { *(.stab.exclstr) } .stab.index 0 : { *(.stab.index) } .stab.indexstr 0 : { *(.stab.indexstr) } .comment 0 : { *(.comment) } .debug_abbrev 0 : { *(.debug_abbrev) } .debug_info 0 : { *(.debug_info) } .debug_line 0 : { *(.debug_line) } .debug_pubnames 0 : { *(.debug_pubnames) } .debug_aranges 0 : { *(.debug_aranges) } Is stack: in the wrong place? 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