This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] x86_64: CFI unwinding stop in _start


On 03/16/2012 07:05 PM, Jan Kratochvil wrote:
Hi,

_start function has no valid unwinding, so it should be marked so.

GDB backtrace of stripped executable now runs away as GDB sees neither main()
nor _start (GDB sees the entry address but GDB does not see size of the
function "_start" owning the entry address).

$ echo 'main(){pause();}'|gcc -x c - -s; ./a.out&  gdb -p $! -ex bt
#0  0x00007fc4d92b70d0 in __pause_nocancel () at ../sysdeps/unix/syscall-template.S:82
#1  0x00000000004004ea in ?? ()
#2  0x00007fc4d921e735 in __libc_start_main (main=0x4004dc, ...) at libc-start.c:226
#3  0x00000000004003f9 in ?? ()
#4  0x00007fff46172278 in ?? ()
#5  0x000000000000001c in ?? ()
#6  0x0000000000000001 in ?? ()
#7  0x00007fff46173e45 in ?? ()
#8  0x0000000000000000 in ?? ()
(gdb) q
->
#0  0x00007f2ef69898f0 in __pause_nocancel () at ../sysdeps/unix/syscall-template.S:82
#1  0x00000000004004ea in ?? ()
#2  0x00007f2ef68f0735 in __libc_start_main (main=0x4004dc, ...) at libc-start.c:226
#3  0x00000000004003f9 in ?? ()
(gdb) q

If ld.so called (and not jumped into) _start then _start could have valid
unwind into ld.so.  But until ld.so gets changed unwinding from _start cannot
work anyway.

I was asking for revert of such patch before but libgcc_s is fixed now so it
should work:
	Re: [PATCH] Unwinding CFI stop at the outermost clone()
	http://sourceware.org/ml/libc-alpha/2006-12/msg00078.html

Tested with glibc-2.15-28.fc17 it has no regressions in Fedora Koji x86_64 and
no regressions with FSF GDB HEAD.

For GDB it has FAIL->PASS there:
-FAIL: gdb.cp/gdb2495.exp: Call a function that raises an exception without a handler.
-FAIL: gdb.cp/gdb2495.exp: bt after returning from a popped frame
+PASS: gdb.cp/gdb2495.exp: Call a function that raises an exception without a handler.
+PASS: gdb.cp/gdb2495.exp: bt after returning from a popped frame
But that was not intested.  It is because GDB puts return breakpoint pad to
_start now but that will be handled differently anyway - using stack space
instead.  Still even with the _start placement GDB expects exceptions unwinding
stops there - which is a goal of this patch.
	[patch 1/2] Fix gdb.cp/gdb2495.exp regression with gcc-4.7 #5
	http://sourceware.org/ml/gdb-patches/2012-03/msg00357.html
	[patch 2/2] Fix gdb.cp/gdb2495.exp regression with gcc-4.7 #5
	http://sourceware.org/ml/gdb-patches/2012-03/msg00358.html


thanks, this looks fine.


Shall I commit it for you (I assume you have no commit access)?

Andreas

Thanks,
Jan


2012-03-16 Jan Kratochvil<jan.kratochvil@redhat.com>


	* sysdeps/x86_64/elf/start.S: Include<sysdep.h>.
	(_start): Add cfi_startproc, cfi_undefined for rip and cfi_endproc.

--- a/sysdeps/x86_64/elf/start.S
+++ b/sysdeps/x86_64/elf/start.S
@@ -53,12 +53,16 @@
  					NULL
  */

+#include<sysdep.h>
  #include "bp-sym.h"

  	.text
  	.globl _start
  	.type _start,@function
  _start:
+	cfi_startproc;
+	/* Clearing frame pointer is insufficient, use CFI.  */
+	cfi_undefined (rip);
  	/* Clear the frame pointer.  The ABI suggests this be done, to mark
  	   the outermost frame obviously.  */
  	xorl %ebp, %ebp
@@ -113,6 +117,7 @@ _start:
  #endif

  	hlt			/* Crash if somehow `exit' does return.	 */
+	cfi_endproc;

  /* Define a symbol for the first piece of initialized data.  */
  	.data


--
 Andreas Jaeger aj@{suse.com,opensuse.org} Twitter/Identica: jaegerandi
  SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
   GF: Jeff Hawn,Jennifer Guild,Felix Imendörffer,HRB16746 (AG Nürnberg)
    GPG fingerprint = 93A3 365E CE47 B889 DF7F  FED1 389A 563C C272 A126


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]