[Issue 19653] New: Memory addresses in stacktraces for x86-64 ELFs are only 4 bytes long and don't fall on instruction boundary

d-bugmail at puremagic.com d-bugmail at puremagic.com
Wed Feb 6 11:01:15 UTC 2019


https://issues.dlang.org/show_bug.cgi?id=19653

          Issue ID: 19653
           Summary: Memory addresses in stacktraces for x86-64 ELFs are
                    only 4 bytes long and don't fall on instruction
                    boundary
           Product: D
           Version: D2
          Hardware: x86_64
                OS: Linux
            Status: NEW
          Severity: trivial
          Priority: P1
         Component: dmd
          Assignee: nobody at puremagic.com
          Reporter: johannes.riecken at gmail.com

I compile the file stacktrace.d: void main(){assert(false);} with ASLR turned
off and when running I get:

core.exception.AssertError at stacktrace.d(2): Assertion failure
----------------
??:? _d_assertp [0x55586ed8]
??:? _Dmain [0x55586e20]



objdump -t stacktrace|grep _Dmain gives

0000000000032e0c  w    F .text 0000000000000019              _Dmain

And if I run gdb -q -nx -ex start -ex 'disas /rs _Dmain' -ex q stacktrace:

...
Dump of assembler code for function _Dmain:
   0x0000555555586e0c <+0>: 55  push   %rbp
   0x0000555555586e0d <+1>: 48 8b ec    mov    %rsp,%rbp
=> 0x0000555555586e10 <+4>: be 02 00 00 00  mov    $0x2,%esi
   0x0000555555586e15 <+9>: 48 8d 3d 44 c0 02 00    lea    0x2c044(%rip),%rdi  
     # 0x5555555b2e60 <_TMP0>
   0x0000555555586e1c <+16>:    e8 47 00 00 00  callq  0x555555586e68
<_d_assertp>
   0x0000555555586e21 <+21>:    31 c0   xor    %eax,%eax
   0x0000555555586e23 <+23>:    5d  pop    %rbp
   0x0000555555586e24 <+24>:    c3  retq   

So even if the first two 0x55 bytes were just truncated off, 0x...86e20 given
in the stack trace doesn't match the start of an instruction.

--


More information about the Digitalmars-d-bugs mailing list