如何从带调试符号的ELF文件中根据指定地址提取对应源代码行
操作方法
你可以直接用objdump的地址范围过滤参数实现需求,不需要提前导出全量反汇编文件:
核心命令格式
objdump -S --start-address=<目标地址> --stop-address=<目标地址+1> <ELF文件路径>
参数说明:
-S:表示反汇编同时打印对应的源代码(要求ELF带-g编译的调试符号)--start-address:指定反汇编的起始地址,填你要查询的目标内存地址--stop-address:指定反汇编的结束地址,填目标地址+1即可,保证只反汇编目标地址的单条指令
对应示例的实操
你要查询地址0x6bf对应的源码,直接执行:
objdump -S --start-address=0x6bf --stop-address=0x6c0 main
输出结果会自动包含距离该地址最近的前序源码行,示例输出如下:
if (isPrime(p)) 6bf: e8 86 ff ff ff callq 64a <isPrime>
你直接提取输出中不以十六进制地址开头的行就是对应的源代码。
自动化提取脚本
如果需要直接输出源码行,可以用awk过滤结果:
# 把下面的0x6bf替换成你要查询的实际地址 objdump -S --start-address=0x6bf --stop-address=0x6c0 main | awk '/^ / && !/^ [0-9a-f]+:/ {src=$0} /^ *[0-9a-f]+:.*6bf/ {print src; exit}'
执行后直接输出:
if (isPrime(p))
内容的提问来源于stack exchange,提问作者OrenIshShalom
相关产品推荐
相关产品推荐

