Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1439,11 +1439,13 @@ set(KEYGEN_TOOL ${KEYGEN_TOOL} CACHE INTERNAL "")

list(APPEND WOLFBOOT_INCLUDE_DIRS ${WOLFBOOT_ROOT} ${WOLFBOOT_ROOT}/include)

# set default linker script
set(WOLFBOOT_LSCRIPT_TEMPLATE hal/${WOLFBOOT_TARGET}.ld)
# Partition trailers in sectors 1-2, see hal/stm32f4.c
if(WOLFBOOT_TARGET STREQUAL "stm32f4" AND CUSTOM_PARTITION_TRAILER)
set(WOLFBOOT_LSCRIPT_TEMPLATE hal/stm32f4-trailer.ld)
# set default linker script; a user-provided WOLFBOOT_LSCRIPT_TEMPLATE wins
if(NOT DEFINED WOLFBOOT_LSCRIPT_TEMPLATE)
set(WOLFBOOT_LSCRIPT_TEMPLATE hal/${WOLFBOOT_TARGET}.ld)
# Partition trailers in sectors 1-2, see hal/stm32f4.c
if(WOLFBOOT_TARGET STREQUAL "stm32f4" AND CUSTOM_PARTITION_TRAILER)
set(WOLFBOOT_LSCRIPT_TEMPLATE hal/stm32f4-trailer.ld)
endif()
endif()

#---------------------------------------------------------------------------------------------
Expand Down
25 changes: 22 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,12 @@ LDFLAGS:=
SECURE_LDFLAGS:=
LD_START_GROUP:=-Wl,--start-group
LD_END_GROUP:=-Wl,--end-group
LSCRIPT_IN?=hal/$(TARGET).ld
# Linker script: capture the user value (command line, environment, .config)
# here; target defaults in arch.mk/options.mk/board.mk use the
# LSCRIPT_IN_DEFAULT helper (see tools/config.mk), which only assigns when
# LSCRIPT_IN is undefined or empty, so a user value wins. Last-resort
# default is applied after options.mk below.
LSCRIPT_IN_USER:=$(LSCRIPT_IN)
L2SRAM_ADDR?=0xF8F00000
V?=0
DEBUG?=0
Expand Down Expand Up @@ -272,6 +277,14 @@ WOLFBOOT_TARGET_BUILD=1
# Parse config options
include options.mk

# Last-resort linker script for targets without a dedicated default in
# arch.mk/options.mk/board.mk; a user-provided LSCRIPT_IN wins over both.
# An empty value (e.g. an LSCRIPT_IN?= persisted by an older 'make config')
# counts as unset.
ifeq ($(strip $(LSCRIPT_IN)),)
LSCRIPT_IN:=hal/$(TARGET).ld
endif
Comment thread
danielinux marked this conversation as resolved.
Resolved

OBJS+=$(WOLFCRYPT_OBJS)
OBJS+=$(PUBLIC_KEY_OBJS)
OBJS+=$(WOLFHSM_OBJS)
Expand Down Expand Up @@ -350,7 +363,10 @@ ifeq ($(USE_ARMCLANG),1)
LDFLAGS:=$(ARMCLANG_LDFLAGS) --map --list=wolfboot.map
LDFLAGS+=$(LDFLAGS_EXTRA)
LSCRIPT:=config/target.sct
LSCRIPT_IN:=hal/$(TARGET).sct
# ARMClang needs a .sct scatter file; a user-provided LSCRIPT_IN wins.
ifeq ($(LSCRIPT_IN_USER),)
LSCRIPT_IN:=hal/$(TARGET).sct
endif
LSCRIPT_FLAGS:=--scatter=$(LSCRIPT)
LD_START_GROUP:=
LD_END_GROUP:=
Expand Down Expand Up @@ -563,7 +579,10 @@ stage1: stage1/loader_stage1.bin
stage1/loader_stage1.bin: wolfboot.elf
stage1/loader_stage1.bin: FORCE
@echo "\t[BIN] $@"
$(Q)$(MAKE) -C $(dir $@) $(notdir $@)
# A user-provided LSCRIPT_IN is relative to the repo root; the recursive
# make runs from stage1/, so pass it as an absolute path. Target-derived
# stage1 defaults keep their own selection (nothing is passed).
$(Q)$(MAKE) -C $(dir $@) $(notdir $@) $(if $(LSCRIPT_IN_USER),LSCRIPT_IN=$(abspath $(LSCRIPT_IN_USER)))
Comment thread
danielinux marked this conversation as resolved.
Resolved

libwolfboot.a: include/target.h $(OBJS)
@echo "\t[LIB] $@"
Expand Down
88 changes: 50 additions & 38 deletions arch.mk
Original file line number Diff line number Diff line change
Expand Up @@ -109,7 +109,7 @@ ifeq ($(ARCH),AARCH64)
ZYNQMP_PSU_INIT_DIR?=hal/board/zynqmp
CFLAGS+=-DWOLFBOOT_ZYNQMP_FSBL
CFLAGS+=-Ihal/zynqmp -I$(ZYNQMP_PSU_INIT_DIR)
LSCRIPT_IN=hal/zynqmp_ocm.ld
$(call LSCRIPT_IN_DEFAULT,hal/zynqmp_ocm.ld)
OBJS+=hal/zynqmp_psu_shim.o
OBJS+=hal/zynqmp_atf.o
OBJS+=$(ZYNQMP_PSU_INIT_DIR)/psu_init_gpl.o
Expand Down Expand Up @@ -510,7 +510,7 @@ ifeq ($(ARCH),ARM)
SPI_TARGET=stm32
# Partition trailers in sectors 1-2, see hal/stm32f4.c
ifeq ($(CUSTOM_PARTITION_TRAILER),1)
LSCRIPT_IN=hal/stm32f4-trailer.ld
$(call LSCRIPT_IN_DEFAULT,hal/stm32f4-trailer.ld)
endif
endif

Expand Down Expand Up @@ -682,7 +682,7 @@ ifeq ($(ARCH),ARM)
WOLFBOOT_ORIGIN=0x0C000000
else
WOLFBOOT_ORIGIN=0x08000000
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
endif

Expand All @@ -694,7 +694,7 @@ ifeq ($(ARCH),ARM)
WOLFBOOT_ORIGIN=0x0C000000
else
WOLFBOOT_ORIGIN=0x08000000
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
SPI_TARGET=stm32
endif
Expand All @@ -704,7 +704,7 @@ ifeq ($(ARCH),ARM)
CFLAGS+=-Ihal
ARCH_FLASH_OFFSET=0x08000000
WOLFBOOT_ORIGIN=0x08000000
LSCRIPT_IN=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
SPI_TARGET=stm32
endif

Expand All @@ -713,7 +713,7 @@ ifeq ($(ARCH),ARM)
CFLAGS+=-Ihal
ARCH_FLASH_OFFSET=0x08000000
WOLFBOOT_ORIGIN=0x08000000
LSCRIPT_IN=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
SPI_TARGET=stm32
endif

Expand All @@ -724,7 +724,7 @@ ifeq ($(ARCH),ARM)
# reached through the Secure SBUS alias, which the HAL derives from it.
ARCH_FLASH_OFFSET=0x12000000
WOLFBOOT_ORIGIN=0x12000000
LSCRIPT_IN=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
SPI_TARGET=psoc_c3
# Board wiring. Defaults match the PSOC Control C3 evaluation kit; override
# for another variant.
Expand Down Expand Up @@ -782,13 +782,13 @@ ifeq ($(ARCH),ARM)
BOOTLOADER_PARTITION_SIZE=$$(( ($(WOLFBOOT_PARTITION_BOOT_ADDRESS) | 0x10000000) - $(WOLFBOOT_ORIGIN) - 0x40))
endif
ifeq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-tz.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-tz.ld)
OBJS+=hal/psoc_e8_tz.o
# wolfHSM NVM in the RRAM user area, Secure.
WOLFBOOT_KEYVAULT_ADDRESS?=0x32040000
WOLFBOOT_KEYVAULT_SIZE?=0x10000
else
LSCRIPT_IN=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
endif
# Board wiring, defaulted for KIT_PSE84_AI.
PSOC_E8_UART_SCB?=2
Expand Down Expand Up @@ -830,7 +830,7 @@ ifeq ($(ARCH),ARM)
ARCH_FLASH_OFFSET=0x00000000
WOLFBOOT_ORIGIN=0x00000000
ifneq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
endif

Expand All @@ -842,7 +842,7 @@ ifeq ($(ARCH),ARM)
WOLFBOOT_ORIGIN=0x0C000000
else
WOLFBOOT_ORIGIN=0x08000000
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
SPI_TARGET=stm32
ifneq ($(DEBUG),0)
Expand All @@ -869,9 +869,9 @@ ifeq ($(ARCH),ARM)
ARCH_FLASH_OFFSET=0x10000000
WOLFBOOT_ORIGIN=0x10000000
ifeq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
else
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
SPI_TARGET=raspberrypi_pico
CFLAGS+=-DPICO_SDK_PATH=$(PICO_SDK_PATH)
Expand Down Expand Up @@ -1420,7 +1420,7 @@ ifeq ($(ARCH),RISCV64)
OBJS+=src/riscv_sbi.o
endif
# Use M-mode specific linker script
LSCRIPT_IN:=hal/$(TARGET)-m.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-m.ld)
# Boot mode 2: reserve the last eNVM page for the signed manifest the UBL
# stub verifies (hal/mpfs250-m.ld); `make wolfboot_envm_signed.bin` fills it.
ifeq ($(MPFS_ENVM_MANIFEST),1)
Expand Down Expand Up @@ -1458,7 +1458,7 @@ ifeq ($(ARCH),RISCV64)
CFLAGS+=-DWOLFBOOT_DUALBOOT
ifeq ($(MPFS_L2LIM),1)
# L2-LIM mode: wolfBoot in on-chip SRAM, loaded by HSS (no DDR)
LSCRIPT_IN:=hal/$(TARGET)-hss.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-hss.ld)
else
# DDR mode (default): full MMU and FDT support
CFLAGS+=-DMMU
Expand All @@ -1480,7 +1480,11 @@ ifeq ($(ARCH),RISCV64)
# Boot mode 2 UBL stub: LIM-resident, verifies the eNVM wolfBoot manifest
# in place and jumps; no update path (hal/mpfs250_ubl.c).
ifeq ($(TARGET),mpfs250_ubl)
LSCRIPT_IN:=hal/mpfs250_ubl.ld
# UBL stub has its own layout; overrides the generic M-mode default
# above (a user-provided LSCRIPT_IN still wins).
ifeq ($(LSCRIPT_IN_USER),)
LSCRIPT_IN:=hal/mpfs250_ubl.ld
endif
UPDATE_OBJS:=
# mcycle rate for hal_get_timer_us(): the stub runs at the reset clock
CFLAGS+=-DRISCV_SMODE_TIMER_FREQ=80000000UL
Expand Down Expand Up @@ -1709,7 +1713,7 @@ endif
ifeq ($(TARGET),mcxw)
CORTEX_M33=1
ifneq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
CFLAGS+=\
-I$(MCUXPRESSO_DRIVERS) \
Expand Down Expand Up @@ -1762,7 +1766,7 @@ endif
ifeq ($(TARGET),mcxn)
CORTEX_M33=1
ifneq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
CFLAGS+=\
-I$(MCUXPRESSO_DRIVERS) \
Expand Down Expand Up @@ -1817,7 +1821,7 @@ ifeq ($(TARGET),rw612)
CORTEX_M33=1
ARCH_FLASH_OFFSET=0x08000000
ifneq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
MCUXPRESSO_FLASH_CONFIG?=$(MCUXPRESSO_PROJECT_TEMPLATE)/../flash_config
CFLAGS+=\
Expand Down Expand Up @@ -1858,13 +1862,13 @@ endif

ifeq ($(TARGET),nrf5340)
ifneq ($(TZEN), 1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
endif

ifeq ($(TARGET),nrf54l)
ifneq ($(TZEN), 1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
endif

Expand Down Expand Up @@ -1926,9 +1930,9 @@ ifeq ($(TARGET),imx_rt)
endif

ifeq ($(TARGET_IMX_HAB),1)
LSCRIPT_IN:=hal/$(TARGET)_hab.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)_hab.ld)
else
LSCRIPT_IN:=hal/$(TARGET).ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld)
endif

ifeq ($(MCUXPRESSO_CPU),MIMXRT1064DVL6A)
Expand Down Expand Up @@ -2251,7 +2255,7 @@ endif

ifeq ($(TARGET),lpc55s69)
ifneq ($(TZEN),1)
LSCRIPT_IN=hal/$(TARGET)-ns.ld
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET)-ns.ld)
endif
CFLAGS+=\
-I$(MCUXPRESSO_PROJECT_TEMPLATE) \
Expand Down Expand Up @@ -2459,9 +2463,9 @@ ifeq ("${FSP}", "1")
ifeq ($(filter-out $(STAGE1),1),)
# building stage1
ifeq ($(FSP_TGL), 1)
LSCRIPT_IN = ../hal/x86_fsp_tgl_stage1.ld
$(call LSCRIPT_IN_DEFAULT,../hal/x86_fsp_tgl_stage1.ld)
else
LSCRIPT_IN = ../hal/$(TARGET)_stage1.ld
$(call LSCRIPT_IN_DEFAULT,../hal/$(TARGET)_stage1.ld)
endif
# using ../wolfboot.map as stage1 is built from stage1 sub-directory
LDFLAGS = --defsym main=0x`nm ../wolfboot.elf | grep -w main | awk '{print $$1}'` \
Expand Down Expand Up @@ -2504,9 +2508,9 @@ ifeq ("${FSP}", "1")
else
# building wolfBoot
ifeq ($(FSP_TGL), 1)
LSCRIPT_IN = hal/x86_fsp_tgl.ld.in
$(call LSCRIPT_IN_DEFAULT,hal/x86_fsp_tgl.ld.in)
else
LSCRIPT_IN = hal/$(TARGET).ld.in
$(call LSCRIPT_IN_DEFAULT,hal/$(TARGET).ld.in)
endif
LDFLAGS = --gc-sections --entry=main -T $(LSCRIPT) -Map=wolfboot.map
CFLAGS += -fno-stack-protector -fno-PIC -fno-pie -mno-mmx -mno-sse -Os -DDEBUG_UART
Expand Down Expand Up @@ -2920,14 +2924,18 @@ ifeq ($(ARCH), AURIX)
# HighTec's ancient ARM ld cannot parse the BSP linker-script fragments.
# Flatten them at parse time with the wolfHSM port's ld-flatten.sh.
# Paths are relative to this arch.mk, which is included from both the
# wolfBoot root and test-app directories.
# wolfBoot root and test-app directories. A user-provided LSCRIPT_IN
# is used as-is; only the stock HAL script goes through the flattener
# (its output lands in config/).
ARCHMK_DIR:=$(dir $(lastword $(MAKEFILE_LIST)))
LSCRIPT_IN=$(ARCHMK_DIR)config/$(TARGET)_flat.ld
ifeq ($(filter clean keysclean,$(MAKECMDGOALS)),)
LD_FLATTEN_OUT:=$(shell $(WOLFHSM_INFINEON_TC3XX)/tchsm-server/ld-flatten.sh \
$(ARCHMK_DIR)hal/$(TARGET).ld $(LSCRIPT_IN) $(TC3_DIR)/tc3 && echo OK)
ifneq ($(LD_FLATTEN_OUT),OK)
$(error ld-flatten.sh failed for hal/$(TARGET).ld)
ifeq ($(LSCRIPT_IN),)
LSCRIPT_IN:=$(ARCHMK_DIR)config/$(TARGET)_flat.ld
ifeq ($(filter clean keysclean,$(MAKECMDGOALS)),)
LD_FLATTEN_OUT:=$(shell $(WOLFHSM_INFINEON_TC3XX)/tchsm-server/ld-flatten.sh \
$(ARCHMK_DIR)hal/$(TARGET).ld $(LSCRIPT_IN) $(TC3_DIR)/tc3 && echo OK)
ifneq ($(LD_FLATTEN_OUT),OK)
$(error ld-flatten.sh failed for hal/$(TARGET).ld)
endif
endif
endif
else ifeq ($(HT_LLVM),1)
Expand Down Expand Up @@ -3084,9 +3092,9 @@ ifeq ($(ARCH), AURIX)

# Linker scripts ship with the port, not in hal/.
ifeq ($(TARGET), aurix_tc4xx_csrm)
LSCRIPT_IN=$(TC4_WB_DIR)/csrm/aurix_tc4xx_csrm.ld
$(call LSCRIPT_IN_DEFAULT,$(TC4_WB_DIR)/csrm/aurix_tc4xx_csrm.ld)
else
LSCRIPT_IN=$(TC4_WB_DIR)/aurix_tc4xx.ld
$(call LSCRIPT_IN_DEFAULT,$(TC4_WB_DIR)/aurix_tc4xx.ld)
endif
CFLAGS += \
-I$(TC4_LLD_DIR) \
Expand Down Expand Up @@ -3193,7 +3201,11 @@ ifeq ($(ARCH), AURIX)
# Full-system CSRM wolfBoot target leaves host release to tchsm-server.
ifeq ($(AURIX_TC4_FULLSYS),1)
CFLAGS += -DWOLFBOOT_AURIX_TC4XX_FULLSYS
LSCRIPT_IN=$(TC4_WB_DIR)/csrm/aurix_tc4xx_csrm_fullsys.ld
# Full-system layout overrides the per-port default above; a
# user-provided LSCRIPT_IN still wins.
ifeq ($(LSCRIPT_IN_USER),)
LSCRIPT_IN:=$(TC4_WB_DIR)/csrm/aurix_tc4xx_csrm_fullsys.ld
endif
endif
endif

Expand Down
2 changes: 1 addition & 1 deletion config/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,5 @@ config:
rm -f ../config/target.ld
rm -f ../.config
rm -f ../include/target.h
@$(foreach q, $(CONFIG_VARS), a=$($q); echo -n $q \? [$$a] :; a=$($q); read SH_$q; test -z $$SH_$q && SH_$q=$$a; echo "$q?=$$SH_$q" >> ../.config;)
@$(foreach q, $(CONFIG_VARS), a=$($q); echo -n $q \? [$$a] :; a=$($q); read SH_$q; test -z $$SH_$q && SH_$q=$$a; test -n "$$SH_$q" && echo "$q?=$$SH_$q" >> ../.config;)

25 changes: 25 additions & 0 deletions docs/compile.md
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,31 @@ trailer sector of room on top — see the sizing guide in
[firmware_update.md](firmware_update.md#independent-partition-sizing).
Not supported with `ENCRYPT` or `PULL_LINKER_DEFINES`.

### Custom linker script

Each target ships a linker script (e.g. `hal/stm32f4.ld`) that is selected by
the build system based on the target and active options (TZEN, encryption,
trailers, ...). To use your own script instead, set `LSCRIPT_IN` to its path,
either in the .config file, in the environment, or on the make command line:
Comment thread
danielinux marked this conversation as resolved.
Resolved

```sh
make TARGET=stm32f4 LSCRIPT_IN=/path/to/my.ld
```

A user-provided `LSCRIPT_IN` wins over the target-specific default; when unset,
the build falls back to the script of the target, then to `hal/$(TARGET).ld`.
The script is processed by the same substitution pipeline as the included ones,
so it can (and should) use the same `@PLACEHOLDERS@` (e.g.
`@WOLFBOOT_PARTITION_BOOT_ADDRESS@`, `@WOLFBOOT_PARTITION_SIZE@`,
`@ARCH_FLASH_OFFSET@`); the substituted output is written to `config/target.ld`.

Notes:

- With ARMClang (`USE_ARMCLANG=1`) the script must be a `.sct` scatter file.
- On two-stage targets (e.g. x86) the same script is used for both stages.
- The script must place the bootloader sections so that they fit the flash
geometry configured above; wolfBoot does not validate the layout.

## Bootloader features

A number of characteristics can be turned on/off during wolfBoot compilation. Bootloader size,
Expand Down
2 changes: 1 addition & 1 deletion hal/boards/stm32wb_nucleo/board.mk
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
ARCH_FLASH_OFFSET=0x08000000
LSCRIPT_IN=hal/stm32wb.ld
$(call LSCRIPT_IN_DEFAULT,hal/stm32wb.ld)

CFLAGS+=-DWHAL_CFG_NO_TIMEOUT

Expand Down
Loading
Loading