我目前正在研究Windows 7上的LPCXpresso(基于eclipse的)工具链中的C程序,这是一个针对NXP Cortex M3微处理器的gcc IDE.它提供了一种通过JTAG对微处理器进行编译链接编程的简单方法.构建的结果是由调试配置加载的AXF文件(ELF格式).
加载的程序驻留在闪存中,从0x00000到0x3FFFB.我想在0x3FFFC处包含一个4字节的CRC-32,以便在启动时验证程序.我添加了另一节,并使用gcc __attribute__指令访问该内存位置.
uint32_t crc32_build __attribute__ ((section(".text_MFlashCRC")));
Run Code Online (Sandbox Code Playgroud)
为了计算和存储CRC-32值,我的计划是使用SRecord以及以下的构建后步骤:
arm-none-eabi-size "${BuildArtifactFileName}"
arm-none-eabi-objcopy -O binary "${BuildArtifactFileName}" "${BuildArtifactFileBaseName}.bin"
checksum -p ${TargetChip} -d "${BuildArtifactFileBaseName}.bin"
../util/srec_cat "${BuildArtifactFileBaseName}.bin" -binary -crop 0 0x3FFFC -fill 0xFF 0x00000 0x3FFFC -crc32-b-e 0x3FFFC -o "${BuildArtifactFileBaseName}.crc.bin" -binary
echo ""
echo "CRC32:"
../util/srec_cat "${BuildArtifactFileBaseName}.crc.bin" -binary -crop 0x3FFFC 0x40000 -o - -hex-dump
Run Code Online (Sandbox Code Playgroud)
这将创建一个带校验和的二进制文件(引导加载程序所必需的),然后在使用的闪存上计算CRC,将CRC值存储在0x3FFFC.
但是,我不认为我可以使用调试器加载二进制文件.有一个内置的编程实用程序与LPCXpresso可以加载修改后的二进制文件,但是,这不允许我调试.我相信我可以尝试使用"仅附加"模式启动与原始AXF文件的调试会话,但这会变得很麻烦.
我已经能够使用readelf来检查crc32_buildAXF文件中的变量.有没有办法在AXF文件中编辑变量?是否有行业标准方法将CRC作为构建后步骤插入?
art*_*ise 11
没有我所知道的行业标准。有多种技术可以做到这一点。我建议您在“C”中使用crc32_buildas anextern并通过链接器脚本定义它。例如,
$ cat ld.script
.text : {
_start_crc_region = .;
*(.text);
crc32_build = .;
LONG(CALC_CRC);
_end_crc_region = .;
}
Run Code Online (Sandbox Code Playgroud)
您在CALC_CRC第一次调用时将该值作为零传递,然后与该值集重新链接。例如,
$ ld --defsym=CALC_CRC=0 -T ld.script *.o -o phony.elf
$ objcopy -j sections phony.elf -o phony.bin # sections means checksum 'areas'
$ ld --defsym=CALC_CRC=`crc32 phony.bin` -T ld.script *.o -o target.elf
Run Code Online (Sandbox Code Playgroud)
我使用这种技术为图像添加数字签名;它应该同样适用于crc值。链接描述文件允许您定位变量,这对于 CRC 等完整性检查通常很重要,但对于简单的校验和则无关紧要。链接描述文件还允许您为区域的开始和结束定义符号。没有脚本,你需要一些小精灵的内省。
您当然可以扩展这个想法以包括初始化数据和其他分配的部分。在某些时候,您需要使用objcopy提取部分并在构建时进行完整性检查。这些部分可能有各种对齐约束,在进行构建时间crc计算时,您需要在主机上模拟这一点(在上面的phony.bin 中)。
作为奖励,当您生成srec文件时,一切都已经完成。
如果你有麻烦--defsym,你可以预先处理ld.script用的sed,awk的,perl的,蟒蛇等,并替代文本用十六进制值,其中CALC_CRC是。
| 归档时间: |
|
| 查看次数: |
6465 次 |
| 最近记录: |