• Masahiro Yamada's avatar
    kbuild: create modules.builtin without Makefile.modbuiltin or tristate.conf · 8b41fc44
    Masahiro Yamada authored
    Commit bc081dd6 ("kbuild: generate modules.builtin") added
    infrastructure to generate modules.builtin, the list of all
    builtin modules.
    
    Basically, it works like this:
    
      - Kconfig generates include/config/tristate.conf, the list of
        tristate CONFIG options with a value in a capital letter.
    
      - scripts/Makefile.modbuiltin makes Kbuild descend into
        directories to collect the information of builtin modules.
    
    I am not a big fan of it because Kbuild ends up with traversing
    the source tree twice.
    
    I am not sure how perfectly it should work, but this approach cannot
    avoid false positives; even if the relevant CONFIG option is tristate,
    some Makefiles forces obj-m to obj-y.
    
    Some examples are:
    
      arch/powerpc/platforms/powermac/Makefile:
        obj-$(CONFIG_NVRAM:m=y)         += nvram.o
    
      net/ipv6/Makefile:
        obj-$(subst m,y,$(CONFIG_IPV6)) += inet6_hashtables.o
    
      net/netlabel/Makefile:
        obj-$(subst m,y,$(CONFIG_IPV6)) += netlabel_calipso.o
    
    Nobody has complained about (or noticed) it, so it is probably fine to
    have false positives in modules.builtin.
    
    This commit simplifies the implementation. Let's exploit the fact
    that every module has MODULE_LICENSE(). (modpost shows a warning if
    MODULE_LICENSE is missing. If so, 0-day bot would already have blocked
    such a module.)
    
    I added MODULE_FILE to <linux/module.h>. When the code is being compiled
    as builtin, it will be filled with the file path of the module, and
    collected into modules.builtin.info. Then, scripts/link-vmlinux.sh
    extracts the list of builtin modules out of it.
    
    This new approach fixes the false-positives above, but adds another
    type of false-positives; non-modular code may have MODULE_LICENSE()
    by mistake. This is not a big deal, it is just the code is always
    orphan. We can clean it up if we like. You can see cleanup examples by:
    
      $ git log --grep='make.* explicitly non-modular'
    
    To sum up, this commits deletes lots of code, but still produces almost
    equivalent results. Please note it does not increase the vmlinux size at
    all. As you can see in include/asm-generic/vmlinux.lds.h, the .modinfo
    section is discarded in the link stage.
    Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
    8b41fc44
link-vmlinux.sh 7.94 KB