“Linux 反汇编失败”是一个比较笼统的说法,常见原因很多,下面按场景和原因给你系统梳理一下,并给出排查思路。
file a.out
如果显示:
ASCII textdataELF 64-bit, but stripped and not executable那说明:
✅ 解决:确认是 ELF 可执行文件或目标文件
不同文件要用不同工具:
| 文件类型 | 工具 |
|---|---|
| ELF 可执行 | objdump -d |
| 原始机器码 | ndisasm |
| 内存/进程 | gdb |
| 内核模块 | objdump -d + 符号 |
❌ 错误示例:
objdump -d hello.c # 源码不能反汇编
✅ 正确:
objdump -d a.out
objdump -d a.out
可能只看到:
a.out: file format elf64-x86-64
或几乎没有函数名
✅ 原因:
strip a.out
✅ 解决:
objdump -d --no-show-raw-insn a.out
例如:
uname -m
file a.out
✅ 解决:
objdump -d -m arm a.out
很多人混淆:
| 类型 | 工具 |
|---|---|
| 反汇编 | objdump, gdb, radare2 |
| 反编译 | ghidra, IDA, retdec |
❌ gcc -S 不是反汇编
✅ objdump -d 才是
常见错误:
(gdb) disassemble main
No symbol table info available.
原因:
-g✅ 解决:
gcc -g -no-pie test.c
gdb ./a.out
objdump -d a.out
只看到:
call *%rax
✅ 原因:
✅ 解决:
gcc -no-pie -fno-pie
readelf -h a.out
如果报错:
Not an ELF file
✅ 说明文件损坏或不是二进制
file a.out
readelf -h a.out
objdump -d a.out | less
高级:
gdb ./a.out
(gdb) disassemble main
你可以直接贴:
file 文件名 的输出我可以一步到位告诉你为什么失败 + 怎么修。