From cb69bb9caaf55b499fd573482f5039d52859872d Mon Sep 17 00:00:00 2001 From: Daniele Lacamera Date: Thu, 19 Mar 2026 23:41:49 +0100 Subject: [PATCH] Fix embedded images built with the clang compiler --- arch.mk | 5 ++++- test-app/Makefile | 14 +++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/arch.mk b/arch.mk index a9de6d9e0f..18d82ebf72 100644 --- a/arch.mk +++ b/arch.mk @@ -1282,7 +1282,9 @@ ifeq ($(USE_CLANG),1) CLANG_NEWLIB_INCLUDE?=$(abspath $(dir $(CLANG_LIBC_A))/../include) CC=$(CLANG_DRIVER) - LD=$(CLANG_DRIVER) + # Keep clang for compilation, but use the GNU linker driver so linker-script + # LMAs for RAM sections are preserved and objcopy does not emit sparse images. + LD=$(CLANG_GCC_NAME) AS=$(CLANG_DRIVER) AR=$(CROSS_COMPILE)ar OBJCOPY?=$(CROSS_COMPILE)objcopy @@ -1290,6 +1292,7 @@ ifeq ($(USE_CLANG),1) CFLAGS+=-isystem $(CLANG_NEWLIB_INCLUDE) CFLAGS+=-DWOLFSSL_NO_ATOMIC -DWOLFSSL_NO_ATOMICS + CFLAGS+=-Wno-unknown-attributes -Wno-error=unknown-attributes LDFLAGS+=-nostdlib endif diff --git a/test-app/Makefile b/test-app/Makefile index 1d0b1e5ad5..2d8bdbdd91 100644 --- a/test-app/Makefile +++ b/test-app/Makefile @@ -102,6 +102,14 @@ LDFLAGS+=-T $(LSCRIPT) -Wl,-gc-sections -Wl,-Map=image.map -nostartfiles # Setup default objcopy flags OBJCOPY_FLAGS+=--gap-fill $(FILL_BYTE) +OBJCOPY_IMAGE_FLAGS:= + +ifeq ($(USE_CLANG),1) + # Clang-built ARM ELFs can keep RAM sections as loadable segments, and raw + # objcopy output then expands the flash-to-RAM gap into a huge sparse image. + # The app image only needs the flash-backed output sections. + OBJCOPY_IMAGE_FLAGS+=-j .text -j .edidx +endif ifeq ($(DEBUG_UART),1) CFLAGS+=-DDEBUG_UART @@ -899,15 +907,15 @@ delta-extra-data:LDFLAGS=-Wl,-Map=image.map image.bin: image.elf @echo "\t[BIN] $@" - $(Q)$(OBJCOPY) $(OBJCOPY_FLAGS) -O binary $^ $@ + $(Q)$(OBJCOPY) $(OBJCOPY_FLAGS) $(OBJCOPY_IMAGE_FLAGS) -O binary $^ $@ image.hex: image.elf @echo "\t[HEX] $@" - $(Q)$(OBJCOPY) $(OBJCOPY_FLAGS) -O ihex $^ $@ + $(Q)$(OBJCOPY) $(OBJCOPY_FLAGS) $(OBJCOPY_IMAGE_FLAGS) -O ihex $^ $@ image.srec: image.elf @echo "\t[SREC] $@" - $(Q)$(OBJCOPY) $(OBJCOPY_FLAGS) -O srec $^ $@ + $(Q)$(OBJCOPY) $(OBJCOPY_FLAGS) $(OBJCOPY_IMAGE_FLAGS) -O srec $^ $@ APP_OBJS := $(patsubst $(WOLFBOOT_LIB_WOLFSSL)/%, \ $(WOLFSSL_LOCAL_OBJDIR)/%, $(APP_OBJS))