反汇编:目标代码->汇编代码,能看到程序被编译后在CPU层面执行的真实指令
源代码、汇编源码、机器码、汇编代码
源代码:高级语言代码
汇编源码:.s文件(也就是汇编语言写成的指令) gcc -S生成的
机器码:.o文件(一堆01,只有CPU看得懂)
反汇编代码:机器码被反推成人类能看懂的东西
**机器码**是CPU能直接执行的内容(0和1),而**汇编**是一种一对一映射的符号化表示
①编译器输出汇编代码(这种日常够用了)
命令:
gcc -S test.c
会生成一个文件:test.s
这个文件是GCC编译器生成的汇编源码,也就是从C语言→汇编语言的直接结果。
②机器码反汇编的结果
从已编译的二进制可执行文件里反推成汇编指令
命令:
gcc test.c -o test //编译源代码成一个可执行文件
obdump -d -S test //-d 显示汇编 -S同时显示源代码
或者在使用VSCode时,在项目下创建./.vscode/tasks.json写入:
{"version": "2.0.0","tasks": [{"label": "compile and disassemble","type": "shell","command": "bash","args": ["-c","gcc -g -O2 test.c -o test && objdump -d -S test > disasm.txt"],"group": {"kind": "build","isDefault": true},"problemMatcher": []}]
}
其实这里就是把上面两行命令合并成一行