• Masahiro Yamada's avatar
    kbuild: avoid unneeded kallsyms step 3 · 04b8cb09
    Masahiro Yamada authored
    Since commit 951bcae6 ("kallsyms: Avoid weak references for kallsyms
    symbols"), the kallsyms step 3 always occurs.
    
    You can compare the build logs.
    
    [Before 951bcae6]
    
      $ git checkout 951bcae6^
      $ make defconfig all
           [ snip ]
        LD      .tmp_vmlinux.kallsyms1
        NM      .tmp_vmlinux.kallsyms1.syms
        KSYMS   .tmp_vmlinux.kallsyms1.S
        AS      .tmp_vmlinux.kallsyms1.S
        LD      .tmp_vmlinux.kallsyms2
        NM      .tmp_vmlinux.kallsyms2.syms
        KSYMS   .tmp_vmlinux.kallsyms2.S
        AS      .tmp_vmlinux.kallsyms2.S
        LD      vmlinux
    
    [After 951bcae6]
    
      $ git checkout 951bcae6
      $ make defconfig all
           [ snip ]
        LD      .tmp_vmlinux.kallsyms1
        NM      .tmp_vmlinux.kallsyms1.syms
        KSYMS   .tmp_vmlinux.kallsyms1.S
        AS      .tmp_vmlinux.kallsyms1.S
        LD      .tmp_vmlinux.kallsyms2
        NM      .tmp_vmlinux.kallsyms2.syms
        KSYMS   .tmp_vmlinux.kallsyms2.S
        AS      .tmp_vmlinux.kallsyms2.S
        LD      .tmp_vmlinux.kallsyms3             # should not happen
        NM      .tmp_vmlinux.kallsyms3.syms        # should not happen
        KSYMS   .tmp_vmlinux.kallsyms3.S           # should not happen
        AS      .tmp_vmlinux.kallsyms3.S           # should not happen
        LD      vmlinux
    
    The resulting vmlinux is correct, but it always requires an additional
    linking step.
    
    The symbols produced by kallsyms are excluded from kallsyms itself
    because they were previously missing in step 1. With those symbols
    excluded, the symbol lists matched between step 1 and step 2,
    eliminating the need for step 3. Now, this has a negative effect.
    
    Since 951bcae6, the PROVIDE() directives provide the fallback
    definitions, which are not trimmed from the sysbol list in step 1
    because ${kallsymso_prev} is empty at this point.
    
    In step 2, ${kallsymso_prev} is set, and the kallsyms_* symbols are
    trimmed from the symbol list.
    
    Due to the table size difference between step 1 and step 2 (the former
    is larger due to the presence of kallsyms_*), step 3 is triggered.
    
    Now that the kallsyms_* symbols are always linked, let's stop omitting
    them from kallsyms. This avoids unnecessary step 3.
    
    Fixes: 951bcae6 ("kallsyms: Avoid weak references for kallsyms symbols")
    Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
    04b8cb09
link-vmlinux.sh 7.6 KB