查看: 1985|回复: 0

[原创] 如何使用ielftool ELF格式文件处理工具?

[复制链接]
  • TA的每日心情
    开心
    2023-6-12 14:34
  • 签到天数: 165 天

    连续签到: 1 天

    [LV.7]常住居民III

    发表于 2021-4-7 10:37:54 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 satoll 于 2021-4-7 13:57 编辑

    ielftool是IAR提供的一个软件工具,可以从构建生成的ELF执行文件生成bin、Hex、S-records等烧写格式文件,还可以对ROM区域的数据生成CRC校验。ielftool还是一个开源的软件,用户可以修改源码,实现额外的功能。

    ielftool的执行程序在IAR安装路径下的\arm\bin目录中,我们可以通过下面的命令格式调用ielftool:

    ielftool [options] inputfile outputfile [options]

    其中,inputfile是链接器生成的ELF执行文件,即要进行操作的文件;outputfile是经过处理之后得到的文件,可以是ELF,或者Hex等烧写格式文件;options为所支持的命令选项,如下:

    1.png
    生成bin/hex/S-records烧写格式

    用于从ELF执行文件得到用于固件烧写用的bin、Hex等格式的文件。使用--bin命令选项可以生成bin文件,--ihex生成32位地址的Hex格式文件,--srec生成S-records格式文件。从ELF格式生成Hex格式文件示例:

    2.png 3.png
    分割成多个bin文件

    如果硬件上除了内置Flash之外还有外扩Flash,可以使用--bin-multi来生成多个bin文件,方便进行烧写。否则只是生成一个bin文件的话,有可能会得到一个巨大的文件(bin文件没有地址信息,所以多个Flash之间需要进行数据填充以保证后续地址的准确)。


    区域填充

    使用--fill命令可以对指定的地址区域进行数据填充,例如需要进行checksum计算或者一些特定场合需要将未使用的flash区域填充确认内容。

    4.png 5.png

    我们可以在IAR的Build-Actions中的Post-build输入ielftool命令让IAR在每次构建之后自动执行填充,例如:

    ielftool --fill 0x00;0x00-0x1FFF --bin --verbose $TARGET_PATH$ $TARGET_BPATH$.bin

    其中--fill是填充命令,其后跟要填充的值(0x00),再后面是填充的地址范围(0x00-0x1FFF)。$TARGET_PATH$是主输出文件(.out)的完整路径, $TARGET_DIR$是主输出文件完整路径(不带扩展名)。--bin指定输出bin格式文件。--verbose记录所执行的操作,在build窗口输出。

    在工程的Options->Build Actions->Post-build command line中填入上面的命令,在代码构建完成之后,IAR自动调用ielftool工具将.out文件转换成bin文件,在转换时,根据上述命令所指定的地址区域和字节进行填充。

    6.png
    生成Checksum

    1、IAR可以在工程的Options中通过图形界面选择一个Flash区域进行CRC校验计算。

    7.png

    但是如果要对多个区域生成CRC校验,或者多个区域生成多个CRC校验,那么就需要使用ielftool来操作了,方法如下。

    首先在工程的Options->Link->Extra Options中使用--place_holder命令在Flash中预留两个位置,用于存放生成的checksum。--place_holder的命令格式如下:

    --place_holder symbol[,size[,section[,alignment]]]

    symbol:要创建的符号名称;

    size:要保留的字节数,默认是4字节;

    section:使用的section名,默认是.text;

    alignment:section对齐字节,默认是1。

    使用--place_holder保留checksum1和checksum2的存储空间:

    --place_holder __checksum1,2,.checksum1,1

    --place_holder __checksum2,2,.checksum2,1

    定义checksum1和checksum2的起止地址符号,指示要进行checksum计算的地址区域:

     --define_symbol __checksum_begin1=0x08000000

     --define_symbol __checksum_end1=0x08000140

     --define_symbol __checksum_begin2=0x08000150

     --define_symbol __checksum_end2=0x0800058F

    --keep __checksum1

    --keep __checksum2

    --keep命令用于强制保留定义的符号,指示链接器不要进行优化而将其丢弃。

    8.png

    2、修改链接器脚本文件(*icf)指定.checksum1和.checksum2的存储位置。如果不指定,则由链接器自动安排,要获取checksum的值需要通过链接生成的map文件查找。checksum1和.checksum2的地址,进而进行读取。但最好还是将其存储在指定位置。

    9.png

    3、在工程Options-> Build Actions->Post-build commmand line中输入以下命令:

    ielftool --fill 0xFF;__checksum_begin1-__checksum_end1 --fill 0xFF;__checksum_begin2-__checksum_end2 --checksum __checksum1:2,crc16,0x0;__checksum_begin1-__checksum_end1 --checksum __checksum2:2,crc16,0x0;__checksum_begin2-__checksum_end2 --verbose "$TARGET_PATH$" "$TARGET_PATH$"

    10.png

    这样就会对指定的两个Flash区域分别生成CRC校验,并保存到Flash的最后。


    总结

    以上是对ielftool软件工具几个常用的功能介绍,它还有一些实用的功能,用户可以参考IAR的C/C++开发手册中的有关ielftool命令的详细说明。


    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /5 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-12-19 18:00 , Processed in 0.119156 second(s), 16 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.