如何从IAR编译生成的.bin文件获取.s汇编文件?
解决IAR生成的.bin文件反汇编及直接生成汇编文件的方法
一、直接从IAR编译时生成汇编文件(推荐)
很多人没找到IAR的汇编输出设置,其实藏在编译选项里:
- 单个源文件生成汇编:右键目标源文件 →
Options→ 切换到Output标签页 → 勾选Assembler output,在下拉菜单选择生成.s(纯汇编)或.lst(源码+汇编对照,更便于调试),设置输出路径后重新编译即可。 - 全局项目生成汇编:点击
Project→Options→ 切换到Compiler标签页 →Output子选项 → 在Output file下拉菜单选择Assembler listing,指定输出目录,这样所有源文件编译时都会生成对应的汇编文件。
如果需要带符号信息的完整汇编,建议保留IAR生成的.out或.elf目标文件,用IAR自带的ielfdump工具反汇编,命令如下:
ielfdump --disassemble prj.out > prj.s
这个工具能完美识别IAR的目标文件格式,反汇编结果包含函数名、变量名等符号,可读性远高于从.bin反汇编的结果。
二、仅用.bin文件反汇编的方法
.bin是纯二进制机器码,没有文件格式头、符号表和地址信息,所以gdb、objdump默认无法识别,必须手动指定架构和加载起始地址:
使用objdump反汇编(以ARM架构为例)
假设你的项目加载起始地址是0x08000000(比如STM32的Flash起始地址),执行以下命令:
objdump -m arm -b binary --adjust-vma=0x08000000 -d prj.bin > prj.s
参数说明:
-m arm:指定目标CPU架构(如果是Thumb指令集,改为-m thumb或-m armv7-m,根据实际芯片架构调整)-b binary:告知objdump当前文件是纯二进制格式--adjust-vma=0x08000000:设置二进制文件的加载起始地址,必须和项目链接脚本中指定的起始地址一致-d:反汇编可执行指令段
使用gdb临时查看汇编
如果只是临时查看部分指令,可通过gdb加载.bin文件并指定架构:
gdb -q (gdb) set architecture arm # 匹配你的CPU架构 (gdb) file prj.bin (gdb) add-symbol-file prj.bin 0x08000000 # 指定加载起始地址 (gdb) disas /r 0x08000000,+0x100 # 反汇编从0x08000000开始的256字节
注意:从.bin反汇编的结果没有任何符号信息,只能看到地址和指令,可读性较差,优先推荐从IAR直接生成汇编或用.out文件反汇编。
内容的提问来源于stack exchange,提问作者Sirghi Vladimir
相关产品推荐
相关产品推荐

