Adding a fixed value to an address using the linker file

0

I have an embedded system that I am designing using a GNU toolchain. One of the requirements is that it needs to calculate the checksum of the executable code (ROM) at runtime, and compare it to a known value. Depending on weather the calculated value is equal to the known value it will throw an error or not. I need to place the known value in flash memory( where my executable code is stored) in a way that won't change the executable code. AKA I cannot write the value to the flash in my executable code.

I know there are tools that can modify output files to place a checksum in a known address, but for IT reasons external tools are not an option. I decided to use the SHORT() command in the linker and just edit the linker to place the known checksum in a known address at write time. It is not working, and I do not know why.

Relevent Portions of the Linker Script I have:

MEMORY {
m_interrupts          (RX)  : ORIGIN = 0x00000000, LENGTH = 0x00000400
m_flash_config        (RX)  : ORIGIN = 0x00000400, LENGTH = 0x00000010
m_interrupts_ram      (RW)  : ORIGIN = 0x1FFF0000, LENGTH = 0x00000400
m_text                (RX)  : ORIGIN = 0x00000410, LENGTH = 0x000FFBE0
m_data                (RX)  : ORIGIN = 0x1FFF0400, LENGTH = 0x0000FC00
m_data_2              (RW)  : ORIGIN = 0x20000000, LENGTH = 0x00030000
}
SECTIONS
{
.text :
{
  . = ALIGN(4);
  *(.fill)
  *(.text)                 /* .text sections (code) */
  *(.text*)                /* .text* sections (code) */
  *(.rodata)               /* .rodata sections (constants, strings, etc.) */
  *(.rodata*)              /* .rodata* sections (constants, strings, etc.) */
  *(.glue_7)               /* glue arm to thumb code */
  *(.glue_7t)              /* glue thumb to arm code */
  *(.eh_frame)
  KEEP (*(.init))
  KEEP (*(.fini))
  . = ALIGN(4);
} > m_text
.... More similar sections
....down at the bottom right before stack/heap definition
__ChecksumStart = 0xFFFE0;

.checksum  : AT(__ChecksumStart)
{
. = ALIGN (0x4);
SHORT(0xABCD)
} > m_text

__ChecksumSize = SIZEOF(.checksum);
.heap :
{
  . = ALIGN(8);
  __end__ = .;
  PROVIDE(end = .);
  __HeapBase = .;
  . += HEAP_SIZE;
  __HeapLimit = .;
} > m_data_2

.stack :
{
  . = ALIGN(8);
  . += STACK_SIZE;
} > m_data_2

__StackTop   = ORIGIN(m_data_2) + LENGTH(m_data_2);
__StackLimit = __StackTop - STACK_SIZE;
PROVIDE(__stack = __StackTop);

.ARM.attributes 0 : { *(.ARM.attributes) }
} //end of SECTIONS block here

I should be able to look at location 0xFFFE0 in my executable code and see 0xABCD. I do not. I see 0xFFFFFFFF the default value. What do I need to change to make this work? I have looked at this tutorial to get this far

c
linker
embedded
gnu
asked on Stack Overflow Jun 27, 2017 by user1426923 • edited Jun 27, 2017 by user1426923

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0