From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 26681 invoked by alias); 12 Dec 2006 14:55:17 -0000 Received: (qmail 26608 invoked by uid 22791); 12 Dec 2006 14:55:16 -0000 X-Spam-Check-By: sourceware.org Received: from smtp-vbr8.xs4all.nl (HELO smtp-vbr8.xs4all.nl) (194.109.24.28) by sourceware.org (qpsmtpd/0.31) with ESMTP; Tue, 12 Dec 2006 14:55:09 +0000 Received: from webmail.xs4all.nl (dovemail10.xs4all.nl [194.109.26.12]) by smtp-vbr8.xs4all.nl (8.13.8/8.13.8) with ESMTP id kBCEpg2D028718; Tue, 12 Dec 2006 15:51:42 +0100 (CET) (envelope-from mark.kettenis@xs4all.nl) Received: from 82.92.89.47 (SquirrelMail authenticated user sibelius) by webmail.xs4all.nl with HTTP; Tue, 12 Dec 2006 15:51:42 +0100 (CET) Message-ID: <22844.82.92.89.47.1165935102.squirrel@webmail.xs4all.nl> In-Reply-To: <17790.46246.634400.638852@zebedee.pink> References: <20061211190300.GA4372@host0.dyn.jankratochvil.net> <17790.46246.634400.638852@zebedee.pink> Date: Tue, 12 Dec 2006 14:55:00 -0000 Subject: Re: Unwinding CFI gcc practice of assumed `same value' regs From: "Mark Kettenis" To: "Andrew Haley" Cc: "Jan Kratochvil" , gcc@gcc.gnu.org, libc-alpha@sources.redhat.com, gdb@sourceware.org, "Jakub Jelinek" , "Richard Henderson" User-Agent: SquirrelMail/1.4.8 MIME-Version: 1.0 Content-Type: text/plain;charset=iso-8859-1 Content-Transfer-Encoding: 8bit Mailing-List: contact gdb-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-owner@sourceware.org X-SW-Source: 2006-12/txt/msg00094.txt.bz2 > Jan Kratochvil writes: > > > currently (on x86_64) the gdb backtrace does not properly stop at > > the outermost frame: > > > > #3 0x00000036ddb0610a in start_thread () from > /lib64/tls/libpthread.so.0 > > #4 0x00000036dd0c68c3 in clone () from /lib64/tls/libc.so.6 > > #5 0x0000000000000000 in ?? () > > > > Currently it relies only on clearing %rbp (0x0000000000000000 above is > > unrelated to it, it got read from uninitialized memory). > > That's how it's defined to work: %rbp is zero. > > > http://sourceware.org/ml/gdb/2004-08/msg00060.html suggests frame > > pointer 0x0 should be enough for a debugger not finding CFI to stop > > unwinding, still it is a heuristic. > > Not by my understanding it isn't. It's set up by the runtime system, > and 0 (i.e. NULL on x86-64) marks the end of the stack. Officially. > > See page 28, AMD64 ABI Draft 0.98 \u2013 September 27, 2006 -- 9:24. Unfortunately whoever wrote that down didn't think it through. In Figure 3.4 on page 20, %rbp is listed as "callee-saved register; optionally used as frame pointer". So %rbp can be used for anything, as long as you save its contents and restore it before you return. Since it may be used for anything, it may contain 0 at any point in the middle of the call stack. So it is unusable as a stack trace termination condition. The only viable option is explicitly marking it as such in the CFI. Initializing %rbp to 0 in the outermost frame is sort of pointless on amd64.