Unwinding CFI gcc practice of assumed `same value' regs
Michael Matz
matz@suse.de
Wed Dec 13 18:11:00 GMT 2006
Hi,
On Mon, 11 Dec 2006, Jan Kratochvil wrote:
> 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).
>
> 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. In the -fno-frame-pointer compiled
> code there is no indication the frame pointer register became a regular
> one and 0x0 is its valid value.
Right. Unwinding through functions (without frame pointer) requires CFI.
If there is CFI for a function the unwinder must not look at %rbp for stop
condition. If there's no CFI for a function it can't be unwound (strictly
per ABI). If one relaxes that and wants to unwind through CFI-less
functions it has to have a frame pointer. In that case zero in that frame
pointer could indicate the outermost frame (_if_ the suggestion in the ABI
is adhered to, which noone is required to).
Ciao,
Michael.
More information about the Libc-alpha
mailing list