| From 8266618ca2aa08c19836f2c97967de55bfa098c7 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Thu, 15 Jul 2021 15:37:16 +0800 |
| Subject: Kbuild: lto: fix module versionings mismatch in GNU make 3.X |
| |
| From: Lecopzer Chen <lecopzer.chen@mediatek.com> |
| |
| [ Upstream commit 1d11053dc63094075bf9e4809fffd3bb5e72f9a6 ] |
| |
| When building modules(CONFIG_...=m), I found some of module versions |
| are incorrect and set to 0. |
| This can be found in build log for first clean build which shows |
| |
| WARNING: EXPORT symbol "XXXX" [drivers/XXX/XXX.ko] version generation failed, |
| symbol will not be versioned. |
| |
| But in second build(incremental build), the WARNING disappeared and the |
| module version becomes valid CRC and make someone who want to change |
| modules without updating kernel image can't insert their modules. |
| |
| The problematic code is |
| + $(foreach n, $(filter-out FORCE,$^), \ |
| + $(if $(wildcard $(n).symversions), \ |
| + ; cat $(n).symversions >> $@.symversions)) |
| |
| For example: |
| rm -f fs/notify/built-in.a.symversions ; rm -f fs/notify/built-in.a; \ |
| llvm-ar cDPrST fs/notify/built-in.a fs/notify/fsnotify.o \ |
| fs/notify/notification.o fs/notify/group.o ... |
| |
| `foreach n` shows nothing to `cat` into $(n).symversions because |
| `if $(wildcard $(n).symversions)` return nothing, but actually |
| they do exist during this line was executed. |
| |
| -rw-r--r-- 1 root root 168580 Jun 13 19:10 fs/notify/fsnotify.o |
| -rw-r--r-- 1 root root 111 Jun 13 19:10 fs/notify/fsnotify.o.symversions |
| |
| The reason is the $(n).symversions are generated at runtime, but |
| Makefile wildcard function expends and checks the file exist or not |
| during parsing the Makefile. |
| |
| Thus fix this by use `test` shell command to check the file |
| existence in runtime. |
| |
| Rebase from both: |
| 1. [https://lore.kernel.org/lkml/20210616080252.32046-1-lecopzer.chen@mediatek.com/] |
| 2. [https://lore.kernel.org/lkml/20210702032943.7865-1-lecopzer.chen@mediatek.com/] |
| |
| Fixes: 38e891849003 ("kbuild: lto: fix module versioning") |
| Co-developed-by: Sami Tolvanen <samitolvanen@google.com> |
| Signed-off-by: Lecopzer Chen <lecopzer.chen@mediatek.com> |
| Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| scripts/Makefile.build | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| diff --git a/scripts/Makefile.build b/scripts/Makefile.build |
| index 34d257653fb4..c6bd62f518ff 100644 |
| --- a/scripts/Makefile.build |
| +++ b/scripts/Makefile.build |
| @@ -388,7 +388,7 @@ ifeq ($(CONFIG_LTO_CLANG) $(CONFIG_MODVERSIONS),y y) |
| cmd_update_lto_symversions = \ |
| rm -f $@.symversions \ |
| $(foreach n, $(filter-out FORCE,$^), \ |
| - $(if $(wildcard $(n).symversions), \ |
| + $(if $(shell test -s $(n).symversions && echo y), \ |
| ; cat $(n).symversions >> $@.symversions)) |
| else |
| cmd_update_lto_symversions = echo >/dev/null |
| -- |
| 2.30.2 |
| |