如何让objdump以兼容diff的方式显示跳转指令
解决objdump跳转指令兼容diff的方案
1. 用--adjust-vma统一符号基地址
直接在objdump命令中添加--adjust-vma=0x0参数,把所有段的显示地址偏移到0。这样不同构建版本的符号基地址都会被统一为0,diff对比时就不会因为基地址差异产生大量无关变动。
命令示例:
objdump -D --adjust-vma=0x0 your_binary > dump.txt
这个方法不需要修改原始二进制文件,就能保留跳转指令的偏移信息,完美解决你提到的「不同构建基地址破坏diff」的问题。
2. 把跳转偏移转成输出行号
如果需要将跳转指令中的<symbol+offset>转换成输出里的行号,可以通过两步实现:
- 先生成带行号的反汇编输出(如果之前
--line-numbers耗时太长,只反汇编.text段能大幅提速):
objdump -d --line-numbers --section=.text your_binary > raw_dump.txt
- 用awk脚本处理输出,自动把跳转偏移映射到行号:
保存以下脚本为jump_to_line.awk:
BEGIN { # 先扫描所有行,记录符号的起始地址和对应行号 while ((getline < "raw_dump.txt") > 0) { if ($0 ~ /^[0-9a-f]+ <([^>]+)>:$/) { symbol = substr($2, 2, length($2)-2) sym_addr[symbol] = strtonum("0x" $1) sym_line[symbol] = NR } lines[NR] = $0 } # 遍历每行,替换跳转偏移为目标行号 for (i=1; i<=NR; i++) { line = lines[i] if (match(line, /ja <([^+]+)\+0x([0-9a-f]+)>/, m)) { symbol = m[1] offset = strtonum("0x" m[2]) target_addr = sym_addr[symbol] + offset # 从符号起始行开始找目标地址对应的行 for (j=sym_line[symbol]; j<=NR; j++) { if (match(lines[j], /^([0-9a-f]+):/, addr_m)) { current_addr = strtonum("0x" addr_m[1]) if (current_addr >= target_addr) { printf "%s # 跳转至行号 %d\n", line, j next } } } print line } else { print line } } }
执行脚本处理输出:
awk -f jump_to_line.awk
处理后的结果会在跳转指令后标注对应的行号,diff时不会被干扰。
3. 替代--visualize-jumps的diff友好方案
如果需要跳转可视化又要兼容diff,可以用objdump -D --no-show-raw-insn生成简洁的反汇编内容,再用radiff2(r2工具链自带)做二进制对比。它能识别跳转逻辑的变化,不会被多余的可视化标记打乱diff视图:
radiff2 -a x86 -d old_dump.txt new_dump.txt
内容的提问来源于stack exchange,提问作者Adam Badura
相关产品推荐
相关产品推荐

