• Keil Assistant 插件 fromelf.exe路径报错及hex、bin、axf、elf文件之间关系


    VS Code使用Keil Assistant插件编译时出现fromelf.exe路径错误

    问题原因分析

    如图,今天在VS Code上尝试使用Keil Assistant插件进行MDK工程编译时出现错误:

    image-20221109163324345

    考虑报错的原因是fromelf.exe文件的路径错误,因为在第一次clone这个工程到本地并用keil编译时,IDE端也报了这个错误。

    解决方法

    而我之前就是参照网上的解决方法,大家都是在keil中修改Options for target->User->After Build/Rebuild内的路径:

    image-20221109163642102

    修改过后,如果使用Keil编译,后处理过程正常,bin文件可以正常生成。

    但是这次我已经修改过来,结果回到VS Code,还是没有办法执行后处理,依然报路径错误。

    这说明我们的修改仅限于IDE,并没有修改到工程配置文件,而调用配置文件的Keil Assistant插件因为配置信息没修改,依然执行错误的路径。

    然后我打开工程执行文件*.uvprojx,搜索刚刚错误的路径,找到了文件里默认记录的fromelf位置:

    image-20221109164849525

    修改位置,再次去VS Code执行编译下载,可以看到fromelf文件路径被修改正确,后处理执行成功:

    image-20221109165039404

    这也说明在我们修改IDE内的配置时,工程文件内该路径并没有被修改,可能修改信息被保存在本机工作区了,这的确很奇怪。

    另外,这里介绍一下 hex文件bin文件axf文件四者的关系:

    hex文件bin文件axf文件三者的关系

    axf文件、hex文件与bin文件都是可以运行在单片机上的,它们都存储了编译器根据源代码生成的机器码,根据应用场合的不同,它们又有所区别。

    • axf文件:包含调试信息。axf 文件不仅包含代码数据,而且还包含着调试信息,在MDK里进行debug调试用的就是这个文件。如在Keil环境使用Debug功能时,就是先将axf文件下载到芯片内,才能进行调试。还有J-Link的J-Scope功能时,也必须使用axf文件。
    • hex文件:包含地址信息。hex 文件是一种使用十六进制符号表示的代码记录, 记录了代码应该存储到 FLASH 的哪个地址,下载器可以根据这些信息辅助下载。
    • bin文件:最直接的代码映像。bin文件是根据axf文件生成的,是最小的可以运行的文件,其包含最直接的代码映像。

    三个文件包含的信息量如下表格:

    文件格式保存的信息
    axf (ARM Executable File)程序数据 + 地址、类型、校验等标记信息 + 调试信息
    hex (Intel Hex File)程序数据 + 地址、类型、校验等标记信息
    bin (Plain Binary File)程序数据

    一般来说,我们对嵌入式系统进行编程,程序编译下载的过程如下。可以看出bin文件和hex文件都是最后生成用来烧录进Flash的。

    img

    在keil中,axf文件是编译默认生成的文件,hex文件在MDK里要勾选选项才可以生成,而bin文件则就是通过上面所说的设置使用fromelf转换工具生成的。

    它们三者的大小关系是,这从他们包含的信息量也可以看出来:

    image-20221109170319222

    最后,既然说到fromelf,那就得说一下elf文件了。

    elf文件

    ELF(Executableand linking format)文件是x86 Linux系统下的一种常用目标文件(objectfile)格式,是由GCC编译器生成的。elf文件可以直接转换为hexbin,但hexbin不能转换回elf文件。

    综合上面所说的,elf文件可以转化为hex和bin两种文件,hex也可以直接转换为bin文件,但是bin要转化为hex文件必须要给定一个基地址。而hex和bin不能转化为elf文件,因为elf的信息量要大。

    简单的理解,elf文件将二进制(bin)文件和程序描述文件打包后的一种执行文件,下载到程序里的依然是bin文件的部分,但是仿真器可以依靠其余程序表述文件来获取程序执行的位置和二进制的对应。表意文件可以利用readelf在linux下读取,因为系统的原因就不赘述了。

    参考文献

    [1]: 一文看懂hex文件、bin文件、axf文件的区别

    [2]: bin、hex、elf、axf文件的区别

    [3]: MDK错误:After Build - User command #1: C:\Keil_v5\ARM\ARMCC\bin\fromelf.exe --bin -o …\Output

    [4]: Keil编译过程及程序在Flash和SRAM的空间分配

    [5]: 聊聊LiteOS中生成的Bin、HEX、ELF三种文件格式

  • 相关阅读:
    Numpy——老师PPT
    QMap之自定义Key和Value
    QT webengine显示HTML简单示例
    VS和QT联合开发
    我们简单的new了一个对象,JVM都做了哪些贡献?
    Leetcode 998.最大二叉树Ⅱ
    4基于pytorch的蚁群算法求解TSP(旅行商问题),访问一座城市并回到最初位置的最佳路径,解决组合中的NP问题。程序已调通,替换自己的数据可以直接运行。
    【计算机网络】HTTP/HTTPS协议基础知识汇总
    Elasticsearch集群连载-es集群安装
    驱动开发:内核枚举LoadImage映像回调
  • 原文地址:https://blog.csdn.net/qq_42059060/article/details/127774789