Skip to content
  • Lecopzer Chen's avatar
    Kbuild: lto: fix module versionings mismatch in GNU make 3.X · 1d11053d
    Lecopzer Chen authored
    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: 38e89184
    
     ("kbuild: lto: fix module versioning")
    Co-developed-by: default avatarSami Tolvanen <samitolvanen@google.com>
    Signed-off-by: default avatarLecopzer Chen <lecopzer.chen@mediatek.com>
    Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
    1d11053d