linux - 如何将流程执行记录为汇编指令?
问题描述
我正在编写一个 x86-64 解释器,作为调试和测试程序的一种方式,我需要将该过程记录为汇编指令列表,最好采用 at&t 语法,同时忽略动态库函数调用。并记录cpu寄存器
你知道任何可以提供帮助的工具吗?
我尝试使用 gdbrecord save ...
命令,但输出文件与源程序相比非常大
int main() {
return 42;
}
反汇编文件后指令地址错误。
对于上面的程序,我想要的输出格式是这样的(用 tcc 编译)
400300: 31 ed xor %ebp,%ebp
400302: 49 89 d1 mov %rdx,%r9
400305: 5e pop %rsi
400306: 48 89 e2 mov %rsp,%rdx
400309: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
40030d: 50 push %rax
40030e: 54 push %rsp
40030f: 4c 8b 05 62 02 20 00 mov 0x200262(%rip),%r8 # 600578
400316: 48 8b 0d 63 02 20 00 mov 0x200263(%rip),%rcx # 600580
40031d: 48 8b 3d 64 02 20 00 mov 0x200264(%rip),%rdi # 600588
400324: ff 15 66 02 20 00 callq *0x200266(%rip) # 600590
__libc_start_main
400331: 55 push %rbp
400332: 48 89 e5 mov %rsp,%rbp
400335: 48 81 ec 00 00 00 00 sub $0x0,%rsp
40033c: b8 2a 00 00 00 mov $0x2a,%eax
400341: c9 leaveq
400342: c3 retq
40032a: f4 hlt
42
解决方案
我找到了使用 qemu 的部分解决方案。
qemu-x86_64 -singlestep -d in_asm,cpu,fpu -dfilter beg..end myProgram 2>&1 | vim -
用程序的第一个和最后一个指令地址替换beg
和end
你可以找到它们
objdump -d yourProgram | vim -
请注意,我绘制矩形的非常简单的程序的输出文件为 55MB。而且运行速度很慢。
推荐阅读
- xamarin.forms - 在轮播视图中调整每个图像的大小
- python - 将 numpy 数据类型转换为本机 python 数据类型的更简单方法
- c - 二叉搜索树和结构
- thymeleaf - Thymeleaf - 如何编写 Html 字符串文字?
- pine-script - 将自己的战略与另一个战略联系起来
- javascript - 在 html 中使用 Javascript 更改视频源,而无需仅刷新视频页面
- java - 如何减少编译时间以及此代码在哪些情况下会失败
- javascript - 尽管存在 babel 配置,但 Babel 无法解析双冒号
- python - Python 从标准输入读取 XML
- pandas - 使用 .join 加入索引时的 NaN