如何用llvm-objdump拆解纯二进制文件?ARM工具是否可行?
二进制文件拆解问题
我通过以下命令将4个字节写入文件,并使用GNU工具链完成了拆解:
-bash$ echo -en '\x1f\x20\x03\xd5' > ./myFile -bash$ aarch64-none-linux-gnu-objdump -m AARCH64 -b binary -D ./myFile
执行结果:
./myFile: file format binary Disassembly of section .data: 0000000000000000 <.data>: 0: d503201f nop
注意,myFile并非标准ELF文件或目标文件,但GNU objdump仍可完成拆解。
请问如何使用llvm-objdump实现类似操作?我执行如下命令时出现报错:
-bash$ llvm-objdump --arch=arm64 -D x .../llvm-16.0.4/bin/llvm-objdump: error: 'x': The file was not recognized as a valid object file
此外,使用ARM的armclang、armasm或fromelf是否可实现该需求?
解决方案
一、使用llvm-objdump拆解二进制文件
llvm-objdump需要显式指定文件格式为二进制,同时指定目标架构,正确命令如下:
llvm-objdump --arch=arm64 --file-format=binary -D ./myFile
也可以使用简写参数,和GNU objdump的参数风格保持一致:
llvm-objdump -m arm64 -b binary -D ./myFile
执行后即可得到和GNU objdump一致的指令拆解结果。
二、使用ARM工具链实现需求
1. fromelf(直接拆解)
ARM的fromelf工具支持直接处理原始二进制文件,命令格式如下:
fromelf --disassemble --architecture=AArch64 ./myFile
该命令会直接解析二进制字节流并输出对应的AArch64指令。
2. armclang+armasm(间接方式)
如果需要通过armclang和armasm组合处理,可按以下步骤操作:
- 创建汇编源文件(如
bytes.s),将目标字节以汇编伪指令定义:
.section .data .byte 0x1f, 0x20, 0x03, 0xd5
- 使用armasm汇编生成目标文件:
armasm -cpu cortex-a53 -o bytes.o bytes.s
- 再用fromelf拆解目标文件:
fromelf --disassemble bytes.o
这种方式相对繁琐,仅适用于需要将二进制字节整合到汇编流程中的场景,直接使用fromelf效率更高。
内容的提问来源于stack exchange,提问作者Lance E.T. Compte
相关产品推荐
相关产品推荐

