当前位置: 首页 > news >正文

如何让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++源代码行。这是极其重要的调试信息。
    • 符号信息: 显示函数名、全局变量名及其地址。
    • 常量数据: 显示程序中定义的常量(如字符串常量、查找表)在内存中的位置和内容。
  • 对嵌入式工程的帮助 (主要在开发调试阶段):

    • 深度调试:

      1. 崩溃分析: 当程序崩溃(HardFault, 死机)时,通过查看CPU寄存器(如PC程序计数器、LR链接寄存器、SP堆栈指针)的值,在DIS文件中定位到崩溃点对应的汇编指令和(如果有)源代码行,是分析死机原因的最基本手段。
      2. 指令级单步: 在调试器中进行汇编级单步执行时,DIS文件是理解当前执行指令的上下文和含义的参考。
      3. 理解优化行为: 查看编译器如何将C/C++代码优化为最终的机器指令,理解性能优化的效果或某些“诡异”行为的根源。
      4. 分析异常行为: 当程序行为不符合预期,而高级语言调试无法定位时,查看反汇编可以揭示底层细节(如寄存器操作、内存访问)。
    • 链接脚本验证: 检查代码段(.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,否则将会报错
在这里插入图片描述

http://www.dtcms.com/a/320102.html

相关文章:

  • 机器学习:线性回归
  • Win10桌面从默认C盘改到D盘
  • 小红书开源多模态视觉语言模型DOTS-VLM1
  • 深入剖析React框架原理:从虚拟DOM到Fiber架构
  • PCA9541调试记录
  • 软考中级【网络工程师】第6版教材 第2章 数据通信基础(下)
  • ansible 操作家族(ansible_os_family)信息
  • 网页中 MetaMask 钱包钱包交互核心功能详解
  • Redis缓存数据库深度剖析
  • ESXI7.0添加标准交换机过程
  • 通过CNN、LSTM、CNN-LSTM及SSA-CNN-LSTM模型对数据进行预测,并进行全面的性能对比与可视化分析
  • [Oracle] DECODE()函数
  • [Oracle] GREATEST()函数
  • GCC与NLP实战:编译技术赋能自然语言处理
  • Kubernetes(k8s)之Service服务
  • 【C语言】深入理解编译与链接过程
  • Java中的反射机制
  • 【AxureMost落葵网】企业ERP项目原型-免费
  • 上位机知识篇篇---驱动
  • Xvfb虚拟屏幕(Linux)中文入门篇1:(wikipedia摘要,适当改写)
  • 函数、方法和计算属性
  • 计网学习笔记第3章 数据链路层(灰灰题库)
  • [激光原理与应用-169]:测量仪器 - 能量型 - 光功率计(功率稳定性监测)
  • 记录:rk3568适配开源GPU驱动(panfrost)
  • Linux中Docker Swarm实践
  • 12-netty基础-手写rpc-编解码-04
  • ubuntu 2024 安装拼音输入法
  • 【macOS操作系统部署开源DeepSeek大模型,搭建Agent平台,构建私有化RAG知识库完整流程】
  • Linux综合练习2
  • 电气设备与互感器全解析