首页 > 解决方案 > 使用调试符号从 ELF 中提取源代码

问题描述

我正在尝试从带有调试符号的 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 做到了(对吧?)

标签: elfdebug-symbolsobjdump

解决方案


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

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

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

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


推荐阅读