The PLT DWARF EH data for
0000000000001010 <foo@plt>:
1010: ff 25 ea 2f 00 00 jmp *0x2fea(%rip) # 4000 <foo>
1016: 68 00 00 00 00 push $0x0
101b: e9 e0 ff ff ff jmp 1000 <foo@plt-0x10>
is
Contents of the .eh_frame section:
00000000 0000000000000014 00000000 CIE
Version: 1
Augmentation: "zR"
Code alignment factor: 1
Data alignment factor: -8
Return address column: 16
Augmentation data: 1b
DW_CFA_def_cfa: r7 (rsp) ofs 8
DW_CFA_offset: r16 (rip) at cfa-8
DW_CFA_nop
DW_CFA_nop
00000018 0000000000000014 0000001c FDE cie=00000000
pc=0000000000001020..0000000000001025
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
00000030 0000000000000020 00000034 FDE cie=00000000
pc=0000000000001000..0000000000001020
DW_CFA_def_cfa_offset: 16
DW_CFA_advance_loc: 6 to 0000000000001006
DW_CFA_def_cfa_offset: 24
DW_CFA_advance_loc: 10 to 0000000000001010
DW_CFA_def_cfa_expression (DW_OP_breg7 (rsp): 8; DW_OP_breg16 (rip):
0; DW_OP_lit15; DW_OP_and; DW_OP_lit11; DW_OP_ge; DW_OP_lit3;
DW_OP_shl; DW_OP_plus)
Since the PLT rewrite should be enabled only when lazy binding is
disabled,
1016: 68 00 00 00 00 push $0x0
101b: e9 e0 ff ff ff jmp 1000 <foo@plt-0x10>
will never be executed. The PLT rewrite will change the branch instruction
length such that
00000018 0000000000000014 0000001c FDE cie=00000000
pc=0000000000001020..0000000000001025
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
DW_CFA_nop
is no longer the same. But GDB stack trace seems OK.
--
H.J.