1. 07 May, 2022 12 commits
    • Masahiro Yamada's avatar
      kbuild: make *.mod not depend on *.o · fc93a4cd
      Masahiro Yamada authored
      The dependency
      
          $(obj)/%.mod: $(obj)/%$(mod-prelink-ext).o
      
      ... exists because *.mod files previously contained undefined symbols,
      which are computed from *.o files when CONFIG_TRIM_UNUSED_KSYMS=y.
      
      Now that the undefined symbols are put into separate *.usyms files,
      there is no reason to make *.mod depend on *.o files.
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      fc93a4cd
    • Masahiro Yamada's avatar
      kbuild: get rid of duplication in *.mod files · 22f26f21
      Masahiro Yamada authored
      It is allowed to add the same objects multiple times to obj-y / obj-m:
      
        obj-y += foo.o foo.o foo.o
        obj-m += bar.o bar.o bar.o
      
      It is also allowed to add the same objects multiple times to a composite
      module:
      
        obj-m += foo.o
        foo-y := foo1.o foo2.o foo2.o foo1.o
      
      This flexibility is useful because the same object might be selected by
      different CONFIG options, like this:
      
        obj-m               += foo.o
        foo-y               := foo1.o
        foo-$(CONFIG_FOO_X) += foo2.o
        foo-$(CONFIG_FOO_Y) += foo2.o
      
      The duplicated objects are omitted at link time. It works naturally in
      Makefiles because GNU Make removes duplication in $^ without changing
      the order.
      
      It is working well, almost...
      
      A small flaw I notice is, *.mod contains duplication in such a case.
      
      This is probably not a big deal. As far as I know, the only small
      problem is scripts/mod/sumversion.c parses the same file multiple
      times.
      
      I am fixing this because I plan to reuse *.mod for other purposes,
      where the duplication can be problematic.
      
      The code change is quite simple. We already use awk to drop duplicated
      lines in modules.order (see cmd_modules_order in the same file).
      I copied the code, but changed RS to use spaces as record separators.
      
      I also changed the file format to list one object per line.
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      22f26f21
    • Masahiro Yamada's avatar
      kbuild: split the second line of *.mod into *.usyms · 9413e764
      Masahiro Yamada authored
      The *.mod files have two lines; the first line lists the member objects
      of the module, and the second line, if CONFIG_TRIM_UNUSED_KSYMS=y, lists
      the undefined symbols.
      
      Currently, we generate *.mod after constructing composite modules,
      otherwise, we cannot compute the second line. No prerequisite is
      required to print the first line.
      
      They are orthogonal. Splitting them into separate commands will ease
      further cleanups.
      
      This commit splits the list of undefined symbols out to *.usyms files.
      
      Previously, the list of undefined symbols ended up with a very long
      line, but now it has one symbol per line.
      
      Use sed like we did before commit 7d32358b ("kbuild: avoid split
      lines in .mod files").
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      Reviewed-by: default avatarNicolas Schier <nicolas@fjasle.eu>
      9413e764
    • Masahiro Yamada's avatar
      kbuild: reuse real-search to simplify cmd_mod · b3591e06
      Masahiro Yamada authored
      The first command in cmd_mod is similar to the real-search macro.
      Reuse it.
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
      b3591e06
    • Masahiro Yamada's avatar
      kbuild: make multi_depend work with targets in subdirectory · f97cf399
      Masahiro Yamada authored
      Precisely speaking, when you get the stem of the path, you should use
      $(patsubst $(obj)/%,%,...) instead of $(notdir ...).
      
      I do not see this usecase, but if you create a composite object in a
      subdirectory, the Makefile should look like this:
      
         obj-$(CONFIG_FOO) += dir/foo.o
         dir/foo-objs      := dir/foo1.o dir/foo2.o
      
      The member objects should be assigned to dir/foo-objs instead of
      foo-objs.
      
      This syntax is more consistent with commit 54b8ae66 ("kbuild:
      change *FLAGS_<basetarget>.o to take the path relative to $(obj)").
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
      f97cf399
    • Masahiro Yamada's avatar
      kbuild: reuse suffix-search to refactor multi_depend · 9eef99f7
      Masahiro Yamada authored
      The complicated part of multi_depend is the same as suffix-search.
      
      Reuse it.
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
      9eef99f7
    • Masahiro Yamada's avatar
      kbuild: refactor cmd_modversions_S · 7cfa2fcb
      Masahiro Yamada authored
      Split the code into two macros, cmd_gen_symversions_S for running
      genksyms, and cmd_modversions for running $(LD) to update the object
      with CRCs.
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
      7cfa2fcb
    • Masahiro Yamada's avatar
      kbuild: refactor cmd_modversions_c · 8017ce50
      Masahiro Yamada authored
      cmd_modversions_c implements two parts; run genksyms to calculate CRCs
      of exported symbols, run $(LD) to update the object with the CRCs. The
      latter is not executed for CONFIG_LTO_CLANG=y since the object is not
      ELF but LLVM bit code at this point.
      
      The first part can be unified because we can always use $(NM) instead
      of "$(OBJDUMP) -h" to dump the symbols.
      
      Split the code into the two macros, cmd_gen_symversions_c and
      cmd_modversions.
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
      8017ce50
    • Masahiro Yamada's avatar
      modpost: remove annoying namespace_from_kstrtabns() · 79f646e8
      Masahiro Yamada authored
      There are two call sites for sym_update_namespace().
      
      When the symbol has no namespace, s->namespace is set to NULL,
      but the conversion from "" to NULL is done in two different places.
      
      [1] read_symbols()
      
        This gets the namespace from __kstrtabns_<symbol>. If the symbol has
        no namespace, sym_get_data(info, sym) returns the empty string "".
        namespace_from_kstrtabns() converts it to NULL before it is passed to
        sym_update_namespace().
      
      [2] read_dump()
      
        This gets the namespace from the dump file, *.symvers. If the symbol
        has no namespace, the 'namespace' is the empty string "", which is
        directly passed into sym_update_namespace(). The conversion from
        "" to NULL is done in sym_update_namespace().
      
      namespace_from_kstrtabns() exists only for creating this inconsistency.
      
      Remove namespace_from_kstrtabns() so that sym_update_namespace() is
      consistently passed with "" instead of NULL.
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
      79f646e8
    • Masahiro Yamada's avatar
      modpost: remove redundant initializes for static variables · b5f1a52a
      Masahiro Yamada authored
      These are initialized with zeros without explicit initializers.
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
      b5f1a52a
    • Masahiro Yamada's avatar
      modpost: move export_from_secname() call to more relevant place · 535b3e05
      Masahiro Yamada authored
      The assigned 'export' is only used when
      
          if (strstarts(symname, "__ksymtab_"))
      
      is met. The else-part of the assignment is the dead code.
      
      Move the export_from_secname() call to where it is used.
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
      535b3e05
    • Masahiro Yamada's avatar
      modpost: remove useless export_from_sec() · 7ce3e410
      Masahiro Yamada authored
      With commit 1743694e ("modpost: stop symbol preloading for
      modversion CRC") applied, now export_from_sec() is useless.
      
      handle_symbol() is called for every symbol in the ELF.
      
      When 'symname' does not start with "__ksymtab", export_from_sec() is
      called, and the returned value is stored in 'export'.
      
      It is used in the last part of handle_symbol():
      
          if (strstarts(symname, "__ksymtab_")) {
                  name = symname + strlen("__ksymtab_");
                  sym_add_exported(name, mod, export);
          }
      
      'export' is used only when 'symname' starts with "__ksymtab_".
      
      So, the value returned by export_from_sec() is never used.
      
      Remove useless export_from_sec(). This makes further cleanups possible.
      
      I put the temporary code:
      
          export = export_unknown;
      
      Otherwise, I would get the compiler warning:
      
          warning: 'export' may be used uninitialized in this function [-Wmaybe-uninitialized]
      
      This is apparently false positive because
      
          if (strstarts(symname, "__ksymtab_")
      
      ... is a stronger condition than:
      
          if (strstarts(symname, "__ksymtab")
      
      Anyway, this part will be cleaned up by the next commit.
      Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
      Reviewed-by: default avatarNick Desaulniers <ndesaulniers@google.com>
      7ce3e410
  2. 06 Apr, 2022 3 commits
  3. 05 Apr, 2022 2 commits
  4. 03 Apr, 2022 8 commits
  5. 02 Apr, 2022 15 commits