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]

[patch] x86_64: CFI unwinding stop in _start


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,
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


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