elf - 使用调试符号从 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 做到了(对吧?)
解决方案
我正在尝试从带有调试符号的 ELF 中提取原始源代码。
这是不可能的:带有调试符号的 ELF不包含原始源代码。
您所追求的是源代码位置,即文件和行。有了文件名、行号和原始来源,您可以轻松地打印该行。
要恢复文件/行信息,您可以使用addr2line -e main 0x6bf
.
推荐阅读
- python - Python3 Windows 7 文件路径处理
- c++ - 我应该以什么顺序构建我的 C++ 静态库
- java - 如何使用休眠将日期设置为实体中的主键
- react-native - Have a Tab Act as a Drawer React Native
- python - 使用 get_dummies 时删除冗余列
- javascript - SAPUI5:主从视图中 sap.ui.table.Table 列的总和
- php - FPDF WriteHtml 不起作用
- ios - 使用 Segue 后如何将数据从一个 ViewController 传递到另一个?
- java - maven-jaxb2-plugin 在同一项目中重用公共 XSD
- visual-studio-code - 如何在*更新之前查看发行说明?