linker: move last section id constant to c-code

Move creation of last section id from ld linker script LONG() usage to
C code with last section attribute.

The use of `LONG()` works correctly with ld but lld emits a warning
because .last_section section is not allocated as there are no matching
input sections and discards the `LONG()` call, meaning the last section
identifier will not be present in the flash.
> ld.lld: warning: ignoring memory region assignment for
>                             non-allocatable section '.last_section'

Placing the last section id in `.last_section` in C code makes lld
allocate the memory for the id and thereby create the output section
with the correct output.

Signed-off-by: Torsten Rasmussen <Torsten.Rasmussen@nordicsemi.no>
This commit is contained in:
Torsten Rasmussen 2025-04-23 15:07:12 +02:00 committed by Benjamin Cabé
commit c79c4ef9a8
8 changed files with 30 additions and 30 deletions

View file

@ -366,11 +366,9 @@ GROUP_END(OCM)
/* Must be last in romable region */ /* Must be last in romable region */
SECTION_PROLOGUE(.last_section,,) SECTION_PROLOGUE(.last_section,,)
{ {
#ifdef CONFIG_LINKER_LAST_SECTION_ID /* .last_section contains a fixed word to ensure location counter and actual
/* Fill last section with a word to ensure location counter and actual rom * rom region data usage match when CONFIG_LINKER_LAST_SECTION_ID=y. */
* region data usage match. */ KEEP(*(.last_section))
LONG(CONFIG_LINKER_LAST_SECTION_ID_PATTERN)
#endif
} GROUP_LINK_IN(ROMABLE_REGION) } GROUP_LINK_IN(ROMABLE_REGION)
/* To provide the image size as a const expression, /* To provide the image size as a const expression,

View file

@ -412,11 +412,9 @@ GROUP_END(DTCM)
/* Must be last in romable region */ /* Must be last in romable region */
SECTION_PROLOGUE(.last_section,,) SECTION_PROLOGUE(.last_section,,)
{ {
#ifdef CONFIG_LINKER_LAST_SECTION_ID /* .last_section contains a fixed word to ensure location counter and actual
/* Fill last section with a word to ensure location counter and actual rom * rom region data usage match when CONFIG_LINKER_LAST_SECTION_ID=y. */
* region data usage match. */ KEEP(*(.last_section))
LONG(CONFIG_LINKER_LAST_SECTION_ID_PATTERN)
#endif
} GROUP_LINK_IN(ROMABLE_REGION) } GROUP_LINK_IN(ROMABLE_REGION)
/* To provide the image size as a const expression, /* To provide the image size as a const expression,

View file

@ -351,11 +351,9 @@ SECTIONS
/* Must be last in romable region */ /* Must be last in romable region */
SECTION_PROLOGUE(.last_section,,) SECTION_PROLOGUE(.last_section,,)
{ {
#ifdef CONFIG_LINKER_LAST_SECTION_ID /* .last_section contains a fixed word to ensure location counter and actual
/* Fill last section with a word to ensure location counter and actual rom * rom region data usage match when CONFIG_LINKER_LAST_SECTION_ID=y. */
* region data usage match. */ KEEP(*(.last_section))
LONG(CONFIG_LINKER_LAST_SECTION_ID_PATTERN)
#endif
} GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION) } GROUP_ROM_LINK_IN(RAMABLE_REGION, ROMABLE_REGION)
/* To provide the image size as a const expression, /* To provide the image size as a const expression,

View file

@ -454,15 +454,13 @@ GROUP_END(DTCM)
/* Must be last in romable region */ /* Must be last in romable region */
SECTION_PROLOGUE(.last_section,,) SECTION_PROLOGUE(.last_section,,)
{ {
#ifdef CONFIG_LINKER_LAST_SECTION_ID /* .last_section contains a fixed word to ensure location counter and actual
/* Fill last section with a word to ensure location counter and actual rom * rom region data usage match when CONFIG_LINKER_LAST_SECTION_ID=y. */
* region data usage match. */ KEEP(*(.last_section))
LONG(CONFIG_LINKER_LAST_SECTION_ID_PATTERN)
/* __rom_region_size is used when configuring the PMP entry of the ROM region. /* __rom_region_size is used when configuring the PMP entry of the ROM region.
* Addresses (pmpaddr) in PMP registers need to be aligned to 4. Align * Addresses (pmpaddr) in PMP registers need to be aligned to 4. Align
* __rom_region_size to 4 to meet that requirement. */ * __rom_region_size to 4 to meet that requirement. */
MPU_MIN_SIZE_ALIGN MPU_MIN_SIZE_ALIGN
#endif
} GROUP_LINK_IN(ROMABLE_REGION) } GROUP_LINK_IN(ROMABLE_REGION)
/* To provide the image size as a const expression, /* To provide the image size as a const expression,

View file

@ -28,3 +28,5 @@ zephyr_library_include_directories(
${ZEPHYR_BASE}/kernel/include ${ZEPHYR_BASE}/kernel/include
${ZEPHYR_BASE}/arch/${ARCH}/include ${ZEPHYR_BASE}/arch/${ARCH}/include
) )
zephyr_sources_ifdef(CONFIG_LINKER_LAST_SECTION_ID last_section_id.c)

View file

@ -0,0 +1,10 @@
/*
* Copyright (C) 2025, Nordic Semiconductor ASA
*
* SPDX-License-Identifier: Apache-2.0
*
*/
#include <zephyr/types.h>
static uint32_t last_id __attribute__((section(".last_section"))) __attribute__((__used__)) =
CONFIG_LINKER_LAST_SECTION_ID_PATTERN;

View file

@ -421,11 +421,9 @@ GROUP_END(DTCM)
/* Must be last in romable region */ /* Must be last in romable region */
SECTION_PROLOGUE(.last_section,,) SECTION_PROLOGUE(.last_section,,)
{ {
#ifdef CONFIG_LINKER_LAST_SECTION_ID /* .last_section contains a fixed word to ensure location counter and actual
/* Fill last section with a word to ensure location counter and actual rom * rom region data usage match when CONFIG_LINKER_LAST_SECTION_ID=y. */
* region data usage match. */ KEEP(*(.last_section))
LONG(CONFIG_LINKER_LAST_SECTION_ID_PATTERN)
#endif
} GROUP_LINK_IN(ROMABLE_REGION) } GROUP_LINK_IN(ROMABLE_REGION)
/* Because ROMABLE_REGION != RAMABLE_REGION in XIP-system, it is valid /* Because ROMABLE_REGION != RAMABLE_REGION in XIP-system, it is valid

View file

@ -466,11 +466,9 @@ GROUP_END(DTCM)
/* Must be last in romable region */ /* Must be last in romable region */
SECTION_PROLOGUE(.last_section,,) SECTION_PROLOGUE(.last_section,,)
{ {
#ifdef CONFIG_LINKER_LAST_SECTION_ID /* .last_section contains a fixed word to ensure location counter and actual
/* Fill last section with a word to ensure location counter and actual rom * rom region data usage match when CONFIG_LINKER_LAST_SECTION_ID=y. */
* region data usage match. */ KEEP(*(.last_section))
LONG(CONFIG_LINKER_LAST_SECTION_ID_PATTERN)
#endif
} GROUP_LINK_IN(ROMABLE_REGION) } GROUP_LINK_IN(ROMABLE_REGION)
/* To provide the image size as a const expression, /* To provide the image size as a const expression,