Search code examples
stm32elfobjdumpstm32cubeidestm32f7

How to update the section in ELF file, using a binary file


I am using stm32cubeIDE and trying to store crc at the end of binary for update purposes.I am using this method because otherwise the debug will not work and i have to mark the .crc region as NOLOAD to make debug works.

I have a CRC section at the end of the flash, that i have dedicated to store the CRC.

MEMORY
{
  RAM    (xrw)    : ORIGIN = 0x20000000,   LENGTH = 48K
  RAM2    (xrw)    : ORIGIN = 0x10000000,   LENGTH = 16K
  BOOT     (rx)    : ORIGIN = 0x8000000,   LENGTH = 40K
  FLASH    (rx)    : ORIGIN = 0x800A000,   LENGTH = 221172
  CRC      (rx)    : ORIGIN = 0x803FFFC,   LENGTH = 4
}
    .crc :
  {
    . = ALIGN(4);
    KEEP (*(.crc))         /* .version sections (constants, strings, etc.) */
    KEEP (*(.crc*))        /* .version* sections (constants, strings, etc.) */
    . = ALIGN(4);
  } >CRC

I have a binary file crc.bin that contains the CRC the content of the binary file is simple: ABAB ABAB

I have defined a const value so that crc section gets included in elf file:

__attribute__((section(".crc"), used))
const uint32_t crc_placeholder = 0xFFFFFFFF;

i am using these post build commands:

arm-none-eabi-objdump -h DS_TEST_ST433CCU.elf&&arm-none-eabi-objdump -s -j .crc DS_TEST_ST433CCU.elf&&arm-none-eabi-objcopy --update-section .crc=crc.bin DS_TEST_ST433CCU.elf&&arm-none-eabi-objdump -s -j .crc DS_TEST_ST433CCU.elf&&arm-none-eabi-objcopy  -O binary DS_TEST_ST433CCU.elf  DS_TEST_ST433CCU1.bin

following is the output of these command:

arm-none-eabi-objdump -h DS_TEST_ST433CCU.elf

DS_TEST_ST433CCU.elf:     file format elf32-littlearm

Sections:
Idx Name          Size      VMA       LMA       File off  Algn
  0 .isr_vector   0000018c  0800a000  0800a000  00001000  2**0
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  1 .text         0000daac  0800a190  0800a190  00001190  2**4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
  2 .rodata       00000628  08017c40  08017c40  0000ec40  2**3
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  3 .ARM.extab    00000000  08018268  08018268  00011000  2**0
                  CONTENTS
  4 .ARM          00000008  08018268  08018268  0000f268  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  5 .preinit_array 00000000  08018270  08018270  00011000  2**0
                  CONTENTS, ALLOC, LOAD, DATA
  6 .init_array   00000004  08018270  08018270  0000f270  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  7 .fini_array   00000004  08018274  08018274  0000f274  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
  8 .data         000001e0  20000000  08018278  00010000  2**2
                  CONTENTS, ALLOC, LOAD, DATA
  9 .bss          00002da8  200001e0  08018458  000101e0  2**2
                  ALLOC
 10 ._user_heap_stack 00000600  20002f88  08018458  00010f88  2**0
                  ALLOC
 11 .boot_app     00000000  08000000  08000000  00011000  2**0
                  CONTENTS
 12 .crc          00000004  0803fffc  0803fffc  00010ffc  2**2
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
 13 .ARM.attributes 00000030  00000000  00000000  00011000  2**0
                  CONTENTS, READONLY
 14 .debug_info   0001fa45  00000000  00000000  00011030  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 15 .debug_abbrev 00005211  00000000  00000000  00030a75  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 16 .debug_aranges 00001d98  00000000  00000000  00035c88  2**3
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 17 .debug_rnglists 00001685  00000000  00000000  00037a20  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 18 .debug_macro  00029dc0  00000000  00000000  000390a5  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 19 .debug_line   00020976  00000000  00000000  00062e65  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 20 .debug_str    000efcb8  00000000  00000000  000837db  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 21 .comment      00000043  00000000  00000000  00173493  2**0
                  CONTENTS, READONLY
 22 .debug_frame  00008dc8  00000000  00000000  001734d8  2**2
                  CONTENTS, READONLY, DEBUGGING, OCTETS
 23 .debug_line_str 0000005e  00000000  00000000  0017c2a0  2**0
                  CONTENTS, READONLY, DEBUGGING, OCTETS
arm-none-eabi-objdump -s -j .crc DS_TEST_ST433CCU.elf

DS_TEST_ST433CCU.elf:     file format elf32-littlearm

Contents of section .crc:
 803fffc ffffffff                             ....            
arm-none-eabi-objcopy --update-section .crc=crc.bin DS_TEST_ST433CCU.elf
arm-none-eabi-objdump -s -j .crc DS_TEST_ST433CCU.elf

DS_TEST_ST433CCU.elf:     file format elf32-littlearm

Contents of section .crc:
 803fffc 66666666 20666666 66                 abab abab       
arm-none-eabi-objcopy  -O binary DS_TEST_ST433CCU.elf  DS_TEST_ST433CCU1.bin

From where are these 66666666 20666666 66 getting in the elf file? and the final binary does not even contain abab abab.


Solution

  • 66666666 20666666 66 is literally the string ffff ffff - not hex, but rather those literal nine bytes with a space in the middle. Your crc.bin file should be exactly four bytes long and contain binary data, not ASCII text.