[PATCH v2025.09.y 07/58] firmware: handle firmware files being links correctly
Ahmad Fatoum
a.fatoum at pengutronix.de
Fri Mar 13 06:24:51 PDT 2026
From: Sascha Hauer <s.hauer at pengutronix.de>
Sometimes firmware files can be links. When rebuilding barebox correctly
rebuilds the firmware when file the link points to is updated, but the
firmware is not rebuilt when the link itself is changed to link to
another file.
Fix this by including the sha256sum directly in the generated assembly
file by using .byte rather than generating a file containing the
binary sha256sum and include that using .incbin. This way the generated
assembly file for sure changes when the firmware file changes and it's
rebuilt when necessary (and not when it's not).
Reproducer:
export ARCH=arm
make imx_v8_defconfig
echo foo > firmware/foo
echo bar > firmware/bar
ln -sf foo firmware/imx8mm-bl31.bin
make
The following should rebuild the barebox image including the updated
firmware, but doesn't:
ln -sf bar firmware/imx8mm-bl31.bin
make
(cherry picked from commit 3065a332e49881a892e4a6230069bc3923952b18)
Reviewed-by: Ahmad Fatoum <a.fatoum at pengutronix.de>
Link: https://lore.barebox.org/20250917095834.2727068-1-s.hauer@pengutronix.de
Link: https://lore.barebox.org/20250917130505.2972322-1-s.hauer@pengutronix.de
Signed-off-by: Sascha Hauer <s.hauer at pengutronix.de>
---
firmware/Makefile | 23 ++++++++++++-----------
1 file changed, 12 insertions(+), 11 deletions(-)
diff --git a/firmware/Makefile b/firmware/Makefile
index 0c9da2996ffc..1fe770a2d900 100644
--- a/firmware/Makefile
+++ b/firmware/Makefile
@@ -57,6 +57,10 @@ FWSTR = $(subst /,_,$(subst .,_,$(subst -,_,$(FWNAME))))
FWNAME_EXISTS = $(if $(wildcard $(FIRMWARE_DIR)/$(FWNAME)),1,0)
filechk_fwbin = { \
+ SHA=$$(sha256sum $(FIRMWARE_DIR)/$(FWNAME) | \
+ sed 's/ .*$$//;s/../0x&, /g;s/, $$//') \
+ 2>/dev/null ;\
+ \
echo "/* Generated by $(src)/Makefile */" ;\
echo "\#include <asm-generic/pointer.h>" ;\
echo ".section .note.GNU-stack,\"\",%progbits" ;\
@@ -80,29 +84,26 @@ filechk_fwbin = { \
echo " .p2align ASM_LGPTR" ;\
echo ".global _fw_$(FWSTR)_sha_start" ;\
echo "_fw_$(FWSTR)_sha_start:" ;\
- echo " .incbin \"$(fwobjdir)/$(FWNAME).sha.bin\"" ;\
+ echo " .byte $${SHA}" ;\
echo ".global _fw_$(FWSTR)_sha_end" ;\
echo "_fw_$(FWSTR)_sha_end:" ;\
+ echo "\#if $(FWNAME_EXISTS)" ;\
+ echo ".if _fw_$(FWSTR)_sha_start + 32 - _fw_$(FWSTR)_sha_end";\
+ echo ".error \"sha256sum invalid\"" ;\
+ echo ".endif" ;\
+ echo "\#endif" ;\
}
filechk_fwbin_ext = { \
$(filechk_fwbin) ;\
}
-$(obj)/%.gen.S: $(obj)/%.sha.bin FORCE
+$(obj)/%.gen.S: FORCE
$(call filechk,fwbin,.rodata.$(FWSTR),)
-$(obj)/%.extgen.S: $(obj)/%.sha.bin FORCE
+$(obj)/%.extgen.S: FORCE
$(call filechk,fwbin_ext,.pblext.$(FWSTR),a)
-$(obj)/%.sha.bin: $(obj)/%.sum FORCE
- $(call if_changed,sha256bin)
-
-$(obj)/%.sum: FORCE
- $(if $(wildcard $(FIRMWARE_DIR)/$*), $(call if_changed,sha256sum,$(FIRMWARE_DIR)/$*), @touch $@)
-
-clean-files += *.sha.bin *.sum
-
# This dependency is used if missing firmware should fail the build immediately
fwdep-required-y = $(FIRMWARE_DIR)/%
# This dependency expands to nothing if the file doesn't exist. This allows
--
2.47.3
More information about the barebox
mailing list