http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50678

--- Comment #31 from Eric Botcazou <ebotcazou at gcc dot gnu.org> 2011-10-15 
21:34:32 UTC ---
There is some suspicious code in

#0  0x00007fff85c75d48 in
libunwind::DwarfInstructions<libunwind::LocalAddressSpace,
libunwind::Registers_x86_64>::stepWithDwarf(libunwind::LocalAddressSpace&,
unsigned long long, unsigned long long, libunwind::Registers_x86_64&) ()
   from /usr/lib/libSystem.B.dylib

(gdb) disass
Dump of assembler code for function
_ZN9libunwind17DwarfInstructionsINS_17LocalAddressSpaceENS_16Registers_x86_64EE13stepWithDwarfERS1_yyRS2_:
   0x00007fff85c75990 <+0>:     push   %rbp

   0x00007fff85c75c81 <+753>:   mov    -0x860(%rbp),%rax
   0x00007fff85c75c88 <+760>:   mov    %rax,0xa0(%r13)
   0x00007fff85c75c8f <+767>:   mov    -0x868(%rbp),%rdx
   0x00007fff85c75c96 <+774>:   mov    %rdx,0x98(%r13)
   0x00007fff85c75c9d <+781>:   mov    -0x870(%rbp),%rcx
   0x00007fff85c75ca4 <+788>:   mov    %rcx,0x90(%r13)
   0x00007fff85c75cab <+795>:   mov    -0x878(%rbp),%rax
   0x00007fff85c75cb2 <+802>:   mov    %rax,0x88(%r13)
   0x00007fff85c75cb9 <+809>:   mov    -0x8e8(%rbp),%rdx
   0x00007fff85c75cc0 <+816>:   mov    %rdx,0x78(%r13)
   0x00007fff85c75cc4 <+820>:   mov    -0x8e0(%rbp),%rcx
   0x00007fff85c75ccb <+827>:   mov    %rcx,0x70(%r13)
   0x00007fff85c75ccf <+831>:   mov    -0x8d8(%rbp),%rax
   0x00007fff85c75cd6 <+838>:   mov    %rax,0x68(%r13)
   0x00007fff85c75cda <+842>:   mov    -0x8d0(%rbp),%rdx
   0x00007fff85c75ce1 <+849>:   mov    %rdx,0x60(%r13)
   0x00007fff85c75ce5 <+853>:   mov    -0x8c8(%rbp),%rcx
   0x00007fff85c75cec <+860>:   mov    %rcx,0x58(%r13)
   0x00007fff85c75cf0 <+864>:   mov    -0x8c0(%rbp),%rax
   0x00007fff85c75cf7 <+871>:   mov    %rax,0x50(%r13)
   0x00007fff85c75cfb <+875>:   mov    -0x8b8(%rbp),%rdx
   0x00007fff85c75d02 <+882>:   mov    %rdx,0x48(%r13)
   0x00007fff85c75d06 <+886>:   mov    -0x8b0(%rbp),%rcx
   0x00007fff85c75d0d <+893>:   mov    %rcx,0x40(%r13)
   0x00007fff85c75d11 <+897>:   mov    -0x8a8(%rbp),%rax
   0x00007fff85c75d18 <+904>:   mov    %rax,0x30(%r13)
   0x00007fff85c75d1c <+908>:   mov    -0x8a0(%rbp),%rdx
   0x00007fff85c75d23 <+915>:   mov    %rdx,0x20(%r13)
   0x00007fff85c75d27 <+919>:   mov    -0x898(%rbp),%rcx
   0x00007fff85c75d2e <+926>:   mov    %rcx,0x28(%r13)
   0x00007fff85c75d32 <+930>:   mov    -0x890(%rbp),%rax
   0x00007fff85c75d39 <+937>:   mov    %rax,0x8(%r13)
   0x00007fff85c75d3d <+941>:   mov    -0x888(%rbp),%rdx
   0x00007fff85c75d44 <+948>:   mov    %rdx,0x10(%r13)
   0x00007fff85c75d48 <+952>:   mov    -0x880(%rbp),%rcx
   0x00007fff85c75d4f <+959>:   mov    %rcx,0x18(%r13)
   0x00007fff85c75d53 <+963>:   mov    %r15,0x0(%r13)
   0x00007fff85c75d57 <+967>:   mov    %r12,0x38(%r13)
   0x00007fff85c75d5b <+971>:   mov    %rbx,0x80(%r13)

-0x860(%rbp) seems to be a saved context:

(gdb) x/gx (-0x860 + $rbp - 8 * 4)
0x100036900:    0x00007fff5fbff9f0
(gdb) x/gx (-0x860 + $rbp - 8 * 5)
0x1000368f8:    0x00007fff5f3ff9f0
(gdb) x/gx (-0x860 + $rbp - 8 * 6)
0x1000368f0:    0x0000000000000000
(gdb) x/gx (-0x860 + $rbp - 8 * 7)
0x1000368e8:    0x00007fff5fbff9f0
(gdb) x/gx (-0x860 + $rbp - 8 * 8)
0x1000368e0:    0x00007fff4fbfc9f0
(gdb) x/gx (-0x860 + $rbp - 8 * 9)
0x1000368d8:    0x00007fff5fbffa30
(gdb) x/gx (-0x860 + $rbp - 8 * 10)
0x1000368d0:    0x0000000080000002
(gdb) x/gx (-0x860 + $rbp - 8 * 11)
0x1000368c8:    0x0000000010000000
(gdb) x/gx (-0x860 + $rbp - 8 * 12)
0x1000368c0:    0x0000000080000002
(gdb) x/gx (-0x860 + $rbp - 8 * 13)
0x1000368b8:    0x0000000010000001
(gdb) x/gx (-0x860 + $rbp - 8 * 14)
0x1000368b0:    0xfffffffffffffffa
(gdb) x/gx (-0x860 + $rbp - 8 * 15)
0x1000368a8:    0x000000000000000d
(gdb) x/gx (-0x860 + $rbp - 8 * 16)
0x1000368a0:    0x0000000000000000
(gdb) x/gx (-0x860 + $rbp - 8 * 17)
0x100036898:    0x0000000000000001

This is the same context as the one displayed by GDB when the probe hits:

(gdb) info reg
rax            0x10000010       268435472
rbx            0x7fff5fbff9f0   140734799804912
rcx            0x7fff5f3ff9f0   140734791416304
rdx            0x0      0
rsi            0x7fff5fbff9f0   140734799804912
rdi            0x7fff4fbfc9f0   140734531357168
rbp            0x7fff5fbffa30   0x7fff5fbffa30
rsp            0x7fff5fbff9f0   0x7fff5fbff9f0
r8             0x80000002       2147483650
r9             0x10000000       268435456
r10            0x80000002       2147483650
r11            0x10000001       268435457
r12            0xfffffffffffffffa       -6
r13            0xd      13
r14            0x0      0
r15            0x1      1

Now, at the end of the code sequence, the context pointed to by %r13 is:

(gdb) x/gx ($r13 + 8 * 0)
0x1000372b0:    0x0000000010000010
(gdb) x/gx ($r13 + 8 * 1)
0x1000372b8:    0x0000000000000000
(gdb) x/gx ($r13 + 8 * 2)
0x1000372c0:    0x00007fff5f3ff9f0
(gdb) x/gx ($r13 + 8 * 3)
0x1000372c8:    0x00007fff5fbff9f0
(gdb) x/gx ($r13 + 8 * 4)
0x1000372d0:    0x00007fff4fbfc9f0
(gdb) x/gx ($r13 + 8 * 5)
0x1000372d8:    0x00007fff5fbff9f0
(gdb) x/gx ($r13 + 8 * 6)
0x1000372e0:    0x00007fff5fbffa30
(gdb) x/gx ($r13 + 8 * 7)
0x1000372e8:    0x00007fff5fbff9f0
(gdb) x/gx ($r13 + 8 * 8)
0x1000372f0:    0x0000000080000002
(gdb) x/gx ($r13 + 8 * 9)
0x1000372f8:    0x0000000010000000
(gdb) x/gx ($r13 + 8 * 10)
0x100037300:    0x0000000080000002
(gdb) x/gx ($r13 + 8 * 11)
0x100037308:    0x0000000010000001
(gdb) x/gx ($r13 + 8 * 12)
0x100037310:    0xfffffffffffffffa
(gdb) x/gx ($r13 + 8 * 13)
0x100037318:    0x000000000000000d
(gdb) x/gx ($r13 + 8 * 14)
0x100037320:    0x0000000000000000
(gdb) x/gx ($r13 + 8 * 15)
0x100037328:    0x0000000000000001

which will be the context restored when the execution resumes.  Note how the
lines of %rbx and %rdx have been swapped.  Looking at the end of the code:

   0x00007fff85c75d27 <+919>:   mov    -0x898(%rbp),%rcx
   0x00007fff85c75d2e <+926>:   mov    %rcx,0x28(%r13)
   0x00007fff85c75d32 <+930>:   mov    -0x890(%rbp),%rax
   0x00007fff85c75d39 <+937>:   mov    %rax,0x8(%r13)
   0x00007fff85c75d3d <+941>:   mov    -0x888(%rbp),%rdx
   0x00007fff85c75d44 <+948>:   mov    %rdx,0x10(%r13)
   0x00007fff85c75d48 <+952>:   mov    -0x880(%rbp),%rcx
   0x00007fff85c75d4f <+959>:   mov    %rcx,0x18(%r13)

it seems that the 0x8(%r13) and the 0x18(%r13) have been swapped.

Reply via email to