Skip to content

[BUG] RetroWrite does not symbolize RIP-relative addressing and omits the definition of labels #45

@witbring

Description

@witbring

Describe the bug

  1. RetroWrite fails on symbolizing RIP-relative addressing.
    I observed that RetroWrite fails on recovering RIP-relative addressing. As an example, given instruction  ‘leaq fix_syms(%rip), %rsi’ found in addr2line of binutils, RetroWrite reassembled the instruction as ‘leaq 5(%rip), %rsi’.
  • Compiler-generated assembly
_bfd_fix_excluded_sec_syms:             
    .cfi_startproc
    movq    %rdi, %rdx
    movq    40(%rsi), %rdi
    leaq    fix_syms(%rip), %rsi
    jmp bfd_link_hash_traverse          # TAILCALL
    .cfi_endproc

fix_syms:                               
    .cfi_startproc
    pushq   %r14
  • Binary
00000000000a663f <_bfd_fix_excluded_sec_syms>:
   a663f:    mov    %rdi,%rdx
   a6642:    mov    0x28(%rsi),%rdi
   a6646:    lea    0x5(%rip),%rsi        # a6652 <fix_syms>
   a664d:    jmpq   a3ec0 <bfd_link_hash_traverse>

00000000000a6652 <fix_syms>:
   a6652:    push   %r14
  • Reassembler-generated assembly 
.LCa6646:
    leaq 5(%rip), %rsi
  1. RetroWrite omits the definition of some labels.
    Also, I found that RetroWrite sometimes omits some definitions of labels. For example, given the data pointer 0x170c80, RetroWrite symbolized the pointer as '.LC170c80', but RetroWrite misses the definition of the label '.LC170c80'. As a result, it causes a compilation error. 

Describe how to reproduce the bug

  1. Platform: x86-64.
  2. Compiler: Clang v12.0 and GCC v7.5.0
  3. Binary: addr2line in binutils-2.31.1

Metadata

Metadata

Assignees

No one assigned

    Labels

    analysis-neededThis issue needs analysis and possible research to solve.bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions