From ed15e3aee6dad95e3b173c598471970b2a0dc3ab 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 74663afa..40e60258 100644 --- a/arch.mk +++ b/arch.mk @@ -1288,7 +1288,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 @@ -1296,6 +1298,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 3a587951..7697e90b 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 @@ -913,15 +921,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))