17 Dec, 2020

2 commits

  • With CONFIG_MODVERSIONS, version information is linked into each
    compilation unit that exports symbols. With LTO, we cannot use this
    method as all C code is compiled into LLVM bitcode instead. This
    change collects symbol versions into .symversions files and merges
    them in link-vmlinux.sh where they are all linked into vmlinux.o at
    the same time.

    Bug: 145210207
    Change-Id: Icd8fd0c760891eff7a0ed12ce48b4db2a85fc2ad
    Link: https://lore.kernel.org/lkml/20201211184633.3213045-1-samitolvanen@google.com/
    Signed-off-by: Sami Tolvanen
    Reviewed-by: Kees Cook

    Sami Tolvanen
     
  • This change adds build system support for Clang's Link Time
    Optimization (LTO). With -flto, instead of ELF object files, Clang
    produces LLVM bitcode, which is compiled into native code at link
    time, allowing the final binary to be optimized globally. For more
    details, see:

    https://llvm.org/docs/LinkTimeOptimization.html

    The Kconfig option CONFIG_LTO_CLANG is implemented as a choice,
    which defaults to LTO being disabled. To use LTO, the architecture
    must select ARCH_SUPPORTS_LTO_CLANG and support:

    - compiling with Clang,
    - compiling all assembly code with Clang's integrated assembler,
    - and linking with LLD.

    While using CONFIG_LTO_CLANG_FULL results in the best runtime
    performance, the compilation is not scalable in time or
    memory. CONFIG_LTO_CLANG_THIN enables ThinLTO, which allows
    parallel optimization and faster incremental builds. ThinLTO is
    used by default if the architecture also selects
    ARCH_SUPPORTS_LTO_CLANG_THIN:

    https://clang.llvm.org/docs/ThinLTO.html

    To enable LTO, LLVM tools must be used to handle bitcode files, by
    passing LLVM=1 and LLVM_IAS=1 options to make:

    $ make LLVM=1 LLVM_IAS=1 defconfig
    $ scripts/config -e LTO_CLANG_THIN
    $ make LLVM=1 LLVM_IAS=1

    To prepare for LTO support with other compilers, common parts are
    gated behind the CONFIG_LTO option, and LTO can be disabled for
    specific files by filtering out CC_FLAGS_LTO.

    Bug: 145210207
    Change-Id: I85eb4523ea787e4f9884e12ed6301f876d0d888e
    Link: https://lore.kernel.org/lkml/20201211184633.3213045-1-samitolvanen@google.com/
    Signed-off-by: Sami Tolvanen
    Reviewed-by: Kees Cook

    Sami Tolvanen
     

02 Aug, 2020

1 commit


06 Jun, 2020

9 commits


03 Jun, 2020

3 commits

  • The built-in only code is not required to have MODULE_IMPORT_NS() to
    use symbols. So, the namespace is not checked for vmlinux(.o).

    Do not pass the meaningless -N option to the first pass of modpost.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • The '-T -' option reads the file list from stdin.

    It is clearer to put it close to the piped command.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • $(filter -i,$(MAKEFLAGS)) works only in limited use-cases.

    The representation of $(MAKEFLAGS) depends on various factors:
    - GNU Make version (version 3.8x or version 4.x)
    - The presence of other flags like -j

    In my experiments, $(MAKEFLAGS) is expanded as follows:

    * GNU Make 3.8x:

    * without -j option:
    --no-print-directory -Rri

    * with -j option:
    --no-print-directory -Rr --jobserver-fds=3,4 -j -i

    * GNU Make 4.x:

    * without -j option:
    irR --no-print-directory

    * with -j option:
    irR -j --jobserver-fds=3,4 --no-print-directory

    For GNU Make 4.x, the flags are grouped as 'irR', which does not work.

    For the single thread build with GNU Make 3.8x, the flags are grouped
    as '-Rri', which does not work either.

    To make it work for all cases, do likewise as commit 6f0fa58e4596
    ("kbuild: simplify silent build (-s) detection").

    BTW, since commit ff9b45c55b26 ("kbuild: modpost: read modules.order
    instead of $(MODVERDIR)/*.mod"), you also need to pass -k option to
    build final *.ko files. 'make -i -k' ignores compile errors in modules,
    and build as many remaining *.ko as possible.

    Please note this feature is kind of dangerous if other modules depend
    on the broken module because the generated modules will lack the correct
    module dependency or CRC. Honestly, I am not a big fan of it, but I am
    keeping this feature.

    Fixes: eed380f3f593 ("modpost: Optionally ignore secondary errors seen if a single module build fails")
    Cc: Guenter Roeck
    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

29 May, 2020

1 commit

  • $(firstword ...) in scripts/Makefile.modpost was added by commit
    3f3fd3c05585 ("[PATCH] kbuild: allow multi-word $M in Makefile.modpost")
    to build multiple external module directories.

    It was a solution to resolve symbol dependencies when an external
    module depends on another external module.

    Commit 0d96fb20b7ed ("kbuild: Add new Kbuild variable
    KBUILD_EXTRA_SYMBOLS") introduced another solution by passing symbol
    info via KBUILD_EXTRA_SYMBOLS, then broke the multi-word M= support.

    include $(if $(wildcard $(KBUILD_EXTMOD)/Kbuild), \
    $(KBUILD_EXTMOD)/Kbuild, $(KBUILD_EXTMOD)/Makefile)

    ... does not work if KBUILD_EXTMOD contains multiple words.

    This feature has been broken for more than a decade. Remove the
    bitrotten code, and stop parsing if M or KBUILD_EXTMOD contains
    multiple words.

    As Documentation/kbuild/modules.rst explains, if your module depends
    on another one, there are two solutions:
    - add a common top-level Kbuild file
    - use KBUILD_EXTRA_SYMBOLS

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

13 Mar, 2020

1 commit

  • Currently when CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=n, modpost
    only warns when a module is missing namespace imports. Under this
    configuration, such a module cannot be loaded into the kernel anyway, as
    the module loader would reject it. We might as well return a build
    error when a module is missing namespace imports under
    CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS=n, so that the build
    warning does not go ignored/unnoticed.

    Signed-off-by: Jessica Yu
    Signed-off-by: Masahiro Yamada

    Jessica Yu
     

16 Jan, 2020

1 commit


11 Nov, 2019

6 commits

  • scripts/nsdeps is written to take care of only in-tree modules.
    Perhaps, this is not a bug, but just a design. At least,
    Documentation/core-api/symbol-namespaces.rst focuses on in-tree modules.

    Having said that, some people already tried nsdeps for external modules.
    So, it would be nice to support it.

    Reported-by: Steve French
    Reported-by: Jessica Yu
    Signed-off-by: Masahiro Yamada
    Tested-by: Jessica Yu
    Acked-by: Jessica Yu
    Reviewed-by: Matthias Maennich
    Tested-by: Matthias Maennich

    Masahiro Yamada
     
  • The modpost, with the -d option given, generates per-module .ns_deps
    files.

    Kbuild generates per-module .mod files to carry module information.
    This is convenient because Make handles multiple jobs in parallel
    when the -j option is given.

    On the other hand, the modpost always runs as a single thread.
    I do not see a strong reason to produce separate .ns_deps files.

    This commit changes the modpost to generate just one file,
    modules.nsdeps, each line of which has the following format:

    :

    Please note it contains *missing* namespaces instead of required ones.
    So, modules.nsdeps is empty if the namespace dependency is all good.

    This will work more efficiently because spatch will no longer process
    already imported namespaces. I removed the '(if needed)' from the
    nsdeps log since spatch is invoked only when needed.

    This also solves the stale .ns_deps problem reported by Jessica Yu:

    https://lkml.org/lkml/2019/10/28/467

    Signed-off-by: Masahiro Yamada
    Tested-by: Jessica Yu
    Acked-by: Jessica Yu
    Reviewed-by: Matthias Maennich
    Tested-by: Matthias Maennich

    Masahiro Yamada
     
  • 'make nsdeps' invokes the modpost three times at most; before linking
    vmlinux, before building modules, and finally for generating .ns_deps
    files. Running the modpost again and again is not efficient.

    The last two can be unified. When the -d option is given, the modpost
    still does the usual job, and in addition, generates .ns_deps files.

    Signed-off-by: Masahiro Yamada
    Tested-by: Matthias Maennich
    Reviewed-by: Matthias Maennich

    Masahiro Yamada
     
  • Since commit 040fcc819a2e ("kbuild: improved modversioning support for
    external modules"), the external module build reads Module.symvers in
    the directory of the module itself, then dumps symbols back into it.
    It accumulates stale symbols in the file when you build an external
    module incrementally.

    The idea behind it was, as the commit log explained, you can copy
    Modules.symvers from one module to another when you need to pass symbol
    information between two modules. However, the manual copy of the file
    sounds questionable to me, and containing stale symbols is a downside.

    Some time later, commit 0d96fb20b7ed ("kbuild: Add new Kbuild variable
    KBUILD_EXTRA_SYMBOLS") introduced a saner approach.

    So, this commit removes the former one. Going forward, the external
    module build dumps symbols into Module.symvers to be carried via
    KBUILD_EXTRA_SYMBOLS, but never reads it automatically.

    With the -I option removed, there is no one to set the external_module
    flag unless KBUILD_EXTRA_SYMBOLS is passed. Now the -i option does it
    instead.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • When building external modules, $(objtree)/Module.symvers is scanned
    for symbol information of vmlinux and in-tree modules.

    Additionally, vmlinux is parsed if it exists in $(objtree)/.
    This is totally redundant since all the necessary information is
    contained in $(objtree)/Module.symvers.

    Do not parse vmlinux at all for external module builds. This makes
    sense because vmlinux is deleted by 'make clean'.

    'make clean' leaves all the build artifacts for building external
    modules. vmlinux is unneeded for that.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • The comment line "When building external modules ..." explains
    the same thing as "Include the module's Makefile ..." a few lines
    below.

    The comment "they may be used when building the .mod.c file" is no
    longer true; .mod.c file is compiled in scripts/Makefile.modfinal
    since commit 9b9a3f20cbe0 ("kbuild: split final module linking out
    into Makefile.modfinal"). I still keep the code in case $(obj) or
    $(src) is used in the external module Makefile.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

23 Sep, 2019

1 commit

  • Pull modules updates from Jessica Yu:
    "The main bulk of this pull request introduces a new exported symbol
    namespaces feature. The number of exported symbols is increasingly
    growing with each release (we're at about 31k exports as of 5.3-rc7)
    and we currently have no way of visualizing how these symbols are
    "clustered" or making sense of this huge export surface.

    Namespacing exported symbols allows kernel developers to more
    explicitly partition and categorize exported symbols, as well as more
    easily limiting the availability of namespaced symbols to other parts
    of the kernel. For starters, we have introduced the USB_STORAGE
    namespace to demonstrate the API's usage. I have briefly summarized
    the feature and its main motivations in the tag below.

    Summary:

    - Introduce exported symbol namespaces.

    This new feature allows subsystem maintainers to partition and
    categorize their exported symbols into explicit namespaces. Module
    authors are now required to import the namespaces they need.

    Some of the main motivations of this feature include: allowing
    kernel developers to better manage the export surface, allow
    subsystem maintainers to explicitly state that usage of some
    exported symbols should only be limited to certain users (think:
    inter-module or inter-driver symbols, debugging symbols, etc), as
    well as more easily limiting the availability of namespaced symbols
    to other parts of the kernel.

    With the module import requirement, it is also easier to spot the
    misuse of exported symbols during patch review.

    Two new macros are introduced: EXPORT_SYMBOL_NS() and
    EXPORT_SYMBOL_NS_GPL(). The API is thoroughly documented in
    Documentation/kbuild/namespaces.rst.

    - Some small code and kbuild cleanups here and there"

    * tag 'modules-for-v5.4' of git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux:
    module: Remove leftover '#undef' from export header
    module: remove unneeded casts in cmp_name()
    module: move CONFIG_UNUSED_SYMBOLS to the sub-menu of MODULES
    module: remove redundant 'depends on MODULES'
    module: Fix link failure due to invalid relocation on namespace offset
    usb-storage: export symbols in USB_STORAGE namespace
    usb-storage: remove single-use define for debugging
    docs: Add documentation for Symbol Namespaces
    scripts: Coccinelle script for namespace dependencies.
    modpost: add support for generating namespace dependencies
    export: allow definition default namespaces in Makefiles or sources
    module: add config option MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS
    modpost: add support for symbol namespaces
    module: add support for symbol namespaces.
    export: explicitly align struct kernel_symbol
    module: support reading multiple values per modinfo tag

    Linus Torvalds
     

10 Sep, 2019

1 commit

  • A script that uses the '.ns_deps' files generated by modpost to
    automatically add the required symbol namespace dependencies to each
    module.

    Usage:
    1) Move some symbols to a namespace with EXPORT_SYMBOL_NS() or define
    DEFAULT_SYMBOL_NAMESPACE
    2) Run 'make' (or 'make modules') and get warnings about modules not
    importing that namespace.
    3) Run 'make nsdeps' to automatically add required import statements
    to said modules.

    This makes it easer for subsystem maintainers to introduce and maintain
    symbol namespaces into their codebase.

    Co-developed-by: Martijn Coenen
    Signed-off-by: Martijn Coenen
    Acked-by: Julia Lawall
    Reviewed-by: Greg Kroah-Hartman
    Signed-off-by: Matthias Maennich
    Signed-off-by: Jessica Yu

    Matthias Maennich
     

22 Aug, 2019

1 commit

  • I think splitting the modpost and linking modules into separate
    Makefiles will be useful especially when more complex build steps
    come in. The main motivation of this commit is to integrate the
    proposed klp-convert feature cleanly.

    I moved the logging 'Building modules, stage 2.' to Makefile.modpost
    to avoid the code duplication although I do not know whether or not
    this message is needed in the first place.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

21 Aug, 2019

1 commit


14 Aug, 2019

2 commits

  • This builds module objects, so [M] makes sense.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • Update the build scripts and the version magic to reflect when
    CONFIG_PREEMPT_RT is enabled in the same way as CONFIG_PREEMPT is treated.

    The resulting version strings:

    Linux m 5.3.0-rc1+ #100 SMP Fri Jul 26 ...
    Linux m 5.3.0-rc1+ #101 SMP PREEMPT Fri Jul 26 ...
    Linux m 5.3.0-rc1+ #102 SMP PREEMPT_RT Fri Jul 26 ...

    The module vermagic:

    5.3.0-rc1+ SMP mod_unload modversions
    5.3.0-rc1+ SMP preempt mod_unload modversions
    5.3.0-rc1+ SMP preempt_rt mod_unload modversions

    Signed-off-by: Thomas Gleixner
    Signed-off-by: Masahiro Yamada

    Thomas Gleixner
     

10 Aug, 2019

1 commit

  • I removed the single target %.ko in commit ff9b45c55b26 ("kbuild:
    modpost: read modules.order instead of $(MODVERDIR)/*.mod") because
    the modpost stage does not work reliably. For instance, the module
    dependency, modversion, etc. do not work if we lack symbol information
    from the other modules.

    Yet, some people still want to build only one module in their interest,
    and it may be still useful if it is used within those limitations.

    Fixes: ff9b45c55b26 ("kbuild: modpost: read modules.order instead of $(MODVERDIR)/*.mod")
    Reported-by: Don Brace
    Reported-by: Arend Van Spriel
    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

31 Jul, 2019

4 commits

  • Since commit ff9b45c55b26 ("kbuild: modpost: read modules.order instead
    of $(MODVERDIR)/*.mod"), 'make vmlinux' emits a warning, like this:

    $ make defconfig vmlinux
    [ snip ]
    LD vmlinux.o
    cat: modules.order: No such file or directory
    MODPOST vmlinux.o
    MODINFO modules.builtin.modinfo
    KSYM .tmp_kallsyms1.o
    KSYM .tmp_kallsyms2.o
    LD vmlinux
    SORTEX vmlinux
    SYSMAP System.map

    When building only vmlinux, KBUILD_MODULES is not set. Hence, the
    modules.order is not generated. For the vmlinux modpost, it is not
    necessary at all.

    Separate scripts/Makefile.modpost for the vmlinux/modules stages.
    This works more efficiently because the vmlinux modpost does not
    need to include .*.cmd files.

    Fixes: ff9b45c55b26 ("kbuild: modpost: read modules.order instead of $(MODVERDIR)/*.mod")
    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • __modpost is a phony target. The dependency on FORCE is pointless.
    All the objects have been built in the previous stage, so the
    dependency on the objects are not necessary either.

    Count the number of modules in a more straightforward way.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • KBUILD_EXTRA_SYMBOLS makes sense only when building external modules.
    Moreover, the modpost sets 'external_module' if the -e option is given.

    I replaced $(patsubst %, -e %,...) with simpler $(addprefix -e,...)
    while I was here.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     
  • If a build rule fails, the .DELETE_ON_ERROR special target removes the
    target, but does nothing for the .*.cmd file, which might be corrupted.
    So, .*.cmd files should be included only when the corresponding targets
    exist.

    Commit 392885ee82d3 ("kbuild: let fixdep directly write to .*.cmd
    files") missed to fix up this file.

    Fixes: 392885ee82d3 ("kbuild: let fixdep directly write to .*.cmd")
    Cc: # v5.0+
    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

18 Jul, 2019

2 commits

  • While descending directories, Kbuild produces objects for modules,
    but do not link final *.ko files; it is done in the modpost.

    To keep track of modules, Kbuild creates a *.mod file in $(MODVERDIR)
    for every module it is building. Some post-processing steps read the
    necessary information from *.mod files. This avoids descending into
    directories again. This mechanism was introduced in 2003 or so.

    Later, commit 551559e13af1 ("kbuild: implement modules.order") added
    modules.order. So, we can simply read it out to know all the modules
    with directory paths. This is easier than parsing the first line of
    *.mod files.

    $(MODVERDIR) has a flat directory structure, that is, *.mod files
    are named only with base names. This is based on the assumption that
    the module name is unique across the tree. This assumption is really
    fragile.

    Stephen Rothwell reported a race condition caused by a module name
    conflict:

    https://lkml.org/lkml/2019/5/13/991

    In parallel building, two different threads could write to the same
    $(MODVERDIR)/*.mod simultaneously.

    Non-unique module names are the source of all kind of troubles, hence
    commit 3a48a91901c5 ("kbuild: check uniqueness of module names")
    introduced a new checker script.

    However, it is still fragile in the build system point of view because
    this race happens before scripts/modules-check.sh is invoked. If it
    happens again, the modpost will emit unclear error messages.

    To fix this issue completely, create *.mod with full directory path
    so that two threads never attempt to write to the same file.

    $(MODVERDIR) is no longer needed.

    Since modules with directory paths are listed in modules.order, Kbuild
    is still able to find *.mod files without additional descending.

    I also killed cmd_secanalysis; scripts/mod/sumversion.c computes MD4 hash
    for modules with MODULE_VERSION(). When CONFIG_DEBUG_SECTION_MISMATCH=y,
    it occurs not only in the modpost stage, but also during directory
    descending, where sumversion.c may parse stale *.mod files. It would emit
    'No such file or directory' warning when an object consisting a module is
    renamed, or when a single-obj module is turned into a multi-obj module or
    vice versa.

    Signed-off-by: Masahiro Yamada
    Acked-by: Nicolas Pitre

    Masahiro Yamada
     
  • Towards the goal of removing MODVERDIR, read out modules.order to get
    the list of modules to be processed. This is simpler than parsing *.mod
    files in $(MODVERDIR).

    For external modules, $(KBUILD_EXTMOD)/modules.order should be read.

    I removed the single target %.ko from the top Makefile. To make sure
    modpost works correctly, vmlinux and the other modules must be built.
    You cannot build a particular .ko file alone.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

11 Apr, 2019

1 commit

  • Commit ea837f1c0503 ("kbuild: make modpost processing configurable")
    was intended to give KBUILD_MODPOST_WARN flexibility to be configurable.
    Right now KBUILD_MODPOST_WARN gets just ignored when KBUILD_EXTMOD is
    set which happens per default when building modules out of the tree.

    This change gives the opportunity to define module build behaving also
    in case of out of tree builds and default will become exit on error.
    Errors which can be detected by the build should be trapped out of the box
    there, unless somebody wants to notice broken stuff later at runtime.

    As this patch changes the default behaving from warning to error,
    users can consider to fix it for external module builds by:
    - providing module symbol table via KBUILD_EXTRA_SYMBOLS for
    modules which are dependent
    - OR getting old behaving back by passing KBUILD_MODPOST_WARN to the build

    Signed-off-by: Wladislav Wiebe
    Signed-off-by: Masahiro Yamada

    Wiebe, Wladislav (Nokia - DE/Ulm)
     

14 Mar, 2019

1 commit

  • Unless CONFIG_DEBUG_SECTION_MISMATCH is enabled, modpost only shows
    the number of section mismatches.

    If you want to know the symbols causing the issue, you need to rebuild
    with CONFIG_DEBUG_SECTION_MISMATCH. It is tedious.

    I think it is fine to show annoying warning when a new section mismatch
    comes in.

    Signed-off-by: Masahiro Yamada

    Masahiro Yamada
     

28 Jan, 2019

1 commit

  • In Kbuild, if_changed and friends must have FORCE as a prerequisite.

    Hence, $(filter-out FORCE,$^) or $(filter-out $(PHONY),$^) is a common
    idiom to get the names of all the prerequisites except phony targets.

    Add real-prereqs as a shorthand.

    Note:
    We cannot replace $(filter %.o,$^) in cmd_link_multi-m because $^ may
    include auto-generated dependencies from the .*.cmd file when a single
    object module is changed into a multi object module. Refer to commit
    69ea912fda74 ("kbuild: remove unneeded link_multi_deps"). I added some
    comment to avoid accidental breakage.

    Signed-off-by: Masahiro Yamada
    Acked-by: Rob Herring

    Masahiro Yamada