Skip to main content
Associate II
July 1, 2024
Solved

Accessing a memory section defined in the linker script

  • July 1, 2024
  • 2 replies
  • 3772 views

[Apologies in advance if this question has been asked a thousand times. I just didn't know how to search to get the answer that I'm looking for.]

I defined a section in the linker script to store version information. However, I'm unable to figure out how to read this memory from the c/c++ code side. 

In the linker script, I defined it in the 2nd section after the .isr_vector, ie:

SECTIONS

{

/* The startup code goes first into FLASH */

.isr_vector :

{

. = ALIGN(4);

KEEP(*(.isr_vector)) /* Startup code */

. = ALIGN(4);

} >FLASH

/* Version Data Into Flash */

.version :

{

. = ALIGN(4);

KEEP(*(.version))

KEEP(*(.version*))

. = ALIGN(4);

} >FLASH

.

.

}

In the main.c, I was able to set the version by:

static const char version[] __attribute__((used)) __attribute__((section (".version"))) = "v0.1.0";

 

Elsewhere in the code, I want to get the version string. I tried the following but the debugger shows the memptr pointer is 0x0:

const char* __attribute__(( section(".version") )) memptr;

 

I know the version was written correctly as I confirmed by looking at the memory map using STMCubeProgerammer and the memory address of the ".version" is 0x8000298.

I don't want to hard code since that address can change. Any assistance is appreciated. Thanks.

Best answer by Kier

In the linker script:

_linker_label_referable_in_source = LOADADDR(.version);

 In your source:

 extern uint32_t _linker_label_referable_in_source;
 char* memptr = (char*)&_linker_label_referable_in_source;

 

2 replies

Tesla DeLorean
Guru
July 1, 2024

printf("%p\n", &memptr);

printf("%p\n", version);

printf("%p\n", &version[0]);

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
JohnnyBAuthor
Associate II
July 2, 2024

&version = 0x8000298

&memptr = 0x80002a0

 

Tesla DeLorean
Guru
July 2, 2024

Perhaps explain more clearly what it is you want to achieve by this

You can make different MEMORY locations the Linker can see and park things. You can shrink them, provide them with a fixed address basis. You can have the SECTIONS place content in specific memories. Currently it collects text, data and bss into FLASH so the startup.s code can later copy/initialize the statics in RAM. The Linker processes the script in a linear fashion, so ordering and placement are important.

You can use pointers within unused vector table entries to point to things that can move about, so you can find them within the binary image, say if you load on a PC via fopen(), fread(), etc.

The linker will fixup reference you have within your own C/C++ application.

I've indicated a way to relate the address reported in the .MAP to a pointer you can access from application space.

Tips, Buy me a coffee, or three.. PayPal VenmoUp vote any posts that you find helpful, it shows what's working..
KierBest answer
Associate II
July 2, 2024

In the linker script:

_linker_label_referable_in_source = LOADADDR(.version);

 In your source:

 extern uint32_t _linker_label_referable_in_source;
 char* memptr = (char*)&_linker_label_referable_in_source;