【问题标题】:extract source code from ELF with debug symbols使用调试符号从 ELF 中提取源代码
【发布时间】:2021-11-01 08:00:10
【问题描述】:

我正在尝试从带有 调试符号的 ELF 中提取原始源代码。

$ sed -n "14,16p" main.c
    for (int p=start;p<end;p++)
        if (isPrime(p))
            printf("%d\n",p);

我想要来自给定地址的“最接近的”源代码行:

$ gcc -g -O0 main.c -o main
$ objdump -D -S main > main.asm
$ sed -n "451,457p" main.asm
        if (isPrime(p))
 6ba:   8b 45 f4                mov    -0xc(%rbp),%eax
 6bd:   89 c7                   mov    %eax,%edi
 6bf:   e8 86 ff ff ff          callq  64a <isPrime>
 6c4:   85 c0                   test   %eax,%eax
 6c6:   74 16                   je     6de <main+0x49>
            printf("%d\n",p);

所以给定0x6bf调用指令,我想提取if (isPrime(p))

这似乎是可能的,因为 objdump 可以做到(对吗?)

【问题讨论】:

    标签: elf debug-symbols objdump


    【解决方案1】:

    我正在尝试从带有调试符号的 ELF 中提取原始源代码。

    这不可能:带有调试符号的 ELF 包含 no 原始源代码。

    您所追求的是源代码位置,即文件和行。有了文件名、行号、原始来源,您可以轻松打印该行。

    要恢复文件/行信息,您可以使用addr2line -e main 0x6bf

    【讨论】:

      【解决方案2】:

      事实证明,使用pyelftools 可以很容易地做到这一点:

      import elftools
      from elftools.elf.elffile import ELFFile as ELF
      
      def addr_2_line(ELFname: str, addr: int) -> int:
          with open(ELFname, "rb") as fl:
              elf = ELF(fl)
              dwarf_info = elf.get_dwarf_info()
              for cu in dwarf_info.iter_CUs():
                  line = 1
                  for entry in dwarf_info.line_program_for_CU(cu).get_entries():
                      if entry.state:
                          if addr > entry.state.address:
                              line = entry.state.line
                          else:
                              return line
      address = addr_2_line("main", 0x6bf)
      print(f"src code[ 0x6bf ] = {address}")
      

      当我运行它时,它确实给出了所需的行:

      src code[ 0x6bf ] = 15
      

      当有更多个编译单元(cu)时,可能需要检查是否不需要调整(cu

      【讨论】:

        猜你喜欢
        • 2011-07-28
        • 2012-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-04
        • 1970-01-01
        • 2014-11-21
        • 1970-01-01
        相关资源
        最近更新 更多