使用调试符号从 ELF 中提取源代码
extract source code from ELF with debug symbols
我正在尝试使用 调试符号从 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 做到了(对吧?)
事实证明,使用 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
)
时,可能值得检查一下是否不需要调整
I'm trying to extract the original source code from an ELF with debug symbols.
那是不可能的:带调试符号的ELF包含没有原始源代码。
您似乎在寻找源代码位置,即文件和行。有了文件名、行号、 和 原始来源,您就可以轻松打印该行。
要恢复 file/line 信息,您可以使用 addr2line -e main 0x6bf
。
我正在尝试使用 调试符号从 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 做到了(对吧?)
事实证明,使用 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
)
I'm trying to extract the original source code from an ELF with debug symbols.
那是不可能的:带调试符号的ELF包含没有原始源代码。
您似乎在寻找源代码位置,即文件和行。有了文件名、行号、 和 原始来源,您就可以轻松打印该行。
要恢复 file/line 信息,您可以使用 addr2line -e main 0x6bf
。