如何为MCU将数据插入已编译的二进制文件

如何为MCU将数据插入已编译的二进制文件,c,linker,microcontroller,ld,linker-scripts,C,Linker,Microcontroller,Ld,Linker Scripts,我正在尝试将我的二进制文件的一部分的md5哈希插入到二进制文件中,以便跟踪MCU FW版本 我是这样处理的: 在链接脚本中,我将flash分为两部分 MEMORY {

我正在尝试将我的二进制文件的一部分的md5哈希插入到二进制文件中,以便跟踪MCU FW版本

我是这样处理的: 在链接脚本中,我将flash分为两部分

MEMORY                                                                                                  
{                                                                                                       
FLASH0 (rx)      : ORIGIN = 0x8000000, LENGTH = 64K - 16                                                
FLASH1 (r)       : ORIGIN = 0x800FFF0, LENGTH = 16                                                      
RAM (xrw)      : ORIGIN = 0x20000000, LENGTH = 8K                                                       
} 
然后我指定了一个输出部分,如下所示:

  .fw_version :                                                                                         
  {                                                                                                     
    KEEP(*(.fw_version))                                                                                
  } >FLASH1
接下来,我的固件\u version.c文件仅包含:

#define FW_VERSION_SIZE 16                                                                              

const unsigned char FW_VERSION[FW_VERSION_SIZE]                                                         
  __attribute__((section(".fw_version"), used)) = {0};
然后在编译二进制文件并使用objcopy创建.bin文件后,我有一个65536b的大文件,我将该文件拆分为65520字节,对第一部分进行md5校验和,然后将其插入第二部分(16b)。最后我做了
cat parta partb>final.bin

当我用hextump检查这个二进制文件时,我可以看到md5校验和确实在末尾。 使用
objdump-h
我得到:

...
8 .fw_version   00000010  0800fff0  0800fff0  00017ff0  2**2
...
objdump-t
给出:

...
0800fff0 g     O .fw_version    00000010 FW_VERSION
...
我认为这意味着我可以使用
FW_VERSION[I]
从mcu FW中获取md5校验和的第一部分,但当我检查gdb中的内存时,我发现它已经全部归零,好像从未更改过一样

我错过了什么


[编辑]该设备是通过gdb编程的stm32f030c8t6 arm cortex m0。

就像我在问题下的评论一样,我发现它不工作的(一)原因是,当我使用gdb编程时,在加载.elf文件的同时操作.bin文件。 如果我使用程序员或引导加载程序将.bin文件下载到目标系统,它应该(可以)起作用

不过我找到了一个更好的方法

  • 将项目中的所有源代码编译为.o文件
  • cat*.o>/tmp/tmp.something\u独特。我在Makefile中使用了$(shell mktemp)
  • openssl dgst-md5-binary/tmp/tmp.something_unique>version_文件
  • objcopy-I binary-O elf32 littleram-B arm版本_文件v_文件.O
  • linkscript有一个节
    .fw\u version:{KEEP(v\u file.o(.data))}>FLASH1
  • 链接应用程序
  • 在应用程序中,通过执行
    extern unsigned char\u binary\u version\u file\u start获取版本号的地址;uint8_t*FW_VERSION=&u二进制_VERSION_file_start;常量大小FW版本大小=(大小t)和二进制版本文件大小。请注意,
    的用法是正确的
    这将导致校验和接管从源代码编译的所有对象,然后将校验和链接到目标中闪烁的二进制文件。

    什么设备以及如何将代码编程到芯片中?您的评论使我意识到,在修改.bin文件的同时,我加载了未修改的.elf向gdb提交文件。