如何让keil编译生成bin文件与反汇编文件?
1.bin文件和反汇编dis文件的作用与帮助
1. BIN 文件 (二进制镜像文件)
-
本质: 编译器(如Keil ARMCC或Clang)生成的纯二进制文件,包含处理器可以直接执行的机器码指令和初始化数据(全局变量初始值)。
-
作用与功能:
-
固件本体: 这是最终要烧录到嵌入式设备目标闪存(Flash)中的文件。它就是设备上电后CPU开始执行的实际代码。
-
直接执行: 文件格式非常简单(通常是纯二进制数据流,没有复杂的头信息),可以直接被Bootloader或烧录工具解析并写入芯片的特定地址(通常是0x00000000或其他由链接脚本指定的起始地址)。
-
存储效率: 只包含必需的可执行代码和数据,体积最小化,节省宝贵的Flash空间。
-
部署与量产: 是发布固件更新、进行设备量产烧录的标准格式。
-
-
对嵌入式工程的帮助:
- 最终交付物: 是软件开发的最终输出,直接决定了设备的功能。
- 烧录依据: 烧录工具(J-Link, ST-Link, 量产烧录器等)操作的核心对象。
- 固件升级: OTA(空中升级)或通过串口/USB升级时传输的就是BIN文件。
- 版本管理: 归档的BIN文件代表了特定版本的固件。
2. DIS 文件 (反汇编列表文件)
-
本质: 由编译器或链接器生成的一个文本文件。它将BIN文件中的二进制机器码“翻译”回人类可读的汇编语言指令,并通常包含丰富的关联信息。
-
作用与功能:
- 机器码到汇编的映射: 最核心的功能。显示每个内存地址上的二进制数据对应的汇编指令是什么。
- 地址关联: 清晰显示指令、数据在最终内存映射(由链接器决定)中的绝对地址或相对地址。
- 源码关联 (通常): 高级的DIS文件(如Keil生成时勾选相应选项)会在汇编指令旁边或中间穿插对应的C/C++源代码行。这是极其重要的调试信息。
- 符号信息: 显示函数名、全局变量名及其地址。
- 常量数据: 显示程序中定义的常量(如字符串常量、查找表)在内存中的位置和内容。
-
对嵌入式工程的帮助 (主要在开发调试阶段):
-
深度调试:
- 崩溃分析: 当程序崩溃(HardFault, 死机)时,通过查看CPU寄存器(如PC程序计数器、LR链接寄存器、SP堆栈指针)的值,在DIS文件中定位到崩溃点对应的汇编指令和(如果有)源代码行,是分析死机原因的最基本手段。
- 指令级单步: 在调试器中进行汇编级单步执行时,DIS文件是理解当前执行指令的上下文和含义的参考。
- 理解优化行为: 查看编译器如何将C/C++代码优化为最终的机器指令,理解性能优化的效果或某些“诡异”行为的根源。
- 分析异常行为: 当程序行为不符合预期,而高级语言调试无法定位时,查看反汇编可以揭示底层细节(如寄存器操作、内存访问)。
-
链接脚本验证: 检查代码段(.text)、数据段(.data, .bss)、常量段(.rodata)等是否按链接脚本的预期被放置到了正确的地址范围。
-
代码大小优化分析: 精确查看每个函数编译后占用了多少字节的机器码,识别占用空间大的函数进行优化。
-
理解启动代码/底层初始化: 分析芯片上电后最先执行的启动代码(startup_*.s或等效)的具体行为。
-
逆向工程(自身代码): 当没有源代码或需要理解编译后代码的确切行为时(虽然通常有源码,但在复杂优化或分析库代码时有用)。
-
中断处理分析: 查看中断服务例程的入口和出口代码。
-
特性 | BIN 文件 | DIS 文件 (反汇编列表) |
---|---|---|
格式 | 纯二进制 文本 | (通常为 .dis, .lst, .map 或类似) |
内容 | 机器码、初始化数据 | 汇编指令、地址、符号、(通常)关联的源代码行 |
主要用途 | 烧录执行 - 部署到目标设备Flash | 分析调试 - 理解、排查、优化代码底层行为 |
使用者 | 烧录工具、Bootloader、目标设备CPU | 工程师 (开发者、调试员) |
工程阶段 | 贯穿始终 | (最终部署核心) 主要在开发、调试、测试阶段 (问题排查核心工具) |
关键价值 | 让设备运行起来 | 理解设备为何如此运行 (尤其当运行出错时) |
关系 | DIS 文件是 BIN 文件的人类可读“翻译”和注释 | BIN 文件是 DIS 文件描述内容的二进制表示 |
2.让keil编译生成bin文件与反汇编文件
fromelf --bin --output=bootloader.bin Objects\led_c.axf
上面的bootloader.bin改成你需要生成的bin文件名称,Objects\led_c.axf需要选择你工程对应的axf文件路径
fromelf --text -a -c --output=led.dis Objects\led_c.axf
dis反汇编文件同理
3.注意事项
第一次编译先点击全局编译,确保工程生成产生axf,否则将会报错