OSDN Git Service

* dcrt0.cc (dll_crt0_1): Add a symbol denoting return from call to main().
authorcgf <cgf>
Fri, 1 Aug 2008 19:12:48 +0000 (19:12 +0000)
committercgf <cgf>
Fri, 1 Aug 2008 19:12:48 +0000 (19:12 +0000)
* exceptions.cc (stack_info::walk): Stop walking the stack when we hit
_cygwin_exit_return rather than just blindly stopping when PC becomes zero.

winsup/cygwin/ChangeLog
winsup/cygwin/dcrt0.cc
winsup/cygwin/exceptions.cc

index d1c1ae7..e907245 100644 (file)
@@ -1,3 +1,11 @@
+2008-08-01  Christopher Faylor  <me+cygwin@cgf.cx>
+
+       * dcrt0.cc (dll_crt0_1): Add a symbol denoting return from call to
+       main().
+       * exceptions.cc (stack_info::walk): Stop walking the stack when we
+       hit _cygwin_exit_return rather than just blindly stopping when PC
+       becomes zero.
+
 2008-07-31  Corinna Vinschen  <corinna@vinschen.de>
 
        * path.cc (symlink_info::check): Handle (and explain) a special case
index 6b2d283..e37cbec 100644 (file)
@@ -933,6 +933,10 @@ dll_crt0_1 (void *)
   ld_preload ();
   if (user_data->main)
     cygwin_exit (user_data->main (__argc, __argv, *user_data->envptr));
+  __asm__ ("                           \n\
+       .global __cygwin_exit_return    \n\
+__cygwin_exit_return:                  \n\
+");
 }
 
 extern "C" void __stdcall
index 9b7c980..e744e7c 100644 (file)
@@ -243,21 +243,24 @@ stack_info::init (DWORD ebp, bool wantargs, bool goodframe)
 # undef debp
 }
 
+extern "C" void _cygwin_exit_return ();
+
 /* Walk the stack by looking at successive stored 'bp' frames.
    This is not foolproof. */
 int
 stack_info::walk ()
 {
   char **ebp;
+
+  if ((void (*) ()) sf.AddrPC.Offset == _cygwin_exit_return)
+    return 0;          /* stack frames are exhausted */
+
   if (((ebp = (char **) next_offset ()) == NULL) || (ebp >= (char **) cygwin_hmodule))
     return 0;
 
   sf.AddrFrame.Offset = (DWORD) ebp;
   sf.AddrPC.Offset = sf.AddrReturn.Offset;
 
-  if (!sf.AddrPC.Offset)
-    return 0;          /* stack frames are exhausted */
-
   /* The return address always follows the stack pointer */
   sf.AddrReturn.Offset = (DWORD) *++ebp;