Browse Source

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>
pull/89675/head
Torsten Rasmussen 3 months ago committed by Benjamin Cabé
parent
commit
c79c4ef9a8
  1. 8
      include/zephyr/arch/arm/cortex_a_r/scripts/linker.ld
  2. 8
      include/zephyr/arch/arm/cortex_m/scripts/linker.ld
  3. 8
      include/zephyr/arch/arm64/scripts/linker.ld
  4. 8
      include/zephyr/arch/riscv/common/linker.ld
  5. 2
      lib/utils/CMakeLists.txt
  6. 10
      lib/utils/last_section_id.c
  7. 8
      soc/andestech/ae350/linker.ld
  8. 8
      soc/infineon/cat1b/cyw20829/linker.ld

8
include/zephyr/arch/arm/cortex_a_r/scripts/linker.ld

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

8
include/zephyr/arch/arm/cortex_m/scripts/linker.ld

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

8
include/zephyr/arch/arm64/scripts/linker.ld

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

8
include/zephyr/arch/riscv/common/linker.ld

@ -454,15 +454,13 @@ GROUP_END(DTCM) @@ -454,15 +454,13 @@ GROUP_END(DTCM)
/* Must be last in romable region */
SECTION_PROLOGUE(.last_section,,)
{
#ifdef CONFIG_LINKER_LAST_SECTION_ID
/* Fill last section with a word to ensure location counter and actual rom
* region data usage match. */
LONG(CONFIG_LINKER_LAST_SECTION_ID_PATTERN)
/* .last_section contains a fixed word to ensure location counter and actual
* rom region data usage match when CONFIG_LINKER_LAST_SECTION_ID=y. */
KEEP(*(.last_section))
/* __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
* __rom_region_size to 4 to meet that requirement. */
MPU_MIN_SIZE_ALIGN
#endif
} GROUP_LINK_IN(ROMABLE_REGION)
/* To provide the image size as a const expression,

2
lib/utils/CMakeLists.txt

@ -28,3 +28,5 @@ zephyr_library_include_directories( @@ -28,3 +28,5 @@ zephyr_library_include_directories(
${ZEPHYR_BASE}/kernel/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

@ -0,0 +1,10 @@ @@ -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;

8
soc/andestech/ae350/linker.ld

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

8
soc/infineon/cat1b/cyw20829/linker.ld

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

Loading…
Cancel
Save