This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [patch] x86_64: CFI unwinding stop in _start
- From: Andreas Jaeger <aj at suse dot com>
- To: libc-alpha at sourceware dot org
- Date: Fri, 16 Mar 2012 20:20:53 +0100
- Subject: Re: [patch] x86_64: CFI unwinding stop in _start
- References: <20120316180551.GA6291@host2.jankratochvil.net>
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