- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在 LPCXpresso (eclipse-based) 中开发 C 程序Windows 7 上的工具链,一个带有 gcc 的 IDE,目标是 NXP Cortex M3 微处理器。它提供了一种通过 JTAG 对微处理器进行编译-链接-编程的简单方法。构建的结果是一个由调试配置加载的 AXF 文件(ELF 格式)。
加载的程序驻留在闪存中从 0x00000 到 0x3FFFB。我想在 0x3FFFC 处包含一个 4 字节的 CRC-32 以在启动时验证程序。我添加了另一个部分并使用 gcc __attribute__
指令访问该内存位置。
uint32_t crc32_build __attribute__ ((section(".text_MFlashCRC")));
要计算和存储 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
这会创建一个带有校验和(引导加载程序必需)的二进制文件,然后计算所用闪存的 CRC,将 CRC 值存储在 0x3FFFC。
但是,我认为我无法使用调试器加载二进制文件。 LPCXpresso 有一个内置的编程实用程序,可以加载修改后的二进制文件,但是,这不允许我调试。我相信我可以尝试使用“仅附加”模式使用原始 AXF 文件启动调试 session ,但是,这会变得很麻烦。
我已经能够使用 readelf 检查 AXF 文件中的 crc32_build
变量。有没有办法编辑 AXF 文件中的变量?是否有行业标准方法将 CRC 作为构建后步骤插入?
最佳答案
据我所知,没有行业标准。有多种技术可以做到这一点。我建议您使用 crc32_build
作为“C”中的 extern
并通过链接器脚本定义它。例如,
$ cat ld.script
.text : {
_start_crc_region = .;
*(.text);
_end_crc_region = .;
crc32_build = .;
LONG(CALC_CRC);
}
您将值 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
我使用这种技术为图像添加数字签名;它应该同样适用于 crc 值。链接描述文件允许您定位变量,这对于 CRC 等完整性检查通常很重要,但对于简单的校验和无关紧要。链接描述文件还允许您为区域的开始和结束定义符号。如果没有脚本,您需要一些 Sprite 自省(introspection)。
您当然可以扩展这个想法以包括初始数据 和其他分配的部分。在某些时候,您需要使用 objcopy
来提取部分并在构建时进行完整性检查。这些部分可能有各种对齐约束,在进行构建时 crc 计算时,您需要在主机上模拟这一点(在上面的 phony.bin 中)。
作为奖励,当您生成 srec 文件时,一切都已经完成。
如果您在使用 --defsym
时遇到问题,您可以使用 sed、awk 预处理 ld.script 、perl、python 等,并用 CALC_CRC 所在的十六进制值替换文本。
关于c - 将 CRC 存储到 AXF/ELF 文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24150030/
我是 arm 架构的新手,我从事嵌入式软件方面的工作,并试图了解我的项目二进制文件的调试文件夹中存在的 .axf 文件。 发现它是链接器在构建过程中生成的arm可执行格式文件,用于调试崩溃。所以很明显
我已经使用 Keil uVision5 为目标 STM32F103VE 创建了一个 hex 文件,但我无法生成 hex。这是错误日志。(我已经彻底搜索了答案): linking... FromELF:
我正在使用 gcc 和 armclang(arm 编译器 6)将几个库编译(并链接)到一个可执行文件 (elf/axf) 中。是否有适用于这两个文件的代码大小分析工具?问题是: map 文件以不同的方
我目前正在 LPCXpresso (eclipse-based) 中开发 C 程序Windows 7 上的工具链,一个带有 gcc 的 IDE,目标是 NXP Cortex M3 微处理器。它提供了一
您好,我正在尝试编译我的程序,但总是出现此链接器错误: .\_build\ble_app_hids_keyboard.axf: Error: L6200E: Symbol UX_captureStar
我是一名优秀的程序员,十分优秀!