linker: Add devnull memory for cortex_m and riscv32
Added memory region which is intended to be removed from the final binary but may be using in byproduct to extract data used by the host tools (e.g. strings used by logging). Add devnull region to Cortex-M and RISCV linker scripts. Signed-off-by: Krzysztof Chruściński <krzysztof.chruscinski@nordicsemi.no>
This commit is contained in:
parent
0fe6c72d40
commit
dfb3674c4c
4 changed files with 108 additions and 1 deletions
|
@ -306,6 +306,24 @@ config LINKER_USE_RELAX
|
|||
|
||||
endmenu # "Linker Sections"
|
||||
|
||||
config LINKER_DEVNULL_SUPPORT
|
||||
bool
|
||||
default y if CPU_CORTEX_M || (RISCV && !64BIT)
|
||||
|
||||
config LINKER_DEVNULL_MEMORY
|
||||
bool "Devnull region"
|
||||
depends on LINKER_DEVNULL_SUPPORT
|
||||
help
|
||||
Devnull region is created. It is stripped from final binary but remains
|
||||
in byproduct elf file.
|
||||
|
||||
config LINKER_DEVNULL_MEMORY_SIZE
|
||||
int "Devnull region size"
|
||||
depends on LINKER_DEVNULL_MEMORY
|
||||
default 262144
|
||||
help
|
||||
Size can be adjusted so it fits all data placed in that region.
|
||||
|
||||
endmenu
|
||||
|
||||
menu "Compiler Options"
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#if CONFIG_FLASH_LOAD_SIZE > 0
|
||||
#define ROM_SIZE CONFIG_FLASH_LOAD_SIZE
|
||||
#else
|
||||
#define ROM_SIZE (CONFIG_FLASH_SIZE*1K - CONFIG_FLASH_LOAD_OFFSET)
|
||||
#define ROM_SIZE (CONFIG_FLASH_SIZE * 1024 - CONFIG_FLASH_LOAD_OFFSET)
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_XIP)
|
||||
|
@ -75,10 +75,15 @@ _region_min_align = 4;
|
|||
. = ALIGN(_region_min_align)
|
||||
#endif
|
||||
|
||||
#include <zephyr/linker/linker-devnull.h>
|
||||
|
||||
MEMORY
|
||||
{
|
||||
FLASH (rx) : ORIGIN = ROM_ADDR, LENGTH = ROM_SIZE
|
||||
RAM (wx) : ORIGIN = RAM_ADDR, LENGTH = RAM_SIZE
|
||||
#if defined(CONFIG_LINKER_DEVNULL_MEMORY)
|
||||
DEVNULL_ROM (rx) : ORIGIN = DEVNULL_ADDR, LENGTH = DEVNULL_SIZE
|
||||
#endif
|
||||
LINKER_DT_REGIONS()
|
||||
/* Used by and documented in include/linker/intlist.ld */
|
||||
IDT_LIST (wx) : ORIGIN = 0xFFFFF7FF, LENGTH = 2K
|
||||
|
|
|
@ -72,6 +72,8 @@
|
|||
#define MPU_ALIGN(region_size) . = ALIGN(4)
|
||||
#endif
|
||||
|
||||
#include <zephyr/linker/linker-devnull.h>
|
||||
|
||||
MEMORY
|
||||
{
|
||||
#ifdef CONFIG_XIP
|
||||
|
@ -79,6 +81,10 @@ MEMORY
|
|||
#endif
|
||||
RAM (rwx) : ORIGIN = RAM_BASE, LENGTH = RAM_SIZE
|
||||
|
||||
#if defined(CONFIG_LINKER_DEVNULL_MEMORY)
|
||||
DEVNULL_ROM (rx) : ORIGIN = DEVNULL_ADDR, LENGTH = DEVNULL_SIZE
|
||||
#endif
|
||||
|
||||
LINKER_DT_REGIONS()
|
||||
|
||||
/* Used by and documented in include/linker/intlist.ld */
|
||||
|
|
78
include/zephyr/linker/linker-devnull.h
Normal file
78
include/zephyr/linker/linker-devnull.h
Normal file
|
@ -0,0 +1,78 @@
|
|||
/*
|
||||
* Copyright (c) 2023 Nordic Semiconductor ASA
|
||||
*
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
/*
|
||||
* DESCRIPTION
|
||||
* Platform independent set of macros for creating a memory segment for
|
||||
* aggregating data that shall be kept in the elf file but not in the binary.
|
||||
*/
|
||||
|
||||
#ifndef ZEPHYR_INCLUDE_LINKER_LINKER_DEVNULL_H_
|
||||
|
||||
#if defined(CONFIG_LINKER_DEVNULL_MEMORY)
|
||||
|
||||
#if defined(CONFIG_XIP)
|
||||
#if (!defined(ROM_ADDR) && !defined(ROM_BASE)) || !defined(ROM_SIZE)
|
||||
#error "ROM_SIZE, ROM_ADDR or ROM_BASE not defined"
|
||||
#endif
|
||||
#endif /* CONFIG_XIP */
|
||||
|
||||
#if (!defined(RAM_ADDR) && !defined(RAM_BASE)) || !defined(RAM_SIZE)
|
||||
#error "RAM_SIZE, RAM_ADDR or RAM_BASE not defined"
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_XIP) && !defined(ROM_ADDR)
|
||||
#define ROM_ADDR ROM_BASE
|
||||
#endif
|
||||
|
||||
#if !defined(RAM_ADDR)
|
||||
#define RAM_ADDR RAM_BASE
|
||||
#endif
|
||||
|
||||
#define ROM_END_ADDR (ROM_ADDR + ROM_SIZE)
|
||||
#define DEVNULL_SIZE CONFIG_LINKER_DEVNULL_MEMORY_SIZE
|
||||
#define ROM_DEVNULL_END_ADDR (ROM_END_ADDR + DEVNULL_SIZE)
|
||||
#define MAX_ADDR UINT32_MAX
|
||||
|
||||
/* Determine where to put the devnull region. It should be adjacent to the ROM
|
||||
* region. If ROM starts after RAM or the distance between ROM and RAM is big
|
||||
* enough to fit the devnull region then devnull region is placed just after
|
||||
* the ROM region. If it cannot be done then the devnull region is placed before
|
||||
* the ROM region. It is possible that the devnull region cannot be placed
|
||||
* adjacent to the ROM (e.g. ROM starts at 0 and RAM follows ROM). In that
|
||||
* case compilation fails and the devnull region is not supported in that
|
||||
* configuration.
|
||||
*/
|
||||
#if !defined(CONFIG_XIP)
|
||||
|
||||
#if RAM_ADDR >= DEVNULL_SIZE
|
||||
#define DEVNULL_ADDR (RAM_ADDR - DEVNULL_SIZE)
|
||||
#else
|
||||
#define DEVNULL_ADDR (RAM_ADDR + RAM_SIZE)
|
||||
#endif
|
||||
|
||||
#else /* CONFIG_XIP */
|
||||
|
||||
#if ((ROM_ADDR > RAM_ADDR) && ((MAX_ADDR - ROM_END_ADDR) >= DEVNULL_SIZE)) || \
|
||||
((ROM_END_ADDR + DEVNULL_SIZE) <= RAM_ADDR)
|
||||
#define DEVNULL_ADDR ROM_END_ADDR
|
||||
#elif ROM_ADDR > DEVNULL_SIZE
|
||||
#define DEVNULL_ADDR (ROM_ADDR - DEVNULL_SIZE)
|
||||
#else
|
||||
#error "Cannot place devnull segment adjacent to ROM region."
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_LINKER_DEVNULL_MEMORY)
|
||||
#define DEVNULL_REGION DEVNULL_ROM
|
||||
#else
|
||||
#define DEVNULL_REGION ROMABLE_REGION
|
||||
#endif
|
||||
|
||||
#endif /* CONFIG_XIP */
|
||||
|
||||
#endif /* CONFIG_LINKER_DEVNULL_MEMORY */
|
||||
|
||||
#endif /* ZEPHYR_INCLUDE_LINKER_LINKER_DEVNULL_H_ */
|
Loading…
Add table
Add a link
Reference in a new issue