回答

收藏

如何使用ielftool ELF格式文件处理工具?

#其他 #其他 3199 人阅读 | 0 人回复 | 2021-04-07

本帖最后由 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为所支持的命令选项,如下:


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

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


分割成多个bin文件

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


区域填充

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

我们可以在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文件,在转换时,根据上述命令所指定的地址区域和字节进行填充。


生成Checksum

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

但是如果要对多个区域生成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命令用于强制保留定义的符号,指示链接器不要进行优化而将其丢弃。

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

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$"

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


总结

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


分享到:
回复

使用道具 举报

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

本版积分规则

关闭

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