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:
parent
8f2560cf3e
commit
c79c4ef9a8
8 changed files with 30 additions and 30 deletions
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)
|
||||||
|
|
10
lib/utils/last_section_id.c
Normal file
10
lib/utils/last_section_id.c
Normal 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;
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue