[Dwarf-Discuss] doubt parsing CIE in eh_frame

Jakub Jelinek jakub at redhat.com
Tue May 24 01:07:47 PDT 2016


On Tue, May 24, 2016 at 09:46:58AM +0200, Francesco Zappa Nardelli wrote:
> Dear David and all
> 
> If you could produce a small object file..
> 
> 
> Invoking readelf on /lib/x86_64-linux-gnu/libc.so.6 is enough to observe
> this (I am on Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-68-generic x86_64)):
> 
> $ readelf -wf /lib/x86_64-linux-gnu/libc.so.6 (and search for S in the
> augmentation string)

The only zRS I see in my libc.so.6 is the __restore_rt trampoline in
sigaction.c.
https://sourceware.org/git/?p=glibc.git;a=blob;f=sysdeps/unix/sysv/linux/x86_64/sigaction.c;h=71ac05c4bc01c560935f3bbd4306e3aeacb6d9be;hb=HEAD

The CIE doesn't contain any (non-nop) instructions, so guess readelf -wF's
default for no instructions at all is the first register.  Does it really
matter?  The (only) FDE that refers to this CIE defines the CFA expression
as the very first thing in it, so it isn't really ever used.

Though, perhaps you might want to file a request to move the do_cfa_expr
macro into the CIE from the FDE - I think
DW_CFA_def_cfa_expression (DW_OP_breg7 (rsp): 160; DW_OP_deref)
is 6 bytes and therefore would fit exactly into the padding at the end of
the CIE.

> 00002690 0000000000000014 00000000 CIE
>   Version:               1
>   Augmentation:          "zRS"
>   Code alignment factor: 1
>   Data alignment factor: -8
>   Return address column: 16
>   Augmentation data:     1b
> 
>   DW_CFA_nop
>   DW_CFA_nop
>   DW_CFA_nop
>   DW_CFA_nop
>   DW_CFA_nop
>   DW_CFA_nop
> 
> while readelf -wF gives:
> 
> 00002690 0000000000000014 00000000 CIE "zRS" cf=1 df=-8 ra=16
>    LOC           CFA
> 0000000000000000 rax+0
> 
> Remark: objdump emits the same output.
> 
> I believe that this is the unwinding information for the longjmp call, and
> the unwinding infos are computed from a structure on the stack representing
> the processor state to which we want longjmp:
> 
> 000026a8 000000000000007c 0000001c FDE cie=00002690
> pc=0000000000036d3f..0000000000036d49
>    LOC           CFA
>   rax   rdx   rcx   rbx   rsi   rdi   rbp   rsp   r8    r9
>   r10   r11   r12   r13   r14   r15   ra
> 0000000000036d3f exp
>   exp   exp   exp   exp   exp   exp   exp   exp   exp   exp   exp
> exp   exp   exp   exp   exp
> exp
> 
> 000026a8 000000000000007c 0000001c FDE cie=00002690
> pc=0000000000036d3f..0000000000036d49
>   DW_CFA_def_cfa_expression (DW_OP_breg7 (rsp): 160; DW_OP_deref)
>   DW_CFA_expression: r8 (r8) (DW_OP_breg7 (rsp): 40)
>   DW_CFA_expression: r9 (r9) (DW_OP_breg7 (rsp): 48)
>   … (and so on for all registers)…
> 
> So it makes sense to ignore whatever in the CIE here.
> 
> I am just surprised that readelf/objdump prints “rax+0”: I would have
> expected “u” as the CFA in the CIE is never computed by the CIE bytecode.
> Wonder if I am missing something...

	Jakub


More information about the Dwarf-Discuss mailing list