Greg,

As far as my task 2) to properly detect stack overflow, I think the source of 
my problem is that the __stack_start symbol is not correctly defined.

I found the flthdr -k option to enable the FLAT_FLAG_KTRACE flag for printing 
the executable layout. 

> # toolchains/freescale-coldfire-2011.09/bin/m68k-uclinux-flthdr 
> check-stack-overflow
> check-stack-overflow
>     Magic:        bFLT
>     Rev:          4
>     Build Date:   Wed Sep 26 16:52:43 2012
>     Entry:        0x44
>     Data Start:   0x3ca0
>     Data End:     0x4544
>     BSS End:      0x65f0
>     Stack Size:   0x1000
>     Reloc Start:  0x4544
>     Reloc Count:  0x29
>     Flags:        0x12 ( Has-PIC-GOT Kernel-Traced-Load )

When I run the program, I can see that the stack overflow checking is not 
preventing the stack from getting clobbered.  The stack overruns into the BSS, 
causing the hardware watchdog timer to trip.

> / # check-stack-overflow 
> BINFMT_FLAT: Loading file: /usr/bin/check-stack-overflow
> Mapping is 4063c000, Entry point is 44, data_start is 3ca0
> Load /usr/bin/check-stack-overflow: TEXT=4063c040-4063fca0 
> DATA=40608004-406088a8 BSS=406088a8-4060a954
> __stack_start = 0x406088b4
> %sp = 0x4060beec
> i = 1
> %sp = 0x4060bae0
> i = 2
> %sp = 0x4060b6d4
> i = 3
> %sp = 0x4060b2c8
> i = 4
> %sp = 0x4060aebc
> i = 5
> %sp = 0x4060aab0
> i = 6
> %sp
> 
> Watchdog Timer Reset


__stack_start (0x406088b4) is clearly wrong; it should have a value greater 
than the end of the BSS section (0x4060a954).

I can see __stack_start has the wrong value in the symbol table.  Here's a 
sorted (by section, address) list of the symbols:

> # toolchains/freescale-coldfire-2011.09/bin/m68k-uclinux-objdump -t 
> check-stack-overflow.gdb
> 
> check-stack-overflow.gdb:     file format elf32-m68k
> 
> SYMBOL TABLE:
> 
> 
> 00000000  w      *UND*        00000000 __deregister_frame_info
> 00000000  w      *UND*        00000000 __h_errno_location
> 00000000  w      *UND*        00000000 __pthread_initialize_minimal
> 00000000  w      *UND*        00000000 __register_frame_info
> 00000000  w      *UND*        00000000 _Jv_RegisterClasses
> 00000000 l       *ABS*        00000000 EBITS
> 00000000 l       *ABS*        00000000 EQUAL
> 00000000 l       *ABS*        00000000 have_current_got
> 00000000 l       *ABS*        00000000 have_current_got
> 00000000 l       *ABS*        00000000 NIL
> 00000000 l       *ABS*        00000000 NOOP
[snip]
> ffffffff l       *ABS*        00000000 LESS
> ffffffff l       *ABS*        00000000 QUIET_NaN
> ffffffff l       *ABS*        00000000 UNKNOWN
> ffffffff l       *ABS*        00000000 UNKNOWN
> 00000000 l    df *ABS*        00000000 __C_ctype_b.c
> 00000000 l    df *ABS*        00000000 __errno_location.c
> 00000000 l    df *ABS*        00000000 __uClibc_main.c
[snip]
> 00000000 l    df *ABS*        00000000 write.c
> 00004510 g       *ABS*        00000000 _edata
> 00000000 l    d  .text        00000000 .text
> 00000004 g       .text        00000000 _stext
> 00000004 g     F .text        00000000 _start
[snip]
> 00003be0 l     F .text        00000000 __do_global_ctors_aux
> 00003c0e l     F .text        00000000 call___do_global_ctors_aux
> 00003c1c l     O .text        00000000 __JCR_END__
> 00003c1c l     O .text        00000000 __JCR_LIST__
> 00003c20 g     F .text        00000000 _init
> 00003c34 g     F .text        00000000 _fini
> 00003c60 g       .text        00000000 _etext
> 00003c60 g       .data        00000000 __data_start
> 00003c60 g       .data        00000000 _sdata
> 00003c60 g       .data        00000000 _ssro_size
> 00003c60 g       .data        00000000 _ssrw_size
> 00003c60 g       .data        00000000 data_start
> 00003c60 l     O .data        00000000 _GLOBAL_OFFSET_TABLE_
> 00003c60 l    d  .data        00000000 .data
[snip]
> 00004500 l       .data        00000000 __fini_array_end
> 00004500 l       .data        00000000 __fini_array_start
> 00004500 l       .data        00000000 __init_array_end
> 00004500 l       .data        00000000 __init_array_start
> 00004500 l       .data        00000000 __preinit_array_end
> 00004500 l       .data        00000000 __preinit_array_start
> 00004500 l     O .eh_frame    00000000 __EH_FRAME_BEGIN__
> 00004500 l     O .eh_frame    00000000 __FRAME_END__
> 00004500 l    d  .eh_frame    00000000 .eh_frame
> 00004504 g       .bss 00000000 __bss_start
> 00004504 g       .bss 00000000 _sbss
> 00004504 l     O .bss 00000001 completed.4562
> 00004504 l    d  .bss 00000000 .bss
> 00004506 l     O .bss 00000004 dtor_idx.4564
> 0000450a l     O .bss 00000018 object.4577
> 00004524 g     O .bss 00000004 _stdio_openlist_del_count
> 00004528 g     O .bss 00000004 _stdio_openlist_use_count
> 0000452c l     O .bss 00002000 _fixed_buffers
> 0000652c l     O .bss 0000000a _bss_custom_printf_spec
> 00006538 l     O .bss 00000004 __rtld_fini
> 0000653c l     O .bss 00000004 __app_fini
> 00006540 g     O .bss 00000004 __pagesize
> 00006544  w    O .bss 00000004 environ
> 00006544 g     O .bss 00000004 __environ
> 00006548 g     O .bss 00000004 __libc_stack_end
> 0000654c l     O .bss 00000004 been_there_done_that.3075
> 00006550 l     O .bss 00000004 __exit_cleanup
> 00006554  w    O .bss 00000004 _h_errno
> 00006554 g     O .bss 00000004 h_errno
> 00006558  w    O .bss 00000004 _errno
> 00006558 g     O .bss 00000004 errno
> 0000655c l     O .bss 00000028 _custom_printf_arginfo
> 00006584 g     O .bss 00000028 .hidden _custom_printf_handler
> 000065b0 g       .bss 00000000 _ebss
> 000065b0 g       .bss 00000000 _end
> 000065b0 g       .bss 00000000 end
> 00004510 g       .comment     00000000 __stack_start
> 00000000 l    d  .comment     00000000 .comment
> 00000000 l    d  .debug_abbrev        00000000 .debug_abbrev
> 00000000 l    d  .debug_aranges       00000000 .debug_aranges
> 00000000 l    d  .debug_frame 00000000 .debug_frame
> 00000000 l    d  .debug_info  00000000 .debug_info
> 00000000 l    d  .debug_line  00000000 .debug_line
> 00000000 l    d  .debug_loc   00000000 .debug_loc
> 00000000 l    d  .debug_ranges        00000000 .debug_ranges
> 00000000 l    d  .debug_str   00000000 .debug_str


I don't know the ld scripting language.  I will try to figure out how to define 
__start_stack to have the same value as, for example, .bss _end.

In the mean time, I'll try using _end instead of __stack_start for the stack 
limit symbol.

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

Reply via email to