Merge tag 'kbuild-v6.1' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy...
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 10 Oct 2022 19:00:45 +0000 (12:00 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 10 Oct 2022 19:00:45 +0000 (12:00 -0700)
Pull Kbuild updates from Masahiro Yamada:

 - Remove potentially incomplete targets when Kbuid is interrupted by
   SIGINT etc in case GNU Make may miss to do that when stderr is piped
   to another program.

 - Rewrite the single target build so it works more correctly.

 - Fix rpm-pkg builds with V=1.

 - List top-level subdirectories in ./Kbuild.

 - Ignore auto-generated __kstrtab_* and __kstrtabns_* symbols in
   kallsyms.

 - Avoid two different modules in lib/zstd/ having shared code, which
   potentially causes building the common code as build-in and modular
   back-and-forth.

 - Unify two modpost invocations to optimize the build process.

 - Remove head-y syntax in favor of linker scripts for placing
   particular sections in the head of vmlinux.

 - Bump the minimal GNU Make version to 3.82.

 - Clean up misc Makefiles and scripts.

* tag 'kbuild-v6.1' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild: (41 commits)
  docs: bump minimal GNU Make version to 3.82
  ia64: simplify esi object addition in Makefile
  Revert "kbuild: Check if linker supports the -X option"
  kbuild: rebuild .vmlinux.export.o when its prerequisite is updated
  kbuild: move modules.builtin(.modinfo) rules to Makefile.vmlinux_o
  zstd: Fixing mixed module-builtin objects
  kallsyms: ignore __kstrtab_* and __kstrtabns_* symbols
  kallsyms: take the input file instead of reading stdin
  kallsyms: drop duplicated ignore patterns from kallsyms.c
  kbuild: reuse mksysmap output for kallsyms
  mksysmap: update comment about __crc_*
  kbuild: remove head-y syntax
  kbuild: use obj-y instead extra-y for objects placed at the head
  kbuild: hide error checker logs for V=1 builds
  kbuild: re-run modpost when it is updated
  kbuild: unify two modpost invocations
  kbuild: move vmlinux.o rule to the top Makefile
  kbuild: move .vmlinux.objs rule to Makefile.modpost
  kbuild: list sub-directories in ./Kbuild
  Makefile.compiler: replace cc-ifversion with compiler-specific macros
  ...

87 files changed:
Documentation/kbuild/makefiles.rst
Documentation/process/changes.rst
Kbuild
Makefile
arch/alpha/Makefile
arch/alpha/kernel/Makefile
arch/arc/Makefile
arch/arc/kernel/Makefile
arch/arm/Makefile
arch/arm/kernel/Makefile
arch/arm64/Makefile
arch/arm64/kernel/Makefile
arch/csky/Makefile
arch/csky/kernel/Makefile
arch/hexagon/Makefile
arch/hexagon/kernel/Makefile
arch/ia64/Makefile
arch/ia64/kernel/Makefile
arch/loongarch/Makefile
arch/loongarch/kernel/Makefile
arch/m68k/68000/Makefile
arch/m68k/Makefile
arch/m68k/coldfire/Makefile
arch/m68k/kernel/Makefile
arch/microblaze/Makefile
arch/microblaze/kernel/Makefile
arch/mips/Makefile
arch/mips/kernel/Makefile
arch/nios2/Kbuild
arch/nios2/Makefile
arch/nios2/kernel/Makefile
arch/openrisc/Makefile
arch/openrisc/kernel/Makefile
arch/parisc/Makefile
arch/parisc/kernel/Makefile
arch/powerpc/Makefile
arch/powerpc/boot/wrapper
arch/powerpc/kernel/Makefile
arch/riscv/Makefile
arch/riscv/kernel/Makefile
arch/s390/Makefile
arch/s390/boot/version.c
arch/s390/kernel/Makefile
arch/sh/Makefile
arch/sh/kernel/Makefile
arch/sparc/Makefile
arch/sparc/kernel/Makefile
arch/x86/Makefile
arch/x86/boot/compressed/kaslr.c
arch/x86/boot/version.c
arch/x86/kernel/Makefile
arch/xtensa/Makefile
arch/xtensa/kernel/Makefile
drivers/gpu/drm/amd/display/dc/dml/Makefile
include/linux/export-internal.h
init/.gitignore [new file with mode: 0644]
init/Makefile
init/build-version [new file with mode: 0755]
init/version-timestamp.c [new file with mode: 0644]
init/version.c
kernel/gen_kheaders.sh
lib/Kconfig
lib/zstd/Makefile
lib/zstd/common/entropy_common.c
lib/zstd/common/zstd_common.c
scripts/Kbuild.include
scripts/Makefile.build
scripts/Makefile.compiler
scripts/Makefile.extrawarn
scripts/Makefile.lib
scripts/Makefile.modfinal
scripts/Makefile.modpost
scripts/Makefile.package
scripts/Makefile.vmlinux
scripts/Makefile.vmlinux_o
scripts/asn1_compiler.c
scripts/atomic/check-atomics.sh [deleted file]
scripts/check-local-export
scripts/clang-tools/gen_compile_commands.py
scripts/head-object-list.txt [new file with mode: 0644]
scripts/kallsyms.c
scripts/kconfig/conf.c
scripts/kconfig/lkc.h
scripts/link-vmlinux.sh
scripts/mkcompile_h
scripts/mksysmap
scripts/package/mkspec

index 5ea1e72d89c8b6608974130c6e471eacf784029d..6b7368d1f51639c016e4be5f4c3c4f51b0f29991 100644 (file)
@@ -341,19 +341,7 @@ more details, with real examples.
 
        Examples are:
 
-       1) head objects
-
-           Some objects must be placed at the head of vmlinux. They are
-           directly linked to vmlinux without going through built-in.a
-           A typical use-case is an object that contains the entry point.
-
-           arch/$(SRCARCH)/Makefile should specify such objects as head-y.
-
-           Discussion:
-             Given that we can control the section order in the linker script,
-             why do we need head-y?
-
-       2) vmlinux linker script
+       1) vmlinux linker script
 
            The linker script for vmlinux is located at
            arch/$(SRCARCH)/kernel/vmlinux.lds
@@ -361,10 +349,6 @@ more details, with real examples.
        Example::
 
                # arch/x86/kernel/Makefile
-               extra-y := head_$(BITS).o
-               extra-y += head$(BITS).o
-               extra-y += ebda.o
-               extra-y += platform-quirks.o
                extra-y += vmlinux.lds
 
        $(extra-y) should only contain targets needed for vmlinux.
@@ -683,22 +667,27 @@ more details, with real examples.
        In the above example, -Wno-unused-but-set-variable will be added to
        KBUILD_CFLAGS only if gcc really accepts it.
 
-    cc-ifversion
-       cc-ifversion tests the version of $(CC) and equals the fourth parameter
-       if version expression is true, or the fifth (if given) if the version
-       expression is false.
+    gcc-min-version
+       gcc-min-version tests if the value of $(CONFIG_GCC_VERSION) is greater than
+       or equal to the provided value and evaluates to y if so.
+
+       Example::
+
+               cflags-$(call gcc-min-version, 70100) := -foo
+
+       In this example, cflags-y will be assigned the value -foo if $(CC) is gcc and
+       $(CONFIG_GCC_VERSION) is >= 7.1.
+
+    clang-min-version
+       clang-min-version tests if the value of $(CONFIG_CLANG_VERSION) is greater
+       than or equal to the provided value and evaluates to y if so.
 
        Example::
 
-               #fs/reiserfs/Makefile
-               ccflags-y := $(call cc-ifversion, -lt, 0402, -O1)
+               cflags-$(call clang-min-version, 110000) := -foo
 
-       In this example, ccflags-y will be assigned the value -O1 if the
-       $(CC) version is less than 4.2.
-       cc-ifversion takes all the shell operators:
-       -eq, -ne, -lt, -le, -gt, and -ge
-       The third parameter may be a text as in this example, but it may also
-       be an expanded variable or a macro.
+       In this example, cflags-y will be assigned the value -foo if $(CC) is clang
+       and $(CONFIG_CLANG_VERSION) is >= 11.0.0.
 
     cc-cross-prefix
        cc-cross-prefix is used to check if there exists a $(CC) in path with
@@ -1099,8 +1088,7 @@ When kbuild executes, the following steps are followed (roughly):
    - The values of the above variables are expanded in arch/$(SRCARCH)/Makefile.
 5) All object files are then linked and the resulting file vmlinux is
    located at the root of the obj tree.
-   The very first objects linked are listed in head-y, assigned by
-   arch/$(SRCARCH)/Makefile.
+   The very first objects linked are listed in scripts/head-object-list.txt.
 6) Finally, the architecture-specific part does any required post processing
    and builds the final bootimage.
    - This includes building boot records
@@ -1272,6 +1260,9 @@ When kbuild executes, the following steps are followed (roughly):
        All object files for vmlinux. They are linked to vmlinux in the same
        order as listed in KBUILD_VMLINUX_OBJS.
 
+       The objects listed in scripts/head-object-list.txt are exceptions;
+       they are placed before the other objects.
+
     KBUILD_VMLINUX_LIBS
 
        All .a "lib" files for vmlinux. KBUILD_VMLINUX_OBJS and
@@ -1315,8 +1306,7 @@ When kbuild executes, the following steps are followed (roughly):
        machinery is all architecture-independent.
 
 
-       head-y, core-y, libs-y, drivers-y
-           $(head-y) lists objects to be linked first in vmlinux.
+       core-y, libs-y, drivers-y
 
            $(libs-y) lists directories where a lib.a archive can be located.
 
index 9a90197989ddf7f210f44872c7d868001f989e9a..9844ca3a71a61689f171bc02fd10a12566ee5f0b 100644 (file)
@@ -33,7 +33,7 @@ GNU C                  5.1              gcc --version
 Clang/LLVM (optional)  11.0.0           clang --version
 Rust (optional)        1.62.0           rustc --version
 bindgen (optional)     0.56.0           bindgen --version
-GNU make               3.81             make --version
+GNU make               3.82             make --version
 bash                   4.2              bash --version
 binutils               2.23             ld -v
 flex                   2.5.35           flex --version
@@ -108,7 +108,7 @@ It depends on ``libclang``.
 Make
 ----
 
-You will need GNU make 3.81 or later to build the kernel.
+You will need GNU make 3.82 or later to build the kernel.
 
 Bash
 ----
diff --git a/Kbuild b/Kbuild
index fa441b98c9f6eac1617acf1772ae8b371cfd42aa..464b34a08f51ef9d2ae12e6902c92690b5dfa03b 100644 (file)
--- a/Kbuild
+++ b/Kbuild
@@ -2,18 +2,18 @@
 #
 # Kbuild for top-level directory of the kernel
 
-#####
+# Prepare global headers and check sanity before descending into sub-directories
+# ---------------------------------------------------------------------------
+
 # Generate bounds.h
 
 bounds-file := include/generated/bounds.h
 
-always-y := $(bounds-file)
 targets := kernel/bounds.s
 
 $(bounds-file): kernel/bounds.s FORCE
        $(call filechk,offsets,__LINUX_BOUNDS_H__)
 
-#####
 # Generate timeconst.h
 
 timeconst-file := include/generated/timeconst.h
@@ -23,12 +23,10 @@ filechk_gentimeconst = echo $(CONFIG_HZ) | bc -q $<
 $(timeconst-file): kernel/time/timeconst.bc FORCE
        $(call filechk,gentimeconst)
 
-#####
 # Generate asm-offsets.h
 
 offsets-file := include/generated/asm-offsets.h
 
-always-y += $(offsets-file)
 targets += arch/$(SRCARCH)/kernel/asm-offsets.s
 
 arch/$(SRCARCH)/kernel/asm-offsets.s: $(timeconst-file) $(bounds-file)
@@ -36,24 +34,66 @@ arch/$(SRCARCH)/kernel/asm-offsets.s: $(timeconst-file) $(bounds-file)
 $(offsets-file): arch/$(SRCARCH)/kernel/asm-offsets.s FORCE
        $(call filechk,offsets,__ASM_OFFSETS_H__)
 
-#####
 # Check for missing system calls
 
-always-y += missing-syscalls
-
 quiet_cmd_syscalls = CALL    $<
       cmd_syscalls = $(CONFIG_SHELL) $< $(CC) $(c_flags) $(missing_syscalls_flags)
 
-missing-syscalls: scripts/checksyscalls.sh $(offsets-file) FORCE
+PHONY += missing-syscalls
+missing-syscalls: scripts/checksyscalls.sh $(offsets-file)
        $(call cmd,syscalls)
 
-#####
-# Check atomic headers are up-to-date
-
-always-y += old-atomics
-
-quiet_cmd_atomics = CALL    $<
-      cmd_atomics = $(CONFIG_SHELL) $<
-
-old-atomics: scripts/atomic/check-atomics.sh FORCE
-       $(call cmd,atomics)
+# Check the manual modification of atomic headers
+
+quiet_cmd_check_sha1 = CHKSHA1 $<
+      cmd_check_sha1 = \
+       if ! command -v sha1sum >/dev/null; then \
+               echo "warning: cannot check the header due to sha1sum missing"; \
+               exit 0; \
+       fi; \
+       if [ "$$(sed -n '$$s:// ::p' $<)" != \
+            "$$(sed '$$d' $< | sha1sum | sed 's/ .*//')" ]; then \
+               echo "error: $< has been modified." >&2; \
+               exit 1; \
+       fi; \
+       touch $@
+
+atomic-checks += $(addprefix $(obj)/.checked-, \
+         atomic-arch-fallback.h \
+         atomic-instrumented.h \
+         atomic-long.h)
+
+targets += $(atomic-checks)
+$(atomic-checks): $(obj)/.checked-%: include/linux/atomic/%  FORCE
+       $(call if_changed,check_sha1)
+
+# A phony target that depends on all the preparation targets
+
+PHONY += prepare
+prepare: $(offsets-file) missing-syscalls $(atomic-checks)
+       @:
+
+# Ordinary directory descending
+# ---------------------------------------------------------------------------
+
+obj-y                  += init/
+obj-y                  += usr/
+obj-y                  += arch/$(SRCARCH)/
+obj-y                  += $(ARCH_CORE)
+obj-y                  += kernel/
+obj-y                  += certs/
+obj-y                  += mm/
+obj-y                  += fs/
+obj-y                  += ipc/
+obj-y                  += security/
+obj-y                  += crypto/
+obj-$(CONFIG_BLOCK)    += block/
+obj-$(CONFIG_IO_URING) += io_uring/
+obj-$(CONFIG_RUST)     += rust/
+obj-y                  += $(ARCH_LIB)
+obj-y                  += drivers/
+obj-y                  += sound/
+obj-$(CONFIG_SAMPLES)  += samples/
+obj-$(CONFIG_NET)      += net/
+obj-y                  += virt/
+obj-y                  += $(ARCH_DRIVERS)
index f659d308512194d59ae5361eb0d2e56e63c48fcf..d66187d53b5f5a67afea1ad8a69aadddba747b68 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -538,7 +538,7 @@ LDFLAGS_MODULE  =
 CFLAGS_KERNEL  =
 RUSTFLAGS_KERNEL =
 AFLAGS_KERNEL  =
-LDFLAGS_vmlinux =
+export LDFLAGS_vmlinux =
 
 # Use USERINCLUDE when you must reference the UAPI directories only.
 USERINCLUDE    := \
@@ -648,7 +648,7 @@ quiet_cmd_makefile = GEN     Makefile
        } > Makefile
 
 outputmakefile:
-       $(Q)if [ -f $(srctree)/.config -o \
+       @if [ -f $(srctree)/.config -o \
                 -d $(srctree)/include/config -o \
                 -d $(srctree)/arch/$(SRCARCH)/include/generated ]; then \
                echo >&2 "***"; \
@@ -710,6 +710,8 @@ else
 __all: modules
 endif
 
+targets :=
+
 # Decide whether to build built-in, modular, or both.
 # Normally, just do built-in.
 
@@ -741,11 +743,8 @@ endif
 
 ifeq ($(KBUILD_EXTMOD),)
 # Objects we will link into vmlinux / subdirs we need to visit
-core-y         := init/ usr/ arch/$(SRCARCH)/
-drivers-y      := drivers/ sound/
-drivers-$(CONFIG_SAMPLES) += samples/
-drivers-$(CONFIG_NET) += net/
-drivers-y      += virt/
+core-y         :=
+drivers-y      :=
 libs-y         := lib/
 endif # KBUILD_EXTMOD
 
@@ -804,7 +803,7 @@ else # !may-sync-config
 PHONY += include/config/auto.conf
 
 include/config/auto.conf:
-       $(Q)test -e include/generated/autoconf.h -a -e $@ || (          \
+       @test -e include/generated/autoconf.h -a -e $@ || (             \
        echo >&2;                                                       \
        echo >&2 "  ERROR: Kernel configuration is invalid.";           \
        echo >&2 "         include/generated/autoconf.h or $@ are missing.";\
@@ -862,7 +861,6 @@ KBUILD_CFLAGS += $(stackp-flags-y)
 
 KBUILD_CFLAGS-$(CONFIG_WERROR) += -Werror
 KBUILD_CFLAGS-$(CONFIG_CC_NO_ARRAY_BOUNDS) += -Wno-array-bounds
-KBUILD_CFLAGS += $(KBUILD_CFLAGS-y) $(CONFIG_CC_IMPLICIT_FALLTHROUGH)
 
 KBUILD_RUSTFLAGS-$(CONFIG_WERROR) += -Dwarnings
 KBUILD_RUSTFLAGS += $(KBUILD_RUSTFLAGS-y)
@@ -1041,7 +1039,6 @@ ifdef CONFIG_CC_IS_GCC
 KBUILD_CFLAGS += -Wno-maybe-uninitialized
 endif
 
-ifdef CONFIG_CC_IS_GCC
 # The allocators already balk at large sizes, so silence the compiler
 # warnings for bounds checks involving those possible values. While
 # -Wno-alloc-size-larger-than would normally be used here, earlier versions
@@ -1053,8 +1050,8 @@ ifdef CONFIG_CC_IS_GCC
 # ignored, continuing to default to PTRDIFF_MAX. So, left with no other
 # choice, we must perform a versioned check to disable this warning.
 # https://lore.kernel.org/lkml/20210824115859.187f272f@canb.auug.org.au
-KBUILD_CFLAGS += $(call cc-ifversion, -ge, 0901, -Wno-alloc-size-larger-than)
-endif
+KBUILD_CFLAGS-$(call gcc-min-version, 90100) += -Wno-alloc-size-larger-than
+KBUILD_CFLAGS += $(KBUILD_CFLAGS-y) $(CONFIG_CC_IMPLICIT_FALLTHROUGH)
 
 # disable invalid "can't wrap" optimizations for signed / pointers
 KBUILD_CFLAGS  += -fno-strict-overflow
@@ -1110,7 +1107,7 @@ KBUILD_LDFLAGS    += $(call ld-option,--no-warn-rwx-segments)
 endif
 
 ifeq ($(CONFIG_STRIP_ASM_SYMS),y)
-LDFLAGS_vmlinux        += $(call ld-option, -X,)
+LDFLAGS_vmlinux        += -X
 endif
 
 ifeq ($(CONFIG_RELR),y)
@@ -1171,41 +1168,27 @@ export MODORDER := $(extmod_prefix)modules.order
 export MODULES_NSDEPS := $(extmod_prefix)modules.nsdeps
 
 ifeq ($(KBUILD_EXTMOD),)
-core-y                 += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/
-core-$(CONFIG_BLOCK)   += block/
-core-$(CONFIG_IO_URING)        += io_uring/
-core-$(CONFIG_RUST)    += rust/
 
-vmlinux-dirs   := $(patsubst %/,%,$(filter %/, \
-                    $(core-y) $(core-m) $(drivers-y) $(drivers-m) \
-                    $(libs-y) $(libs-m)))
-
-vmlinux-alldirs        := $(sort $(vmlinux-dirs) Documentation \
+build-dir      := .
+clean-dirs     := $(sort . Documentation \
                     $(patsubst %/,%,$(filter %/, $(core-) \
                        $(drivers-) $(libs-))))
 
-build-dirs     := $(vmlinux-dirs)
-clean-dirs     := $(vmlinux-alldirs)
-
-subdir-modorder := $(addsuffix /modules.order, $(build-dirs))
-
+export ARCH_CORE       := $(core-y)
+export ARCH_LIB                := $(filter %/, $(libs-y))
+export ARCH_DRIVERS    := $(drivers-y) $(drivers-m)
 # Externally visible symbols (used by link-vmlinux.sh)
-KBUILD_VMLINUX_OBJS := $(head-y) $(patsubst %/,%/built-in.a, $(core-y))
-KBUILD_VMLINUX_OBJS += $(addsuffix built-in.a, $(filter %/, $(libs-y)))
+
+KBUILD_VMLINUX_OBJS := ./built-in.a
 ifdef CONFIG_MODULES
 KBUILD_VMLINUX_OBJS += $(patsubst %/, %/lib.a, $(filter %/, $(libs-y)))
 KBUILD_VMLINUX_LIBS := $(filter-out %/, $(libs-y))
 else
 KBUILD_VMLINUX_LIBS := $(patsubst %/,%/lib.a, $(libs-y))
 endif
-KBUILD_VMLINUX_OBJS += $(patsubst %/,%/built-in.a, $(drivers-y))
 
-export KBUILD_VMLINUX_OBJS KBUILD_VMLINUX_LIBS
+export KBUILD_VMLINUX_LIBS
 export KBUILD_LDS          := arch/$(SRCARCH)/kernel/vmlinux.lds
-# used by scripts/Makefile.package
-export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) LICENSES arch include scripts tools)
-
-vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)
 
 # Recurse until adjust_autoksyms.sh is satisfied
 PHONY += autoksyms_recursive
@@ -1215,7 +1198,7 @@ ifdef CONFIG_TRIM_UNUSED_KSYMS
 # (this can be evaluated only once include/config/auto.conf has been included)
 KBUILD_MODULES := 1
 
-autoksyms_recursive: descend modules.order
+autoksyms_recursive: $(build-dir) modules.order
        $(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \
          "$(MAKE) -f $(srctree)/Makefile autoksyms_recursive"
 endif
@@ -1229,21 +1212,31 @@ quiet_cmd_autoksyms_h = GEN     $@
 $(autoksyms_h):
        $(call cmd,autoksyms_h)
 
-ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
+# '$(AR) mPi' needs 'T' to workaround the bug of llvm-ar <= 14
+quiet_cmd_ar_vmlinux.a = AR      $@
+      cmd_ar_vmlinux.a = \
+       rm -f $@; \
+       $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
+       $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $$($(AR) t $@ | grep -F --file=$(srctree)/scripts/head-object-list.txt)
 
-# Final link of vmlinux with optional arch pass after final link
-cmd_link-vmlinux =                                                 \
-       $(CONFIG_SHELL) $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)";    \
-       $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
+targets += vmlinux.a
+vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt autoksyms_recursive FORCE
+       $(call if_changed,ar_vmlinux.a)
 
-vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE
-       +$(call if_changed_dep,link-vmlinux)
+PHONY += vmlinux_o
+vmlinux_o: vmlinux.a $(KBUILD_VMLINUX_LIBS)
+       $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux_o
 
-targets := vmlinux
+vmlinux.o modules.builtin.modinfo modules.builtin: vmlinux_o
+       @:
+
+PHONY += vmlinux
+vmlinux: vmlinux.o $(KBUILD_LDS) modpost
+       $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux
 
 # The actual objects are generated when descending,
 # make sure no implicit rule kicks in
-$(sort $(vmlinux-deps) $(subdir-modorder)): descend ;
+$(sort $(KBUILD_LDS) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)): . ;
 
 filechk_kernel.release = \
        echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
@@ -1269,11 +1262,11 @@ PHONY += prepare archprepare
 
 archprepare: outputmakefile archheaders archscripts scripts include/config/kernel.release \
        asm-generic $(version_h) $(autoksyms_h) include/generated/utsrelease.h \
-       include/generated/autoconf.h remove-stale-files
+       include/generated/compile.h include/generated/autoconf.h remove-stale-files
 
 prepare0: archprepare
        $(Q)$(MAKE) $(build)=scripts/mod
-       $(Q)$(MAKE) $(build)=.
+       $(Q)$(MAKE) $(build)=. prepare
 
 # All the preparing..
 prepare: prepare0
@@ -1335,6 +1328,12 @@ $(version_h): FORCE
 include/generated/utsrelease.h: include/config/kernel.release FORCE
        $(call filechk,utsrelease.h)
 
+filechk_compile.h = $(srctree)/scripts/mkcompile_h \
+       "$(UTS_MACHINE)" "$(CONFIG_CC_VERSION_TEXT)" "$(LD)"
+
+include/generated/compile.h: FORCE
+       $(call filechk,compile.h)
+
 PHONY += headerdep
 headerdep:
        $(Q)find $(srctree)/include/ -name '*.h' | xargs --max-args 1 \
@@ -1509,22 +1508,16 @@ endif
 
 # Build modules
 #
-# A module can be listed more than once in obj-m resulting in
-# duplicate lines in modules.order files.  Those are removed
-# using awk while concatenating to the final file.
-
-PHONY += modules
-modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_check modules_prepare
 
-cmd_modules_order = $(AWK) '!x[$$0]++' $(real-prereqs) > $@
-
-modules.order: $(subdir-modorder) FORCE
-       $(call if_changed,modules_order)
+# *.ko are usually independent of vmlinux, but CONFIG_DEBUG_INFOBTF_MODULES
+# is an exception.
+ifdef CONFIG_DEBUG_INFO_BTF_MODULES
+modules: vmlinux
+endif
 
-targets += modules.order
+modules: modules_prepare
 
 # Target to prepare building external modules
-PHONY += modules_prepare
 modules_prepare: prepare
        $(Q)$(MAKE) $(build)=scripts scripts/module.lds
 
@@ -1574,7 +1567,8 @@ endif # CONFIG_MODULES
 # Directories & files removed with 'make clean'
 CLEAN_FILES += include/ksym vmlinux.symvers modules-only.symvers \
               modules.builtin modules.builtin.modinfo modules.nsdeps \
-              compile_commands.json .thinlto-cache rust/test rust/doc
+              compile_commands.json .thinlto-cache rust/test rust/doc \
+              .vmlinux.objs .vmlinux.export.c
 
 # Directories & files removed with 'make mrproper'
 MRPROPER_FILES += include/config include/generated          \
@@ -1862,9 +1856,7 @@ else # KBUILD_EXTMOD
 KBUILD_BUILTIN :=
 KBUILD_MODULES := 1
 
-build-dirs := $(KBUILD_EXTMOD)
-$(MODORDER): descend
-       @:
+build-dir := $(KBUILD_EXTMOD)
 
 compile_commands.json: $(extmod_prefix)compile_commands.json
 PHONY += compile_commands.json
@@ -1893,20 +1885,24 @@ help:
        @echo  '  clean           - remove generated files in module directory only'
        @echo  ''
 
-# no-op for external module builds
-PHONY += modules_prepare
-
 endif # KBUILD_EXTMOD
 
 # ---------------------------------------------------------------------------
 # Modules
 
-PHONY += modules modules_install
+PHONY += modules modules_install modules_prepare
 
 ifdef CONFIG_MODULES
 
-modules: modules_check
-       $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+$(MODORDER): $(build-dir)
+       @:
+
+# KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules.
+# This is solely useful to speed up test compiles.
+modules: modpost
+ifneq ($(KBUILD_MODPOST_NOFINAL),1)
+       $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
+endif
 
 PHONY += modules_check
 modules_check: $(MODORDER)
@@ -1933,8 +1929,15 @@ modules modules_install:
        @echo >&2 '***'
        @exit 1
 
+KBUILD_MODULES :=
+
 endif # CONFIG_MODULES
 
+PHONY += modpost
+modpost: $(if $(single-build),, $(if $(KBUILD_BUILTIN), vmlinux.o)) \
+        $(if $(KBUILD_MODULES), modules_check)
+       $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+
 # Single targets
 # ---------------------------------------------------------------------------
 # To build individual files in subdirectories, you can do like this:
@@ -1954,47 +1957,32 @@ single-ko := $(sort $(filter %.ko, $(MAKECMDGOALS)))
 single-no-ko := $(filter-out $(single-ko), $(MAKECMDGOALS)) \
                $(foreach x, o mod, $(patsubst %.ko, %.$x, $(single-ko)))
 
-$(single-ko): single_modpost
+$(single-ko): single_modules
        @:
-$(single-no-ko): descend
+$(single-no-ko): $(build-dir)
        @:
 
-ifeq ($(KBUILD_EXTMOD),)
-# For the single build of in-tree modules, use a temporary file to avoid
-# the situation of modules_install installing an invalid modules.order.
-MODORDER := .modules.tmp
-endif
-
-PHONY += single_modpost
-single_modpost: $(single-no-ko) modules_prepare
+# Remove MODORDER when done because it is not the real one.
+PHONY += single_modules
+single_modules: $(single-no-ko) modules_prepare
        $(Q){ $(foreach m, $(single-ko), echo $(extmod_prefix)$m;) } > $(MODORDER)
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
-
-KBUILD_MODULES := 1
-
-export KBUILD_SINGLE_TARGETS := $(addprefix $(extmod_prefix), $(single-no-ko))
-
-# trim unrelated directories
-build-dirs := $(foreach d, $(build-dirs), \
-                       $(if $(filter $(d)/%, $(KBUILD_SINGLE_TARGETS)), $(d)))
-
+ifneq ($(KBUILD_MODPOST_NOFINAL),1)
+       $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
 endif
+       $(Q)rm -f $(MODORDER)
+
+single-goals := $(addprefix $(build-dir)/, $(single-no-ko))
 
-ifndef CONFIG_MODULES
-KBUILD_MODULES :=
 endif
 
-# Handle descending into subdirectories listed in $(build-dirs)
 # Preset locale variables to speed up the build process. Limit locale
 # tweaks to this spot to avoid wrong language settings when running
 # make menuconfig etc.
 # Error messages still appears in the original language
-PHONY += descend $(build-dirs)
-descend: $(build-dirs)
-$(build-dirs): prepare
-       $(Q)$(MAKE) $(build)=$@ \
-       single-build=$(if $(filter-out $@/, $(filter $@/%, $(KBUILD_SINGLE_TARGETS))),1) \
-       need-builtin=1 need-modorder=1
+PHONY += $(build-dir)
+$(build-dir): prepare
+       $(Q)$(MAKE) $(build)=$@ need-builtin=1 need-modorder=1 $(single-goals)
 
 clean-dirs := $(addprefix _clean_, $(clean-dirs))
 PHONY += $(clean-dirs) clean
@@ -2042,7 +2030,7 @@ quiet_cmd_gen_compile_commands = GEN     $@
       cmd_gen_compile_commands = $(PYTHON3) $< -a $(AR) -o $@ $(filter-out $<, $(real-prereqs))
 
 $(extmod_prefix)compile_commands.json: scripts/clang-tools/gen_compile_commands.py \
-       $(if $(KBUILD_EXTMOD),,$(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)) \
+       $(if $(KBUILD_EXTMOD),, vmlinux.a $(KBUILD_VMLINUX_LIBS)) \
        $(if $(CONFIG_MODULES), $(MODORDER)) FORCE
        $(call if_changed,gen_compile_commands)
 
index 881cb913e23abbc416ffdee4e744334d0d989955..45158024085e26faa4d0e51523563758b638ac42 100644 (file)
@@ -36,8 +36,6 @@ cflags-y                              += $(cpuflags-y)
 # BWX is most important, but we don't really want any emulation ever.
 KBUILD_CFLAGS += $(cflags-y) -Wa,-mev6
 
-head-y := arch/alpha/kernel/head.o
-
 libs-y                         += arch/alpha/lib/
 
 # export what is needed by arch/alpha/boot/Makefile
index bd82c8a12f0bc34733a7d15c6b132b9a67ee2b57..fb4efec7cbc74147fdd29159ce7d95d8289437d4 100644 (file)
@@ -3,11 +3,11 @@
 # Makefile for the linux kernel.
 #
 
-extra-y                := head.o vmlinux.lds
+extra-y                := vmlinux.lds
 asflags-y      := $(KBUILD_CFLAGS)
 ccflags-y      := -Wno-sign-compare
 
-obj-y    := entry.o traps.o process.o osf_sys.o irq.o \
+obj-y    := head.o entry.o traps.o process.o osf_sys.o irq.o \
            irq_alpha.o signal.o setup.o ptrace.o time.o \
            systbls.o err_common.o io.o bugs.o termios.o
 
index efc54f3e35e07407777aab00356f52f873bf335f..329400a1c35598187d62faca9e84f3f286985715 100644 (file)
@@ -82,8 +82,6 @@ KBUILD_CFLAGS += $(cflags-y)
 KBUILD_AFLAGS  += $(KBUILD_CFLAGS)
 KBUILD_LDFLAGS += $(ldflags-y)
 
-head-y         := arch/arc/kernel/head.o
-
 # w/o this dtb won't embed into kernel binary
 core-y         += arch/arc/boot/dts/
 
index 8c4fc4b54c1446b3bb41d4b035c405576ecfc53f..0723d888ac446a30c7355b9737b3070bb9900fa2 100644 (file)
@@ -3,7 +3,7 @@
 # Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (www.synopsys.com)
 #
 
-obj-y  := arcksyms.o setup.o irq.o reset.o ptrace.o process.o devtree.o
+obj-y  := head.o arcksyms.o setup.o irq.o reset.o ptrace.o process.o devtree.o
 obj-y  += signal.o traps.o sys.o troubleshoot.o stacktrace.o disasm.o
 obj-$(CONFIG_ISA_ARCOMPACT)            += entry-compact.o intc-compact.o
 obj-$(CONFIG_ISA_ARCV2)                        += entry-arcv2.o intc-arcv2.o
@@ -31,4 +31,4 @@ else
 obj-y += ctx_sw_asm.o
 endif
 
-extra-y := vmlinux.lds head.o
+extra-y := vmlinux.lds
index 0e04bc6b2ad3bc4d9d8c9d843b5408cf84ff4b82..c846119c448f0425a4ebee33c7983b89d3a1225d 100644 (file)
@@ -137,9 +137,6 @@ KBUILD_AFLAGS       +=$(CFLAGS_ABI) $(AFLAGS_ISA) $(arch-y) $(tune-y) -include asm/uni
 
 CHECKFLAGS     += -D__arm__
 
-#Default value
-head-y         := arch/arm/kernel/head$(MMUEXT).o
-
 # Text offset. This list is sorted numerically by address in order to
 # provide a means to avoid/resolve conflicts in multi-arch kernels.
 # Note: the 32kB below this value is reserved for use by the kernel
index 95034d32213c50106c7d0ae58b2b5dc7f852598e..48737ec800eb010356e18e586815d86b71840ff7 100644 (file)
@@ -88,7 +88,7 @@ obj-$(CONFIG_VDSO)            += vdso.o
 obj-$(CONFIG_EFI)              += efi.o
 obj-$(CONFIG_PARAVIRT) += paravirt.o
 
-head-y                 := head$(MMUEXT).o
+obj-y                  += head$(MMUEXT).o
 obj-$(CONFIG_DEBUG_LL) += debug.o
 obj-$(CONFIG_EARLY_PRINTK)     += early_printk.o
 obj-$(CONFIG_ARM_PATCH_PHYS_VIRT)      += phys2virt.o
@@ -108,4 +108,4 @@ obj-$(CONFIG_HAVE_ARM_SMCCC)        += smccc-call.o
 
 obj-$(CONFIG_GENERIC_CPU_VULNERABILITIES) += spectre.o
 
-extra-y := $(head-y) vmlinux.lds
+extra-y := vmlinux.lds
index a82bb3599094ba81413525c1d4c10921657b8f0c..5e56d26a223983546b383cdb90f4a2fbd5027833 100644 (file)
@@ -133,9 +133,6 @@ ifeq ($(CONFIG_DYNAMIC_FTRACE_WITH_REGS),y)
   CC_FLAGS_FTRACE := -fpatchable-function-entry=2
 endif
 
-# Default value
-head-y         := arch/arm64/kernel/head.o
-
 ifeq ($(CONFIG_KASAN_SW_TAGS), y)
 KASAN_SHADOW_SCALE_SHIFT := 4
 else ifeq ($(CONFIG_KASAN_GENERIC), y)
index 38a0b0291edb896796f2eb0ce063b229f6782792..2f361a883d8c93a138fabc5150e067d781fa870d 100644 (file)
@@ -86,8 +86,8 @@ $(obj)/vdso-wrap.o: $(obj)/vdso/vdso.so
 $(obj)/vdso32-wrap.o: $(obj)/vdso32/vdso.so
 
 obj-y                                  += probes/
-head-y                                 := head.o
-extra-y                                        += $(head-y) vmlinux.lds
+obj-y                                  += head.o
+extra-y                                        += vmlinux.lds
 
 ifeq ($(CONFIG_DEBUG_EFI),y)
 AFLAGS_head.o += -DVMLINUX_PATH="\"$(realpath $(objtree)/vmlinux)\""
index 4e1d619fd5c63d4e7f0342e3a9550d1bfb14da73..0e4237e55758b38aa2d9518ef26669c782571fc3 100644 (file)
@@ -59,8 +59,6 @@ LDFLAGS += -EL
 
 KBUILD_AFLAGS += $(KBUILD_CFLAGS)
 
-head-y := arch/csky/kernel/head.o
-
 core-y += arch/csky/$(CSKYABI)/
 
 libs-y += arch/csky/lib/ \
index 6f14c924b20d261f92280f9cc40c9da9359db034..8a868316b912bfbb387b7ed6b0a94c1e15367410 100644 (file)
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
-extra-y := head.o vmlinux.lds
+extra-y := vmlinux.lds
 
-obj-y += entry.o atomic.o signal.o traps.o irq.o time.o vdso.o vdso/
+obj-y += head.o entry.o atomic.o signal.o traps.o irq.o time.o vdso.o vdso/
 obj-y += power.o syscall.o syscall_table.o setup.o io.o
 obj-y += process.o cpu-probe.o ptrace.o stacktrace.o
 obj-y += probes/
index 44312bc147d83854ec85c649fe6b57734df0b6be..92d005958dfb232d48a4ca843b46262a84a08eb4 100644 (file)
@@ -32,5 +32,3 @@ KBUILD_LDFLAGS += $(ldflags-y)
 TIR_NAME := r19
 KBUILD_CFLAGS += -ffixed-$(TIR_NAME) -DTHREADINFO_REG=$(TIR_NAME) -D__linux__
 KBUILD_AFLAGS += -DTHREADINFO_REG=$(TIR_NAME)
-
-head-y := arch/hexagon/kernel/head.o
index fae3dce32fde81fc7767fe25a78577726fbe1156..e73cb321630ec218b2b25c669c97b2144d3ae3ad 100644 (file)
@@ -1,6 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0
-extra-y := head.o vmlinux.lds
+extra-y := vmlinux.lds
 
+obj-y += head.o
 obj-$(CONFIG_SMP) += smp.o
 
 obj-y += setup.o irq_cpu.o traps.o syscalltab.o signal.o time.o
index e55c2f138656abb82d8808ec2047d73568179d76..56c4bb276b6eda0e19c91fca6b2fd216be0e7467 100644 (file)
@@ -44,7 +44,6 @@ quiet_cmd_objcopy = OBJCOPY $@
 cmd_objcopy = $(OBJCOPY) $(OBJCOPYFLAGS) $(OBJCOPYFLAGS_$(@F)) $< $@
 
 KBUILD_CFLAGS += $(cflags-y)
-head-y := arch/ia64/kernel/head.o
 
 libs-y                         += arch/ia64/lib/
 
index 08d4a2ba06520fd5ba6a7a23e751d4985004bdaa..ae9ff07de4abe419f3fdf8f740d148de1436332b 100644 (file)
@@ -7,9 +7,9 @@ ifdef CONFIG_DYNAMIC_FTRACE
 CFLAGS_REMOVE_ftrace.o = -pg
 endif
 
-extra-y        := head.o vmlinux.lds
+extra-y        := vmlinux.lds
 
-obj-y := entry.o efi.o efi_stub.o gate-data.o fsys.o irq.o irq_ia64.o  \
+obj-y := head.o entry.o efi.o efi_stub.o gate-data.o fsys.o irq.o irq_ia64.o   \
         irq_lsapic.o ivt.o pal.o patch.o process.o ptrace.o sal.o              \
         salinfo.o setup.o signal.o sys_ia64.o time.o traps.o unaligned.o \
         unwind.o mca.o mca_asm.o topology.o dma-mapping.o iosapic.o acpi.o \
@@ -34,10 +34,7 @@ mca_recovery-y                       += mca_drv.o mca_drv_asm.o
 obj-$(CONFIG_IA64_MC_ERR_INJECT)+= err_inject.o
 obj-$(CONFIG_STACKTRACE)       += stacktrace.o
 
-obj-$(CONFIG_IA64_ESI)         += esi.o
-ifneq ($(CONFIG_IA64_ESI),)
-obj-y                          += esi_stub.o   # must be in kernel proper
-endif
+obj-$(CONFIG_IA64_ESI)         += esi.o esi_stub.o # must be in kernel proper
 obj-$(CONFIG_INTEL_IOMMU)      += pci-dma.o
 
 obj-$(CONFIG_ELF_CORE)         += elfcore.o
index 84689c3ee3af44c2143586e961a2a2bbefc6c05e..d592b9df95c4dc5dbbe7c40cc628b5a597068384 100644 (file)
@@ -79,8 +79,6 @@ CHECKFLAGS += $(shell $(CC) $(KBUILD_CFLAGS) -dM -E -x c /dev/null | \
        sed -e "s/^\#define /-D'/" -e "s/ /'='/" -e "s/$$/'/" -e 's/\$$/&&/g')
 endif
 
-head-y := arch/loongarch/kernel/head.o
-
 libs-y += arch/loongarch/lib/
 libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
 
index e5be17009fe8a4ba456bf2644888811d49ef4b93..6c33b5c45573f9d656c571e8e1bb418b07d2acf5 100644 (file)
@@ -3,9 +3,9 @@
 # Makefile for the Linux/LoongArch kernel.
 #
 
-extra-y                := head.o vmlinux.lds
+extra-y                := vmlinux.lds
 
-obj-y          += cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \
+obj-y          += head.o cpu-probe.o cacheinfo.o env.o setup.o entry.o genex.o \
                   traps.o irq.o idle.o process.o dma.o mem.o io.o reset.o switch.o \
                   elf.o syscall.o signal.o time.o topology.o inst.o ptrace.o vdso.o
 
index 674541fdf5b892f934253ac55cae3f4cb1a5484f..279560add5776261545b52a5e07ef49f56345413 100644 (file)
@@ -17,4 +17,4 @@ obj-$(CONFIG_DRAGEN2) += dragen2.o
 obj-$(CONFIG_UCSIMM)   += ucsimm.o
 obj-$(CONFIG_UCDIMM)   += ucsimm.o
 
-extra-y                := head.o
+obj-y                  += head.o
index e358605b70baafc5cebfbc09c96c9c60ffa5d6cb..43e39040d3ac6cd38a4bd4fc3dc04e03d5c71bf5 100644 (file)
@@ -86,15 +86,6 @@ ifdef CONFIG_KGDB
 KBUILD_CFLAGS := $(subst -fomit-frame-pointer,,$(KBUILD_CFLAGS)) -g
 endif
 
-#
-# Select the assembler head startup code. Order is important. The default
-# head code is first, processor specific selections can override it after.
-#
-head-y                         := arch/m68k/kernel/head.o
-head-$(CONFIG_SUN3)            := arch/m68k/kernel/sun3-head.o
-head-$(CONFIG_M68000)          := arch/m68k/68000/head.o
-head-$(CONFIG_COLDFIRE)                := arch/m68k/coldfire/head.o
-
 libs-y                         += arch/m68k/lib/
 
 
index 9419a6c1f036dd6f304dafecdf375928786d7ad5..c56bc0dc7f2e338c8275cfd15656f80e78825254 100644 (file)
@@ -45,4 +45,4 @@ obj-$(CONFIG_STMARK2) += stmark2.o
 obj-$(CONFIG_PCI)      += pci.o
 
 obj-y                  += gpio.o
-extra-y := head.o
+obj-y                  += head.o
index c0833da6a2ca6b8f608267ad6aa41c363faccca6..af015447dfb4c1f98e12830b8ff9d8e5d774a484 100644 (file)
@@ -3,19 +3,20 @@
 # Makefile for the linux kernel.
 #
 
-extra-$(CONFIG_AMIGA)  := head.o
-extra-$(CONFIG_ATARI)  := head.o
-extra-$(CONFIG_MAC)    := head.o
-extra-$(CONFIG_APOLLO) := head.o
-extra-$(CONFIG_VME)    := head.o
-extra-$(CONFIG_HP300)  := head.o
-extra-$(CONFIG_Q40)    := head.o
-extra-$(CONFIG_SUN3X)  := head.o
-extra-$(CONFIG_VIRT)   := head.o
-extra-$(CONFIG_SUN3)   := sun3-head.o
 extra-y                        += vmlinux.lds
 
-obj-y  := entry.o irq.o module.o process.o ptrace.o
+obj-$(CONFIG_AMIGA)    := head.o
+obj-$(CONFIG_ATARI)    := head.o
+obj-$(CONFIG_MAC)      := head.o
+obj-$(CONFIG_APOLLO)   := head.o
+obj-$(CONFIG_VME)      := head.o
+obj-$(CONFIG_HP300)    := head.o
+obj-$(CONFIG_Q40)      := head.o
+obj-$(CONFIG_SUN3X)    := head.o
+obj-$(CONFIG_VIRT)     := head.o
+obj-$(CONFIG_SUN3)     := sun3-head.o
+
+obj-y  += entry.o irq.o module.o process.o ptrace.o
 obj-y  += setup.o signal.o sys_m68k.o syscalltable.o time.o traps.o
 
 obj-$(CONFIG_MMU_MOTOROLA) += ints.o vectors.o
index 1826d9ce4459e9491cc2b414c3a6da9ac36e06f2..3f8a86c4336a86329728678fcbc0a8d3d1380686 100644 (file)
@@ -48,7 +48,6 @@ CPUFLAGS-1 += $(call cc-option,-mcpu=v$(CPU_VER))
 # r31 holds current when in kernel mode
 KBUILD_CFLAGS += -ffixed-r31 $(CPUFLAGS-y) $(CPUFLAGS-1) $(CPUFLAGS-2)
 
-head-y := arch/microblaze/kernel/head.o
 libs-y += arch/microblaze/lib/
 
 boot := arch/microblaze/boot
index 15a20eb814cef263976023c4bcee4823407a5cfe..4393bee64eaf80b5a3d2dee8aa59d31fdccf295b 100644 (file)
@@ -12,9 +12,9 @@ CFLAGS_REMOVE_ftrace.o = -pg
 CFLAGS_REMOVE_process.o = -pg
 endif
 
-extra-y := head.o vmlinux.lds
+extra-y := vmlinux.lds
 
-obj-y += dma.o exceptions.o \
+obj-y += head.o dma.o exceptions.o \
        hw_exception_handler.o irq.o \
        process.o prom.o ptrace.o \
        reset.o setup.o signal.o sys_microblaze.o timer.o traps.o unwind.o
index 4d2a3e73fc45b61b3001e6feef1e0c3f114182a4..b296e33f8e333ad518ac74d7d2a77d444149d778 100644 (file)
@@ -324,8 +324,6 @@ endif
 
 OBJCOPYFLAGS           += --remove-section=.reginfo
 
-head-y := arch/mips/kernel/head.o
-
 libs-y                 += arch/mips/lib/
 libs-$(CONFIG_MIPS_FP_SUPPORT) += arch/mips/math-emu/
 
index 7c96282bff2e3d8171f6ecec016eb424881cea5f..5d1addac5e284cfdc3e7c177773f39ff27158c2c 100644 (file)
@@ -3,9 +3,9 @@
 # Makefile for the Linux/MIPS kernel.
 #
 
-extra-y                := head.o vmlinux.lds
+extra-y                := vmlinux.lds
 
-obj-y          += branch.o cmpxchg.o elf.o entry.o genex.o idle.o irq.o \
+obj-y          += head.o branch.o cmpxchg.o elf.o entry.o genex.o idle.o irq.o \
                   process.o prom.o ptrace.o reset.o setup.o signal.o \
                   syscall.o time.o topology.o traps.o unaligned.o watch.o \
                   vdso.o cacheinfo.o
index 4e39f7abdeb6dc90d4018a927f11f139515a4ce8..fc2952edd2dec40f3b6c136a02f89d4068d56a63 100644 (file)
@@ -1,4 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
 
+obj-y += kernel/ mm/ platform/ boot/dts/
+
 # for cleaning
 subdir- += boot
index d6a7499b814c9364eddeb7354b017872fa5a712c..f1ff4ce0f1a2cf4e5b9674dffaf533bd2787d882 100644 (file)
@@ -37,10 +37,7 @@ KBUILD_CFLAGS += -DUTS_SYSNAME=\"$(UTS_SYSNAME)\"
 KBUILD_CFLAGS += -fno-builtin
 KBUILD_CFLAGS += -G 0
 
-head-y         := arch/nios2/kernel/head.o
 libs-y         += arch/nios2/lib/ $(LIBGCC)
-core-y         += arch/nios2/kernel/ arch/nios2/mm/
-core-y         += arch/nios2/platform/
 
 INSTALL_PATH ?= /tftpboot
 nios2-boot := arch/$(ARCH)/boot
@@ -48,8 +45,6 @@ BOOT_TARGETS = vmImage zImage
 PHONY += $(BOOT_TARGETS) install
 KBUILD_IMAGE := $(nios2-boot)/vmImage
 
-core-y += $(nios2-boot)/dts/
-
 all: vmImage
 
 $(BOOT_TARGETS): vmlinux
index 0b645e1e3158e8e5fa4004621859643ea1090f3d..78a913181fa19dece7f9b746f6a22435315c3b61 100644 (file)
@@ -3,9 +3,9 @@
 # Makefile for the nios2 linux kernel.
 #
 
-extra-y        += head.o
 extra-y        += vmlinux.lds
 
+obj-y  += head.o
 obj-y  += cpuinfo.o
 obj-y  += entry.o
 obj-y  += insnemu.o
index b446510173cde94ba0ab9bf79a20a98c5d638c42..68249521db5ab6afd87663df9dae22f1db71e72a 100644 (file)
@@ -55,8 +55,6 @@ ifeq ($(CONFIG_OPENRISC_HAVE_INST_SEXT),y)
        KBUILD_CFLAGS += $(call cc-option,-msext)
 endif
 
-head-y                 := arch/openrisc/kernel/head.o
-
 libs-y         += $(LIBGCC)
 
 PHONY += vmlinux.bin
index 2d172e79f58d014f344446d8849bb7645dfabd7a..79129161f3e031be9aae62bc78242b8fa542e893 100644 (file)
@@ -3,9 +3,9 @@
 # Makefile for the linux kernel.
 #
 
-extra-y        := head.o vmlinux.lds
+extra-y        := vmlinux.lds
 
-obj-y  := setup.o or32_ksyms.o process.o dma.o \
+obj-y  := head.o setup.o or32_ksyms.o process.o dma.o \
           traps.o time.o irq.o entry.o ptrace.o signal.o \
           sys_call_table.o unwinder.o
 
index e38d993d87f2166abc60d883eddc1e1426889aa8..a2d8600521f9320e908828f2ed87315556e02106 100644 (file)
@@ -113,8 +113,6 @@ cflags-$(CONFIG_PA7100LC)   += -march=1.1 -mschedule=7100LC
 cflags-$(CONFIG_PA7300LC)      += -march=1.1 -mschedule=7300
 cflags-$(CONFIG_PA8X00)                += -march=2.0 -mschedule=8000
 
-head-y                 := arch/parisc/kernel/head.o 
-
 KBUILD_CFLAGS  += $(cflags-y)
 LIBGCC         := $(shell $(CC) -print-libgcc-file-name)
 export LIBGCC
index d0bfac89a84272e1e8ae621ee4dc70b41ed6dbf3..3d138c9cf9ce9ebe9a68591831e676d605164dc3 100644 (file)
@@ -3,9 +3,9 @@
 # Makefile for arch/parisc/kernel
 #
 
-extra-y                        := head.o vmlinux.lds
+extra-y                := vmlinux.lds
 
-obj-y          := cache.o pacache.o setup.o pdt.o traps.o time.o irq.o \
+obj-y          := head.o cache.o pacache.o setup.o pdt.o traps.o time.o irq.o \
                   pa7300lc.o syscall.o entry.o sys_parisc.o firmware.o \
                   ptrace.o hardware.o inventory.o drivers.o alternative.o \
                   signal.o hpmc.o real2.o parisc_ksyms.o unaligned.o \
index 19470d29de163d93dcd29db02a26b3f10e0dfb5c..dc4cbf0a5ca953bbf0498c08e54166aa10e41124 100644 (file)
@@ -232,18 +232,6 @@ KBUILD_CFLAGS += $(cpu-as-y)
 KBUILD_AFLAGS += $(aflags-y)
 KBUILD_CFLAGS += $(cflags-y)
 
-head-$(CONFIG_PPC64)           := arch/powerpc/kernel/head_64.o
-head-$(CONFIG_PPC_BOOK3S_32)   := arch/powerpc/kernel/head_book3s_32.o
-head-$(CONFIG_PPC_8xx)         := arch/powerpc/kernel/head_8xx.o
-head-$(CONFIG_40x)             := arch/powerpc/kernel/head_40x.o
-head-$(CONFIG_44x)             := arch/powerpc/kernel/head_44x.o
-head-$(CONFIG_PPC_85xx)        := arch/powerpc/kernel/head_85xx.o
-
-head-$(CONFIG_PPC64)           += arch/powerpc/kernel/entry_64.o
-head-$(CONFIG_PPC_FPU)         += arch/powerpc/kernel/fpu.o
-head-$(CONFIG_ALTIVEC)         += arch/powerpc/kernel/vector.o
-head-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE)  += arch/powerpc/kernel/prom_init.o
-
 # Default to zImage, override when needed
 all: zImage
 
index 55978f32fa7751373b24868e93603d57ad916d00..5bdd4dd20bbb18e5d360b7ad12b14e0c12494e3b 100755 (executable)
@@ -433,7 +433,7 @@ fi
 # Extract kernel version information, some platforms want to include
 # it in the image header
 version=`${CROSS}strings "$kernel" | grep '^Linux version [-0-9.]' | \
-    cut -d' ' -f3`
+    head -n1 | cut -d' ' -f3`
 if [ -n "$version" ]; then
     uboot_version="-n Linux-$version"
 fi
index 1f121c1888051f8bb464f23b4f6f39dd8bd3f34f..68ea30fb373e97a0af0f8390ab0b67611289a0db 100644 (file)
@@ -116,12 +116,12 @@ obj-$(CONFIG_PPC_E500)            += cpu_setup_e500.o
 obj-$(CONFIG_PPC_DOORBELL)     += dbell.o
 obj-$(CONFIG_JUMP_LABEL)       += jump_label.o
 
-extra-$(CONFIG_PPC64)          := head_64.o
-extra-$(CONFIG_PPC_BOOK3S_32)  := head_book3s_32.o
-extra-$(CONFIG_40x)            := head_40x.o
-extra-$(CONFIG_44x)            := head_44x.o
-extra-$(CONFIG_PPC_85xx)       := head_85xx.o
-extra-$(CONFIG_PPC_8xx)                := head_8xx.o
+obj-$(CONFIG_PPC64)            += head_64.o
+obj-$(CONFIG_PPC_BOOK3S_32)    += head_book3s_32.o
+obj-$(CONFIG_40x)              += head_40x.o
+obj-$(CONFIG_44x)              += head_44x.o
+obj-$(CONFIG_PPC_8xx)          += head_8xx.o
+obj-$(CONFIG_FSL_BOOKE)                += head_85xx.o
 extra-y                                += vmlinux.lds
 
 obj-$(CONFIG_RELOCATABLE)      += reloc_$(BITS).o
@@ -196,10 +196,10 @@ KCOV_INSTRUMENT_paca.o := n
 CFLAGS_setup_64.o              += -fno-stack-protector
 CFLAGS_paca.o                  += -fno-stack-protector
 
-extra-$(CONFIG_PPC_FPU)                += fpu.o
-extra-$(CONFIG_ALTIVEC)                += vector.o
-extra-$(CONFIG_PPC64)          += entry_64.o
-extra-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += prom_init.o
+obj-$(CONFIG_PPC_FPU)          += fpu.o
+obj-$(CONFIG_ALTIVEC)          += vector.o
+obj-$(CONFIG_PPC64)            += entry_64.o
+obj-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE)   += prom_init.o
 
 extra-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += prom_init_check
 
index d63295e213731b46040fcf4251acc1b889e4a7c9..e9bd21816ea91883da010686265544d214fdacc6 100644 (file)
@@ -110,8 +110,6 @@ else
 KBUILD_IMAGE   := $(boot)/Image.gz
 endif
 
-head-y := arch/riscv/kernel/head.o
-
 libs-y += arch/riscv/lib/
 libs-$(CONFIG_EFI_STUB) += $(objtree)/drivers/firmware/efi/libstub/lib.a
 
index 33bb60a354cd20633fd40cd8b5faa01c407d3814..db6e4b1294ba3761bed0a3e1a249dd2ac7e2d25e 100644 (file)
@@ -28,9 +28,9 @@ KASAN_SANITIZE_cpufeature.o := n
 endif
 endif
 
-extra-y += head.o
 extra-y += vmlinux.lds
 
+obj-y  += head.o
 obj-y  += soc.o
 obj-$(CONFIG_RISCV_ALTERNATIVE) += alternative.o
 obj-y  += cpu.o
index 4cb5d17e7ead620ee1a84db0347cf68f18a009c9..de6d8b2ea4d8f86e0551bb762893df4228553634 100644 (file)
@@ -119,8 +119,6 @@ export KBUILD_CFLAGS_DECOMPRESSOR
 
 OBJCOPYFLAGS   := -O binary
 
-head-y         := arch/s390/kernel/head64.o
-
 libs-y         += arch/s390/lib/
 drivers-y      += drivers/s390/
 
index d32e58bdda6ad2c7c15c8f104a4234f99eefb77b..fd32f038777f43e9a0cd0bd0b7c38c1ea76adc45 100644 (file)
@@ -1,4 +1,5 @@
 // SPDX-License-Identifier: GPL-2.0
+#include <generated/utsversion.h>
 #include <generated/utsrelease.h>
 #include <generated/compile.h>
 #include "boot.h"
index 70b776863f8489aee587a190831500a5309d4f08..5e6a23299790ffdf91f02fcf79b015410edf665e 100644 (file)
@@ -33,7 +33,7 @@ CFLAGS_stacktrace.o   += -fno-optimize-sibling-calls
 CFLAGS_dumpstack.o     += -fno-optimize-sibling-calls
 CFLAGS_unwind_bc.o     += -fno-optimize-sibling-calls
 
-obj-y  := traps.o time.o process.o earlypgm.o early.o setup.o idle.o vtime.o
+obj-y  := head64.o traps.o time.o process.o earlypgm.o early.o setup.o idle.o vtime.o
 obj-y  += processor.o syscall.o ptrace.o signal.o cpcmd.o ebcdic.o nmi.o
 obj-y  += debug.o irq.o ipl.o dis.o diag.o vdso.o cpufeature.o
 obj-y  += sysinfo.o lgr.o os_info.o machine_kexec.o
@@ -42,7 +42,7 @@ obj-y += entry.o reipl.o relocate_kernel.o kdebugfs.o alternative.o
 obj-y  += nospec-branch.o ipl_vmparm.o machine_kexec_reloc.o unwind_bc.o
 obj-y  += smp.o text_amode31.o stacktrace.o abs_lowcore.o
 
-extra-y                                += head64.o vmlinux.lds
+extra-y                                += vmlinux.lds
 
 obj-$(CONFIG_SYSFS)            += nospec-sysfs.o
 CFLAGS_REMOVE_nospec-branch.o  += $(CC_FLAGS_EXPOLINE)
index b39412bf91fb0afafee74140321d5d328be74290..5c8776482530c35a653f888fd05da38da5ab197a 100644 (file)
@@ -114,8 +114,6 @@ endif
 
 export ld-bfd
 
-head-y := arch/sh/kernel/head_32.o
-
 # Mach groups
 machdir-$(CONFIG_SOLUTION_ENGINE)              += mach-se
 machdir-$(CONFIG_SH_HP6XX)                     += mach-hp6xx
index aa0fbc9202b14e89464a82e22691619b1812c215..69cd9ac4b2ab8a55c290a42d52bb4cfc0f4926ba 100644 (file)
@@ -3,7 +3,7 @@
 # Makefile for the Linux/SuperH kernel.
 #
 
-extra-y        := head_32.o vmlinux.lds
+extra-y        := vmlinux.lds
 
 ifdef CONFIG_FUNCTION_TRACER
 # Do not profile debug and lowlevel utilities
@@ -12,7 +12,7 @@ endif
 
 CFLAGS_REMOVE_return_address.o = -pg
 
-obj-y  := debugtraps.o dumpstack.o             \
+obj-y  := head_32.o debugtraps.o dumpstack.o                           \
           idle.o io.o irq.o irq_32.o kdebugfs.o                        \
           machvec.o nmi_debug.o process.o                              \
           process_32.o ptrace.o ptrace_32.o                            \
index fe58a410b4ce68379acf754e44dcb423b5455c81..a4ea5b05f2885712834ef68902937d720640b1a5 100644 (file)
@@ -56,8 +56,6 @@ endif
 
 endif
 
-head-y                 := arch/sparc/kernel/head_$(BITS).o
-
 libs-y                 += arch/sparc/prom/
 libs-y                 += arch/sparc/lib/
 
index 620c0c5b749bbbf4ff8ffc35c6e4328f43b2253e..0984bb6f0f17b177b6b368911a5efd5069b5e0ac 100644 (file)
@@ -7,8 +7,6 @@
 asflags-y := -ansi
 ccflags-y := -Werror
 
-extra-y     := head_$(BITS).o
-
 # Undefine sparc when processing vmlinux.lds - it is used
 # And teach CPP we are doing $(BITS) builds (for this case)
 CPPFLAGS_vmlinux.lds := -Usparc -m$(BITS)
@@ -22,6 +20,7 @@ CFLAGS_REMOVE_perf_event.o := -pg
 CFLAGS_REMOVE_pcr.o := -pg
 endif
 
+obj-y                   := head_$(BITS).o
 obj-$(CONFIG_SPARC64)   += urtt_fill.o
 obj-$(CONFIG_SPARC32)   += entry.o wof.o wuf.o
 obj-$(CONFIG_SPARC32)   += etrap_32.o
index 2d7e640674c678063756460bf812050f2b2bb027..415a5d138de47c37c90890a71056775d023f5d7d 100644 (file)
@@ -244,11 +244,6 @@ archheaders:
 ###
 # Kernel objects
 
-head-y := arch/x86/kernel/head_$(BITS).o
-head-y += arch/x86/kernel/head$(BITS).o
-head-y += arch/x86/kernel/ebda.o
-head-y += arch/x86/kernel/platform-quirks.o
-
 libs-y  += arch/x86/lib/
 
 # drivers-y are linked after core-y
index 4a3f223973f40f85bc633359f1a41c92ce6ca084..e476bcbd9b422f6e2a980b59ac59d4e0cb30ce0d 100644 (file)
@@ -29,6 +29,7 @@
 #include <linux/uts.h>
 #include <linux/utsname.h>
 #include <linux/ctype.h>
+#include <generated/utsversion.h>
 #include <generated/utsrelease.h>
 
 #define _SETUP
index a1aaaf6c06a6434d0f8a6b5a8defdc34f225616d..945383f0f606abb850df5442d8cca356d6380042 100644 (file)
@@ -11,6 +11,7 @@
  */
 
 #include "boot.h"
+#include <generated/utsversion.h>
 #include <generated/utsrelease.h>
 #include <generated/compile.h>
 
index 1286a73ebdbc5366d5475b19a224e1584a0a717f..f4479f6415d75e3e45d6c867e288eb3fcda99edb 100644 (file)
@@ -3,10 +3,6 @@
 # Makefile for the linux kernel.
 #
 
-extra-y        := head_$(BITS).o
-extra-y        += head$(BITS).o
-extra-y        += ebda.o
-extra-y        += platform-quirks.o
 extra-y        += vmlinux.lds
 
 CPPFLAGS_vmlinux.lds += -U$(UTS_MACHINE)
@@ -42,7 +38,11 @@ KCOV_INSTRUMENT              := n
 
 CFLAGS_irq.o := -I $(srctree)/$(src)/../include/asm/trace
 
-obj-y                  := process_$(BITS).o signal.o
+obj-y                  += head_$(BITS).o
+obj-y                  += head$(BITS).o
+obj-y                  += ebda.o
+obj-y                  += platform-quirks.o
+obj-y                  += process_$(BITS).o signal.o
 obj-$(CONFIG_COMPAT)   += signal_compat.o
 obj-y                  += traps.o idt.o irq.o irq_$(BITS).o dumpstack_$(BITS).o
 obj-y                  += time.o ioport.o dumpstack.o nmi.o
index 5097caa7bf0cfa114c761c2af685bdb5558ee008..bfd8e433ed621e89366ddaabb80bb9d0672d2b89 100644 (file)
@@ -55,8 +55,6 @@ KBUILD_CPPFLAGS += $(patsubst %,-I$(srctree)/%include,$(vardirs) $(plfdirs))
 
 KBUILD_DEFCONFIG := iss_defconfig
 
-head-y         := arch/xtensa/kernel/head.o
-
 libs-y         += arch/xtensa/lib/
 
 boot           := arch/xtensa/boot
index 897c1c7410589826be38626288be77afa3dc41e9..f28b8e3d717eee087bad79ee1db79bf1d9928507 100644 (file)
@@ -3,9 +3,9 @@
 # Makefile for the Linux/Xtensa kernel.
 #
 
-extra-y := head.o vmlinux.lds
+extra-y := vmlinux.lds
 
-obj-y := align.o coprocessor.o entry.o irq.o platform.o process.o \
+obj-y := head.o align.o coprocessor.o entry.o irq.o platform.o process.o \
         ptrace.o setup.o signal.o stacktrace.o syscall.o time.o traps.o \
         vectors.o
 
index cb81ed2fbd539ec08d7993cd2bb5b1ffee7ff81a..d70838edba801a128d1e52ef97c2d7cce1610713 100644 (file)
@@ -34,7 +34,7 @@ dml_ccflags := -mhard-float -maltivec
 endif
 
 ifdef CONFIG_CC_IS_GCC
-ifeq ($(call cc-ifversion, -lt, 0701, y), y)
+ifneq ($(call gcc-min-version, 70100),y)
 IS_OLD_GCC = 1
 endif
 endif
index c2b1d4fd5987330021bb4c161fa034b2dc7ec15f..fe7e6ba918f108d0de45193bff987bde136ef340 100644 (file)
 #include <linux/compiler.h>
 #include <linux/types.h>
 
-/* __used is needed to keep __crc_* for LTO */
 #define SYMBOL_CRC(sym, crc, sec)   \
-       u32 __section("___kcrctab" sec "+" #sym) __used __crc_##sym = crc
+       asm(".section \"___kcrctab" sec "+" #sym "\",\"a\""     "\n" \
+           "__crc_" #sym ":"                                   "\n" \
+           ".long " #crc                                       "\n" \
+           ".previous"                                         "\n")
 
 #endif /* __LINUX_EXPORT_INTERNAL_H__ */
diff --git a/init/.gitignore b/init/.gitignore
new file mode 100644 (file)
index 0000000..cbbe270
--- /dev/null
@@ -0,0 +1,2 @@
+# SPDX-License-Identifier: GPL-2.0-only
+/utsversion-tmp.h
index d82623d7fc8e8c89d6442dfa15feac384a9ec2c4..8316c23bead26814a724e311c41d1b9c5431c86c 100644 (file)
@@ -19,20 +19,43 @@ mounts-y                    := do_mounts.o
 mounts-$(CONFIG_BLK_DEV_RAM)   += do_mounts_rd.o
 mounts-$(CONFIG_BLK_DEV_INITRD)        += do_mounts_initrd.o
 
-# dependencies on generated files need to be listed explicitly
-$(obj)/version.o: include/generated/compile.h
-
-# compile.h changes depending on hostname, generation number, etc,
-# so we regenerate it always.
-# mkcompile_h will make sure to only update the
-# actual file if its content has changed.
-
-quiet_cmd_compile.h = CHK     $@
-      cmd_compile.h = \
-       $(CONFIG_SHELL) $(srctree)/scripts/mkcompile_h $@       \
-       "$(UTS_MACHINE)" "$(CONFIG_SMP)" "$(CONFIG_PREEMPT_BUILD)"      \
-       "$(CONFIG_PREEMPT_DYNAMIC)" "$(CONFIG_PREEMPT_RT)" \
-       "$(CONFIG_CC_VERSION_TEXT)" "$(LD)"
-
-include/generated/compile.h: FORCE
-       $(call cmd,compile.h)
+#
+# UTS_VERSION
+#
+
+smp-flag-$(CONFIG_SMP)                 := SMP
+preempt-flag-$(CONFIG_PREEMPT_BUILD)   := PREEMPT
+preempt-flag-$(CONFIG_PREEMPT_DYNAMIC) := PREEMPT_DYNAMIC
+preempt-flag-$(CONFIG_PREEMPT_RT)      := PREEMPT_RT
+
+build-version = $(or $(KBUILD_BUILD_VERSION), $(build-version-auto))
+build-timestamp = $(or $(KBUILD_BUILD_TIMESTAMP), $(build-timestamp-auto))
+
+# Maximum length of UTS_VERSION is 64 chars
+filechk_uts_version = \
+       utsver=$$(echo '$(pound)'"$(build-version)" $(smp-flag-y) $(preempt-flag-y) "$(build-timestamp)" | cut -b -64); \
+       echo '$(pound)'define UTS_VERSION \""$${utsver}"\"
+
+#
+# Build version.c with temporary UTS_VERSION
+#
+
+$(obj)/utsversion-tmp.h: FORCE
+       $(call filechk,uts_version)
+
+clean-files += utsversion-tmp.h
+
+$(obj)/version.o: $(obj)/utsversion-tmp.h
+CFLAGS_version.o := -include $(obj)/utsversion-tmp.h
+
+#
+# Build version-timestamp.c with final UTS_VERSION
+#
+
+include/generated/utsversion.h: build-version-auto = $(shell $(srctree)/$(src)/build-version)
+include/generated/utsversion.h: build-timestamp-auto = $(shell LC_ALL=C date)
+include/generated/utsversion.h: FORCE
+       $(call filechk,uts_version)
+
+$(obj)/version-timestamp.o: include/generated/utsversion.h
+CFLAGS_version-timestamp.o := -include include/generated/utsversion.h
diff --git a/init/build-version b/init/build-version
new file mode 100755 (executable)
index 0000000..537d458
--- /dev/null
@@ -0,0 +1,10 @@
+#!/bin/sh
+# SPDX-License-Identifier: GPL-2.0-only
+
+prev_ver=$(cat .version 2>/dev/null) &&
+ver=$(expr ${prev_ver} + 1 2>/dev/null) ||
+ver=1
+
+echo ${ver} > .version
+
+echo ${ver}
diff --git a/init/version-timestamp.c b/init/version-timestamp.c
new file mode 100644 (file)
index 0000000..179e93b
--- /dev/null
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-only
+
+#include <generated/compile.h>
+#include <generated/utsrelease.h>
+#include <linux/version.h>
+#include <linux/proc_ns.h>
+#include <linux/refcount.h>
+#include <linux/uts.h>
+#include <linux/utsname.h>
+
+struct uts_namespace init_uts_ns = {
+       .ns.count = REFCOUNT_INIT(2),
+       .name = {
+               .sysname        = UTS_SYSNAME,
+               .nodename       = UTS_NODENAME,
+               .release        = UTS_RELEASE,
+               .version        = UTS_VERSION,
+               .machine        = UTS_MACHINE,
+               .domainname     = UTS_DOMAINNAME,
+       },
+       .user_ns = &init_user_ns,
+       .ns.inum = PROC_UTS_INIT_INO,
+#ifdef CONFIG_UTS_NS
+       .ns.ops = &utsns_operations,
+#endif
+};
+
+/* FIXED STRINGS! Don't touch! */
+const char linux_banner[] =
+       "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
+       LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
index b7f9559d417c74858220ac324b1a1e1ce2b09119..01d4ab05f0bac09c820b2379e5f0abf70c778cfc 100644 (file)
 #include <linux/uts.h>
 #include <linux/utsname.h>
 #include <generated/utsrelease.h>
-#include <linux/version.h>
 #include <linux/proc_ns.h>
 
-struct uts_namespace init_uts_ns = {
-       .ns.count = REFCOUNT_INIT(2),
-       .name = {
-               .sysname        = UTS_SYSNAME,
-               .nodename       = UTS_NODENAME,
-               .release        = UTS_RELEASE,
-               .version        = UTS_VERSION,
-               .machine        = UTS_MACHINE,
-               .domainname     = UTS_DOMAINNAME,
-       },
-       .user_ns = &init_user_ns,
-       .ns.inum = PROC_UTS_INIT_INO,
-#ifdef CONFIG_UTS_NS
-       .ns.ops = &utsns_operations,
-#endif
-};
-EXPORT_SYMBOL_GPL(init_uts_ns);
-
 static int __init early_hostname(char *arg)
 {
        size_t bufsize = sizeof(init_uts_ns.name.nodename);
@@ -52,11 +33,6 @@ static int __init early_hostname(char *arg)
 }
 early_param("hostname", early_hostname);
 
-/* FIXED STRINGS! Don't touch! */
-const char linux_banner[] =
-       "Linux version " UTS_RELEASE " (" LINUX_COMPILE_BY "@"
-       LINUX_COMPILE_HOST ") (" LINUX_COMPILER ") " UTS_VERSION "\n";
-
 const char linux_proc_banner[] =
        "%s version %s"
        " (" LINUX_COMPILE_BY "@" LINUX_COMPILE_HOST ")"
@@ -64,3 +40,16 @@ const char linux_proc_banner[] =
 
 BUILD_SALT;
 BUILD_LTO_INFO;
+
+/*
+ * init_uts_ns and linux_banner contain the build version and timestamp,
+ * which are really fixed at the very last step of build process.
+ * They are compiled with __weak first, and without __weak later.
+ */
+
+struct uts_namespace init_uts_ns __weak;
+const char linux_banner[] __weak;
+
+#include "version-timestamp.c"
+
+EXPORT_SYMBOL_GPL(init_uts_ns);
index 0c78e64f747df590616a2e7a8da4d8a08c379b41..473036b43c832b2a94c8eef8edb9ef82c11b9a6c 100755 (executable)
@@ -31,8 +31,8 @@ if [ "$building_out_of_srctree" ]; then
 fi
 all_dirs="$all_dirs $dir_list"
 
-# include/generated/compile.h is ignored because it is touched even when none
-# of the source files changed.
+# include/generated/utsversion.h is ignored because it is generated after this
+# script is executed. (utsversion.h is unneeded for kheaders)
 #
 # When Kconfig regenerates include/generated/autoconf.h, its timestamp is
 # updated, but the contents might be still the same. When any CONFIG option is
@@ -42,7 +42,7 @@ all_dirs="$all_dirs $dir_list"
 #
 # Ignore them for md5 calculation to avoid pointless regeneration.
 headers_md5="$(find $all_dirs -name "*.h"                      |
-               grep -v "include/generated/compile.h"   |
+               grep -v "include/generated/utsversion.h"        |
                grep -v "include/generated/autoconf.h"  |
                xargs ls -l | md5sum | cut -d ' ' -f1)"
 
index dc1ab2ed1dc6e7d19b9aa492081da04d6a40fee2..3ea8941ab18d481413e9acc86aca76b824e76532 100644 (file)
@@ -343,12 +343,16 @@ config LZ4HC_COMPRESS
 config LZ4_DECOMPRESS
        tristate
 
-config ZSTD_COMPRESS
+config ZSTD_COMMON
        select XXHASH
        tristate
 
+config ZSTD_COMPRESS
+       select ZSTD_COMMON
+       tristate
+
 config ZSTD_DECOMPRESS
-       select XXHASH
+       select ZSTD_COMMON
        tristate
 
 source "lib/xz/Kconfig"
index fc45339fc3a3659e56d112979891a619f8b862cb..440bd0007ae207dcf17a211aeac2f87f60204825 100644 (file)
 # ################################################################
 obj-$(CONFIG_ZSTD_COMPRESS) += zstd_compress.o
 obj-$(CONFIG_ZSTD_DECOMPRESS) += zstd_decompress.o
+obj-$(CONFIG_ZSTD_COMMON) += zstd_common.o
 
 zstd_compress-y := \
                zstd_compress_module.o \
-               common/debug.o \
-               common/entropy_common.o \
-               common/error_private.o \
-               common/fse_decompress.o \
-               common/zstd_common.o \
                compress/fse_compress.o \
                compress/hist.o \
                compress/huf_compress.o \
@@ -33,12 +29,14 @@ zstd_compress-y := \
 
 zstd_decompress-y := \
                zstd_decompress_module.o \
+               decompress/huf_decompress.o \
+               decompress/zstd_ddict.o \
+               decompress/zstd_decompress.o \
+               decompress/zstd_decompress_block.o \
+
+zstd_common-y := \
                common/debug.o \
                common/entropy_common.o \
                common/error_private.o \
                common/fse_decompress.o \
                common/zstd_common.o \
-               decompress/huf_decompress.o \
-               decompress/zstd_ddict.o \
-               decompress/zstd_decompress.o \
-               decompress/zstd_decompress_block.o \
index 53b47a2b52ff21b14d221510edea599ae2cd0285..a311808c0d5662155f156d06d771b169018c69f9 100644 (file)
@@ -15,6 +15,7 @@
 /* *************************************
 *  Dependencies
 ***************************************/
+#include <linux/module.h>
 #include "mem.h"
 #include "error_private.h"       /* ERR_*, ERROR */
 #define FSE_STATIC_LINKING_ONLY  /* FSE_MIN_TABLELOG */
@@ -239,7 +240,7 @@ size_t FSE_readNCount(
 {
     return FSE_readNCount_bmi2(normalizedCounter, maxSVPtr, tableLogPtr, headerBuffer, hbSize, /* bmi2 */ 0);
 }
-
+EXPORT_SYMBOL_GPL(FSE_readNCount);
 
 /*! HUF_readStats() :
     Read compact Huffman tree, saved by HUF_writeCTable().
@@ -255,6 +256,7 @@ size_t HUF_readStats(BYTE* huffWeight, size_t hwSize, U32* rankStats,
     U32 wksp[HUF_READ_STATS_WORKSPACE_SIZE_U32];
     return HUF_readStats_wksp(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, wksp, sizeof(wksp), /* bmi2 */ 0);
 }
+EXPORT_SYMBOL_GPL(HUF_readStats);
 
 FORCE_INLINE_TEMPLATE size_t
 HUF_readStats_body(BYTE* huffWeight, size_t hwSize, U32* rankStats,
@@ -355,3 +357,4 @@ size_t HUF_readStats_wksp(BYTE* huffWeight, size_t hwSize, U32* rankStats,
     (void)bmi2;
     return HUF_readStats_body_default(huffWeight, hwSize, rankStats, nbSymbolsPtr, tableLogPtr, src, srcSize, workSpace, wkspSize);
 }
+EXPORT_SYMBOL_GPL(HUF_readStats_wksp);
index 3d7e35b309b5d10e8a7d8f408f722b24006bb6ba..0f1f63be25d9fd5b038cce0e424ae9b44614bb11 100644 (file)
@@ -13,6 +13,7 @@
 /*-*************************************
 *  Dependencies
 ***************************************/
+#include <linux/module.h>
 #define ZSTD_DEPS_NEED_MALLOC
 #include "zstd_deps.h"   /* ZSTD_malloc, ZSTD_calloc, ZSTD_free, ZSTD_memset */
 #include "error_private.h"
@@ -35,14 +36,17 @@ const char* ZSTD_versionString(void) { return ZSTD_VERSION_STRING; }
  *  tells if a return value is an error code
  *  symbol is required for external callers */
 unsigned ZSTD_isError(size_t code) { return ERR_isError(code); }
+EXPORT_SYMBOL_GPL(ZSTD_isError);
 
 /*! ZSTD_getErrorName() :
  *  provides error code string from function result (useful for debugging) */
 const char* ZSTD_getErrorName(size_t code) { return ERR_getErrorName(code); }
+EXPORT_SYMBOL_GPL(ZSTD_getErrorName);
 
 /*! ZSTD_getError() :
  *  convert a `size_t` function result into a proper ZSTD_errorCode enum */
 ZSTD_ErrorCode ZSTD_getErrorCode(size_t code) { return ERR_getErrorCode(code); }
+EXPORT_SYMBOL_GPL(ZSTD_getErrorCode);
 
 /*! ZSTD_getErrorString() :
  *  provides error code string from enum */
@@ -59,6 +63,7 @@ void* ZSTD_customMalloc(size_t size, ZSTD_customMem customMem)
         return customMem.customAlloc(customMem.opaque, size);
     return ZSTD_malloc(size);
 }
+EXPORT_SYMBOL_GPL(ZSTD_customMalloc);
 
 void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem)
 {
@@ -71,6 +76,7 @@ void* ZSTD_customCalloc(size_t size, ZSTD_customMem customMem)
     }
     return ZSTD_calloc(1, size);
 }
+EXPORT_SYMBOL_GPL(ZSTD_customCalloc);
 
 void ZSTD_customFree(void* ptr, ZSTD_customMem customMem)
 {
@@ -81,3 +87,7 @@ void ZSTD_customFree(void* ptr, ZSTD_customMem customMem)
             ZSTD_free(ptr);
     }
 }
+EXPORT_SYMBOL_GPL(ZSTD_customFree);
+
+MODULE_LICENSE("Dual BSD/GPL");
+MODULE_DESCRIPTION("Zstd Common");
index ece44b735061348a385070ba782f797abf5d4b80..2bc08ace38a3b56a0bf95d3fd2b739c406d9dd3a 100644 (file)
@@ -100,8 +100,29 @@ echo-cmd = $(if $($(quiet)cmd_$(1)),\
  quiet_redirect :=
 silent_redirect := exec >/dev/null;
 
+# Delete the target on interruption
+#
+# GNU Make automatically deletes the target if it has already been changed by
+# the interrupted recipe. So, you can safely stop the build by Ctrl-C (Make
+# will delete incomplete targets), and resume it later.
+#
+# However, this does not work when the stderr is piped to another program, like
+#  $ make >&2 | tee log
+# Make dies with SIGPIPE before cleaning the targets.
+#
+# To address it, we clean the target in signal traps.
+#
+# Make deletes the target when it catches SIGHUP, SIGINT, SIGQUIT, SIGTERM.
+# So, we cover them, and also SIGPIPE just in case.
+#
+# Of course, this is unneeded for phony targets.
+delete-on-interrupt = \
+       $(if $(filter-out $(PHONY), $@), \
+               $(foreach sig, HUP INT QUIT TERM PIPE, \
+                       trap 'rm -f $@; trap - $(sig); kill -s $(sig) $$$$' $(sig);))
+
 # printing commands
-cmd = @set -e; $(echo-cmd) $($(quiet)redirect) $(cmd_$(1))
+cmd = @set -e; $(echo-cmd) $($(quiet)redirect) $(delete-on-interrupt) $(cmd_$(1))
 
 ###
 # if_changed      - execute command if any prerequisite is newer than
index 27be77c0d6d82856a16ae882e707632ee8d5f697..22adbf89cb3103711a0c4964c41b84ad9018bd2c 100644 (file)
@@ -5,8 +5,8 @@
 
 src := $(obj)
 
-PHONY := __build
-__build:
+PHONY := $(obj)/
+$(obj)/:
 
 # Init all relevant variables used in kbuild files so
 # 1) they have correct type
@@ -383,7 +383,7 @@ $(obj)/%.o: $(src)/%.S FORCE
 
 targets += $(filter-out $(subdir-builtin), $(real-obj-y))
 targets += $(filter-out $(subdir-modorder), $(real-obj-m))
-targets += $(real-dtb-y) $(lib-y) $(always-y) $(MAKECMDGOALS)
+targets += $(real-dtb-y) $(lib-y) $(always-y)
 
 # Linker scripts preprocessor (.lds.S -> .lds)
 # ---------------------------------------------------------------------------
@@ -434,7 +434,7 @@ $(obj)/built-in.a: $(real-obj-y) FORCE
 
 cmd_modules_order = { $(foreach m, $(real-prereqs), \
        $(if $(filter %/modules.order, $m), cat $m, echo $(patsubst %.o,%.ko,$m));) :; } \
-       | $(AWK) '!x[$$0]++' - > $@
+       > $@
 
 $(obj)/modules.order: $(obj-m) FORCE
        $(call if_changed,modules_order)
@@ -460,8 +460,6 @@ $(multi-obj-m): %.o: %.mod FORCE
        $(call if_changed_rule,ld_multi_m)
 $(call multi_depend, $(multi-obj-m), .o, -objs -y -m)
 
-targets := $(filter-out $(PHONY), $(targets))
-
 # Add intermediate targets:
 # When building objects with specific suffix patterns, add intermediate
 # targets that the final targets are derived from.
@@ -480,52 +478,29 @@ targets += $(call intermediate_targets, .asn1.o, .asn1.c .asn1.h) \
 # Build
 # ---------------------------------------------------------------------------
 
-ifdef single-build
-
-KBUILD_SINGLE_TARGETS := $(filter $(obj)/%, $(KBUILD_SINGLE_TARGETS))
-
-curdir-single := $(sort $(foreach x, $(KBUILD_SINGLE_TARGETS), \
-                       $(if $(filter $(x) $(basename $(x)).o, $(targets)), $(x))))
-
-# Handle single targets without any rule: show "Nothing to be done for ..." or
-# "No rule to make target ..." depending on whether the target exists.
-unknown-single := $(filter-out $(addsuffix /%, $(subdir-ym)), \
-                       $(filter-out $(curdir-single), $(KBUILD_SINGLE_TARGETS)))
-
-single-subdirs := $(foreach d, $(subdir-ym), \
-                       $(if $(filter $(d)/%, $(KBUILD_SINGLE_TARGETS)), $(d)))
-
-__build: $(curdir-single) $(single-subdirs)
-ifneq ($(unknown-single),)
-       $(Q)$(MAKE) -f /dev/null $(unknown-single)
-endif
+$(obj)/: $(if $(KBUILD_BUILTIN), $(targets-for-builtin)) \
+        $(if $(KBUILD_MODULES), $(targets-for-modules)) \
+        $(subdir-ym) $(always-y)
        @:
 
-ifeq ($(curdir-single),)
-# Nothing to do in this directory. Do not include any .*.cmd file for speed-up
-targets :=
-else
-targets += $(curdir-single)
-endif
+# Single targets
+# ---------------------------------------------------------------------------
 
-else
+single-subdirs := $(foreach d, $(subdir-ym), $(if $(filter $d/%, $(MAKECMDGOALS)), $d))
+single-subdir-goals := $(filter $(addsuffix /%, $(single-subdirs)), $(MAKECMDGOALS))
 
-__build: $(if $(KBUILD_BUILTIN), $(targets-for-builtin)) \
-        $(if $(KBUILD_MODULES), $(targets-for-modules)) \
-        $(subdir-ym) $(always-y)
+$(single-subdir-goals): $(single-subdirs)
        @:
 
-endif
-
 # Descending
 # ---------------------------------------------------------------------------
 
 PHONY += $(subdir-ym)
 $(subdir-ym):
        $(Q)$(MAKE) $(build)=$@ \
-       $(if $(filter $@/, $(KBUILD_SINGLE_TARGETS)),single-build=) \
        need-builtin=$(if $(filter $@/built-in.a, $(subdir-builtin)),1) \
-       need-modorder=$(if $(filter $@/modules.order, $(subdir-modorder)),1)
+       need-modorder=$(if $(filter $@/modules.order, $(subdir-modorder)),1) \
+       $(filter $@/%, $(single-subdir-goals))
 
 # Add FORCE to the prequisites of a target to force it to be always rebuilt.
 # ---------------------------------------------------------------------------
@@ -534,6 +509,9 @@ PHONY += FORCE
 
 FORCE:
 
+targets += $(filter-out $(single-subdir-goals), $(MAKECMDGOALS))
+targets := $(filter-out $(PHONY), $(targets))
+
 # Read all saved command lines and dependencies for the $(targets) we
 # may be building above, using $(if_changed{,_dep}). As an
 # optimization, we don't need to read them if the target does not
index 94d0d40cddb3d614facd505e46d4d83cbc7f7e10..20d353dcabfbc50b0419936724c57a4a6f2f22e3 100644 (file)
@@ -61,9 +61,13 @@ cc-option-yn = $(call try-run,\
 cc-disable-warning = $(call try-run,\
        $(CC) -Werror $(KBUILD_CPPFLAGS) $(KBUILD_CFLAGS) -W$(strip $(1)) -c -x c /dev/null -o "$$TMP",-Wno-$(strip $(1)))
 
-# cc-ifversion
-# Usage:  EXTRA_CFLAGS += $(call cc-ifversion, -lt, 0402, -O1)
-cc-ifversion = $(shell [ $(CONFIG_GCC_VERSION)0 $(1) $(2)000 ] && echo $(3) || echo $(4))
+# gcc-min-version
+# Usage: cflags-$(call gcc-min-version, 70100) += -foo
+gcc-min-version = $(shell [ $(CONFIG_GCC_VERSION)0 -ge $(1)0 ] && echo y)
+
+# clang-min-version
+# Usage: cflags-$(call clang-min-version, 110000) += -foo
+clang-min-version = $(shell [ $(CONFIG_CLANG_VERSION)0 -ge $(1)0 ] && echo y)
 
 # ld-option
 # Usage: KBUILD_LDFLAGS += $(call ld-option, -X, -Y)
index 52bd7df84fd647606e7631576c19130e0b3d6f56..6bbba36c596957cab633b51795294af773d8af61 100644 (file)
@@ -48,7 +48,7 @@ else
 ifdef CONFIG_CC_IS_CLANG
 KBUILD_CFLAGS += -Wno-initializer-overrides
 # Clang before clang-16 would warn on default argument promotions.
-ifeq ($(shell [ $(CONFIG_CLANG_VERSION) -lt 160000 ] && echo y),y)
+ifneq ($(call clang-min-version, 160000),y)
 # Disable -Wformat
 KBUILD_CFLAGS += -Wno-format
 # Then re-enable flags that were part of the -Wformat group that aren't
@@ -56,7 +56,7 @@ KBUILD_CFLAGS += -Wno-format
 KBUILD_CFLAGS += -Wformat-extra-args -Wformat-invalid-specifier
 KBUILD_CFLAGS += -Wformat-zero-length -Wnonnull
 # Requires clang-12+.
-ifeq ($(shell [ $(CONFIG_CLANG_VERSION) -ge 120000 ] && echo y),y)
+ifeq ($(call clang-min-version, 120000),y)
 KBUILD_CFLAGS += -Wformat-insufficient-args
 endif
 endif
index c88b98b5dc44ab60cbe4574d99839b066ca96f76..3dd688b7baab44f2142647a0008220b34bdfedbf 100644 (file)
@@ -90,6 +90,7 @@ always-y                      += $(dtb-y)
 
 # Add subdir path
 
+ifneq ($(obj),.)
 extra-y                := $(addprefix $(obj)/,$(extra-y))
 always-y       := $(addprefix $(obj)/,$(always-y))
 targets                := $(addprefix $(obj)/,$(targets))
@@ -101,6 +102,7 @@ multi-obj-m := $(addprefix $(obj)/, $(multi-obj-m))
 multi-dtb-y    := $(addprefix $(obj)/, $(multi-dtb-y))
 real-dtb-y     := $(addprefix $(obj)/, $(real-dtb-y))
 subdir-ym      := $(addprefix $(obj)/,$(subdir-ym))
+endif
 
 # Finds the multi-part object the current object will be linked into.
 # If the object belongs to two or more multi-part objects, list them all.
@@ -241,25 +243,26 @@ ifdef CONFIG_OBJTOOL
 
 objtool := $(objtree)/tools/objtool/objtool
 
-objtool_args =                                                         \
-       $(if $(CONFIG_HAVE_JUMP_LABEL_HACK), --hacks=jump_label)        \
-       $(if $(CONFIG_HAVE_NOINSTR_HACK), --hacks=noinstr)              \
-       $(if $(CONFIG_X86_KERNEL_IBT), --ibt)                           \
-       $(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount)             \
-       $(if $(CONFIG_UNWINDER_ORC), --orc)                             \
-       $(if $(CONFIG_RETPOLINE), --retpoline)                          \
-       $(if $(CONFIG_RETHUNK), --rethunk)                              \
-       $(if $(CONFIG_SLS), --sls)                                      \
-       $(if $(CONFIG_STACK_VALIDATION), --stackval)                    \
-       $(if $(CONFIG_HAVE_STATIC_CALL_INLINE), --static-call)          \
-       $(if $(CONFIG_HAVE_UACCESS_VALIDATION), --uaccess)              \
+objtool-args-$(CONFIG_HAVE_JUMP_LABEL_HACK)            += --hacks=jump_label
+objtool-args-$(CONFIG_HAVE_NOINSTR_HACK)               += --hacks=noinstr
+objtool-args-$(CONFIG_X86_KERNEL_IBT)                  += --ibt
+objtool-args-$(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL)       += --mcount
+objtool-args-$(CONFIG_UNWINDER_ORC)                    += --orc
+objtool-args-$(CONFIG_RETPOLINE)                       += --retpoline
+objtool-args-$(CONFIG_RETHUNK)                         += --rethunk
+objtool-args-$(CONFIG_SLS)                             += --sls
+objtool-args-$(CONFIG_STACK_VALIDATION)                        += --stackval
+objtool-args-$(CONFIG_HAVE_STATIC_CALL_INLINE)         += --static-call
+objtool-args-$(CONFIG_HAVE_UACCESS_VALIDATION)         += --uaccess
+objtool-args-$(CONFIG_GCOV_KERNEL)                     += --no-unreachable
+
+objtool-args = $(objtool-args-y)                                       \
        $(if $(delay-objtool), --link)                                  \
-       $(if $(part-of-module), --module)                               \
-       $(if $(CONFIG_GCOV_KERNEL), --no-unreachable)
+       $(if $(part-of-module), --module)
 
 delay-objtool := $(or $(CONFIG_LTO_CLANG),$(CONFIG_X86_KERNEL_IBT))
 
-cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@)
+cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool-args) $@)
 cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd)
 
 endif # CONFIG_OBJTOOL
index 9a1fa6aa30fe15a1044aea4084b50bed3975aa24..25bedd83644b0b7789912baff4b667b0eb2b7988 100644 (file)
@@ -57,7 +57,7 @@ if_changed_except = $(if $(call newer_prereqs_except,$(2))$(cmd-check),      \
        printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd, @:)
 
 # Re-generate module BTFs if either module's .ko or vmlinux changed
-$(modules): %.ko: %.o %.mod.o scripts/module.lds $(if $(KBUILD_BUILTIN),vmlinux) FORCE
+$(modules): %.ko: %.o %.mod.o scripts/module.lds $(and $(CONFIG_DEBUG_INFO_BTF_MODULES),$(KBUILD_BUILTIN),vmlinux) FORCE
        +$(call if_changed_except,ld_ko_o,vmlinux)
 ifdef CONFIG_DEBUG_INFO_BTF_MODULES
        +$(if $(newer-prereqs),$(call cmd,btf_ko))
index 911606496341ca66a34365dcd29f5cc0d09ff0dd..7740ce3b29e80360771fa3a3744cc1dd2f6fb18f 100644 (file)
 # Step 4 is solely used to allow module versioning in external modules,
 # where the CRC of each module is retrieved from the Module.symvers file.
 
-# KBUILD_MODPOST_NOFINAL can be set to skip the final link of modules.
-# This is solely useful to speed up test compiles
-
 PHONY := __modpost
 __modpost:
 
 include include/config/auto.conf
 include $(srctree)/scripts/Kbuild.include
 
-MODPOST = scripts/mod/modpost                                                          \
+modpost-args =                                                                         \
        $(if $(CONFIG_MODVERSIONS),-m)                                                  \
        $(if $(CONFIG_MODULE_SRCVERSION_ALL),-a)                                        \
        $(if $(CONFIG_SECTION_MISMATCH_WARN_ONLY),,-E)                                  \
+       $(if $(KBUILD_NSDEPS),-d $(MODULES_NSDEPS))                                     \
+       $(if $(CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS)$(KBUILD_NSDEPS),-N)       \
        -o $@
 
-ifdef MODPOST_VMLINUX
-
-quiet_cmd_modpost = MODPOST $@
-      cmd_modpost = $(MODPOST) $<
-
-vmlinux.symvers: vmlinux.o
-       $(call cmd,modpost)
-
-__modpost: vmlinux.symvers
-
-else
+# 'make -i -k' ignores compile errors, and builds as many modules as possible.
+ifneq ($(findstring i,$(filter-out --%,$(MAKEFLAGS))),)
+modpost-args += -n
+endif
 
 ifeq ($(KBUILD_EXTMOD),)
 
-input-symdump := vmlinux.symvers
-output-symdump := modules-only.symvers
-
-quiet_cmd_cat = GEN     $@
-      cmd_cat = cat $(real-prereqs) > $@
+# Generate the list of in-tree objects in vmlinux
+# ---------------------------------------------------------------------------
 
-ifneq ($(wildcard vmlinux.symvers),)
-
-__modpost: Module.symvers
-Module.symvers: vmlinux.symvers modules-only.symvers FORCE
-       $(call if_changed,cat)
-
-targets += Module.symvers
+# This is used to retrieve symbol versions generated by genksyms.
+ifdef CONFIG_MODVERSIONS
+vmlinux.symvers Module.symvers: .vmlinux.objs
+endif
 
+# Ignore libgcc.a
+# Some architectures do '$(CC) --print-libgcc-file-name' to borrow libgcc.a
+# from the toolchain, but there is no EXPORT_SYMBOL in it.
+
+quiet_cmd_vmlinux_objs = GEN     $@
+      cmd_vmlinux_objs =               \
+       for f in $(real-prereqs); do    \
+               case $${f} in           \
+               *libgcc.a) ;;           \
+               *) $(AR) t $${f} ;;     \
+               esac                    \
+       done > $@
+
+targets += .vmlinux.objs
+.vmlinux.objs: vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
+       $(call if_changed,vmlinux_objs)
+
+vmlinux.o-if-present := $(wildcard vmlinux.o)
+output-symdump := vmlinux.symvers
+
+ifdef KBUILD_MODULES
+output-symdump := $(if $(vmlinux.o-if-present), Module.symvers, modules-only.symvers)
+missing-input := $(filter-out $(vmlinux.o-if-present),vmlinux.o)
 endif
 
 else
@@ -86,54 +95,37 @@ src := $(obj)
 # Include the module's Makefile to find KBUILD_EXTRA_SYMBOLS
 include $(or $(wildcard $(src)/Kbuild), $(src)/Makefile)
 
-# modpost option for external modules
-MODPOST += -e
-
-input-symdump := Module.symvers $(KBUILD_EXTRA_SYMBOLS)
+module.symvers-if-present := $(wildcard Module.symvers)
 output-symdump := $(KBUILD_EXTMOD)/Module.symvers
+missing-input := $(filter-out $(module.symvers-if-present), Module.symvers)
 
-endif
-
-existing-input-symdump := $(wildcard $(input-symdump))
+modpost-args += -e $(addprefix -i ,$(module.symvers-if-present) $(KBUILD_EXTRA_SYMBOLS))
 
-# modpost options for modules (both in-kernel and external)
-MODPOST += \
-       $(addprefix -i ,$(existing-input-symdump)) \
-       $(if $(KBUILD_NSDEPS),-d $(MODULES_NSDEPS)) \
-       $(if $(CONFIG_MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS)$(KBUILD_NSDEPS),-N)
+endif # ($(KBUILD_EXTMOD),)
 
-# 'make -i -k' ignores compile errors, and builds as many modules as possible.
-ifneq ($(findstring i,$(filter-out --%,$(MAKEFLAGS))),)
-MODPOST += -n
+ifneq ($(KBUILD_MODPOST_WARN)$(missing-input),)
+modpost-args += -w
 endif
 
-# Clear VPATH to not search for *.symvers in $(srctree). Check only $(objtree).
-VPATH :=
-$(input-symdump):
-       @echo >&2 'WARNING: Symbol version dump "$@" is missing.'
-       @echo >&2 '         Modules may not have dependencies or modversions.'
-       @echo >&2 '         You may get many unresolved symbol warnings.'
+modorder-if-needed := $(if $(KBUILD_MODULES), $(MODORDER))
 
-# KBUILD_MODPOST_WARN can be set to avoid error out in case of undefined symbols
-ifneq ($(KBUILD_MODPOST_WARN)$(filter-out $(existing-input-symdump), $(input-symdump)),)
-MODPOST += -w
-endif
+MODPOST = scripts/mod/modpost
 
 # Read out modules.order to pass in modpost.
 # Otherwise, allmodconfig would fail with "Argument list too long".
 quiet_cmd_modpost = MODPOST $@
-      cmd_modpost = sed 's/ko$$/o/' $< | $(MODPOST) -T -
-
-$(output-symdump): $(MODORDER) $(input-symdump) FORCE
-       $(call if_changed,modpost)
+      cmd_modpost = \
+       $(if $(missing-input), \
+               echo >&2 "WARNING: $(missing-input) is missing."; \
+               echo >&2 "         Modules may not have dependencies or modversions."; \
+               echo >&2 "         You may get many unresolved symbol warnings.";) \
+       sed 's/ko$$/o/' $(or $(modorder-if-needed), /dev/null) | $(MODPOST) $(modpost-args) $(vmlinux.o-if-present) -T -
 
 targets += $(output-symdump)
+$(output-symdump): $(modorder-if-needed) $(vmlinux.o-if-present) $(moudle.symvers-if-present) $(MODPOST) FORCE
+       $(call if_changed,modpost)
 
 __modpost: $(output-symdump)
-ifneq ($(KBUILD_MODPOST_NOFINAL),1)
-       $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
-endif
-
 PHONY += FORCE
 FORCE:
 
@@ -141,6 +133,4 @@ existing-targets := $(wildcard $(sort $(targets)))
 
 -include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
 
-endif
-
 .PHONY: $(PHONY)
index 5017f6b2da809c2af4e199bd86b4e91762c719ff..8bbcced67c221e1e14e34a34005e5b2e993e678d 100644 (file)
@@ -29,7 +29,10 @@ KDEB_SOURCENAME ?= linux-upstream
 KBUILD_PKG_ROOTCMD ?="fakeroot -u"
 export KDEB_SOURCENAME
 # Include only those top-level files that are needed by make, plus the GPL copy
-TAR_CONTENT := $(KBUILD_ALLDIRS) .config .scmversion Makefile \
+TAR_CONTENT := Documentation LICENSES arch block certs crypto drivers fs \
+               include init io_uring ipc kernel lib mm net samples scripts \
+               security sound tools usr virt \
+               .config .scmversion Makefile \
                Kbuild Kconfig COPYING $(wildcard localversion*)
 MKSPEC     := $(srctree)/scripts/package/mkspec
 
index 7a63abf22399936ce4f7e5a078e8e4b27bba850e..49946cb968440c6fecd63b8076e1a46a87d80aee 100644 (file)
@@ -1,18 +1,37 @@
 # SPDX-License-Identifier: GPL-2.0-only
 
+PHONY := __default
+__default: vmlinux
+
 include include/config/auto.conf
 include $(srctree)/scripts/Kbuild.include
 
 # for c_flags
 include $(srctree)/scripts/Makefile.lib
 
+targets :=
+
 quiet_cmd_cc_o_c = CC      $@
       cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
 
 %.o: %.c FORCE
        $(call if_changed_dep,cc_o_c)
 
-targets := $(MAKECMDGOALS)
+ifdef CONFIG_MODULES
+targets += .vmlinux.export.o
+vmlinux: .vmlinux.export.o
+endif
+
+ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
+
+# Final link of vmlinux with optional arch pass after final link
+cmd_link_vmlinux =                                                     \
+       $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)";            \
+       $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
+
+targets += vmlinux
+vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) FORCE
+       +$(call if_changed_dep,link_vmlinux)
 
 # Add FORCE to the prequisites of a target to force it to be always rebuilt.
 # ---------------------------------------------------------------------------
index 84019814f33f09323bcb9b50e8c3b1cae19c1696..0edfdb40364b8c8c523554015e65d68de2877ee7 100644 (file)
@@ -1,7 +1,7 @@
 # SPDX-License-Identifier: GPL-2.0-only
 
 PHONY := __default
-__default: vmlinux.o
+__default: vmlinux.o modules.builtin.modinfo modules.builtin
 
 include include/config/auto.conf
 include $(srctree)/scripts/Kbuild.include
@@ -18,7 +18,7 @@ quiet_cmd_gen_initcalls_lds = GEN     $@
        $(PERL) $(real-prereqs) > $@
 
 .tmp_initcalls.lds: $(srctree)/scripts/generate_initcall_order.pl \
-               $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
+               vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
        $(call if_changed,gen_initcalls_lds)
 
 targets := .tmp_initcalls.lds
@@ -35,18 +35,11 @@ endif
 
 objtool-enabled := $(or $(delay-objtool),$(CONFIG_NOINSTR_VALIDATION))
 
-# Reuse objtool_args defined in scripts/Makefile.lib if LTO or IBT is enabled.
-#
-# Add some more flags as needed.
-# --no-unreachable and --link might be added twice, but it is fine.
-#
-# Expand objtool_args to a simple variable to avoid circular reference.
+vmlinux-objtool-args-$(delay-objtool)                  += $(objtool-args-y)
+vmlinux-objtool-args-$(CONFIG_GCOV_KERNEL)             += --no-unreachable
+vmlinux-objtool-args-$(CONFIG_NOINSTR_VALIDATION)      += --noinstr $(if $(CONFIG_CPU_UNRET_ENTRY), --unret)
 
-objtool_args := \
-       $(if $(delay-objtool),$(objtool_args)) \
-       $(if $(CONFIG_NOINSTR_VALIDATION), --noinstr $(if $(CONFIG_CPU_UNRET_ENTRY), --unret)) \
-       $(if $(CONFIG_GCOV_KERNEL), --no-unreachable) \
-       --link
+objtool-args = $(vmlinux-objtool-args-y) --link
 
 # Link of vmlinux.o used for section mismatch analysis
 # ---------------------------------------------------------------------------
@@ -55,7 +48,7 @@ quiet_cmd_ld_vmlinux.o = LD      $@
       cmd_ld_vmlinux.o = \
        $(LD) ${KBUILD_LDFLAGS} -r -o $@ \
        $(addprefix -T , $(initcalls-lds)) \
-       --whole-archive $(KBUILD_VMLINUX_OBJS) --no-whole-archive \
+       --whole-archive vmlinux.a --no-whole-archive \
        --start-group $(KBUILD_VMLINUX_LIBS) --end-group \
        $(cmd_objtool)
 
@@ -64,11 +57,35 @@ define rule_ld_vmlinux.o
        $(call cmd,gen_objtooldep)
 endef
 
-vmlinux.o: $(initcalls-lds) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
+vmlinux.o: $(initcalls-lds) vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
        $(call if_changed_rule,ld_vmlinux.o)
 
 targets += vmlinux.o
 
+# module.builtin.modinfo
+# ---------------------------------------------------------------------------
+
+OBJCOPYFLAGS_modules.builtin.modinfo := -j .modinfo -O binary
+
+targets += modules.builtin.modinfo
+modules.builtin.modinfo: vmlinux.o FORCE
+       $(call if_changed,objcopy)
+
+# module.builtin
+# ---------------------------------------------------------------------------
+
+# The second line aids cases where multiple modules share the same object.
+
+quiet_cmd_modules_builtin = GEN     $@
+      cmd_modules_builtin = \
+       tr '\0' '\n' < $< | \
+       sed -n 's/^[[:alnum:]:_]*\.file=//p' | \
+       tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$$/.ko/' > $@
+
+targets += modules.builtin
+modules.builtin: modules.builtin.modinfo FORCE
+       $(call if_changed,modules_builtin)
+
 # Add FORCE to the prequisites of a target to force it to be always rebuilt.
 # ---------------------------------------------------------------------------
 
index adabd41452640991ed86d1557ac32012042ce4e0..71d4a7c87900890a04b3451450cbaab4be5f2ee7 100644 (file)
@@ -832,7 +832,7 @@ static void parse(void)
 
 static struct element *element_list;
 
-static struct element *alloc_elem(struct token *type)
+static struct element *alloc_elem(void)
 {
        struct element *e = calloc(1, sizeof(*e));
        if (!e) {
@@ -860,7 +860,7 @@ static struct element *parse_type(struct token **_cursor, struct token *end,
        char *p;
        int labelled = 0, implicit = 0;
 
-       top = element = alloc_elem(cursor);
+       top = element = alloc_elem();
        element->class = ASN1_UNIV;
        element->method = ASN1_PRIM;
        element->tag = token_to_tag[cursor->token_type];
@@ -939,7 +939,7 @@ static struct element *parse_type(struct token **_cursor, struct token *end,
                if (!implicit)
                        element->method |= ASN1_CONS;
                element->compound = implicit ? TAG_OVERRIDE : SEQUENCE;
-               element->children = alloc_elem(cursor);
+               element->children = alloc_elem();
                element = element->children;
                element->class = ASN1_UNIV;
                element->method = ASN1_PRIM;
diff --git a/scripts/atomic/check-atomics.sh b/scripts/atomic/check-atomics.sh
deleted file mode 100755 (executable)
index 0e7bab3..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/sh
-# SPDX-License-Identifier: GPL-2.0
-#
-# Check if atomic headers are up-to-date
-
-ATOMICDIR=$(dirname $0)
-ATOMICTBL=${ATOMICDIR}/atomics.tbl
-LINUXDIR=${ATOMICDIR}/../..
-
-echo '' | sha1sum - > /dev/null 2>&1
-if [ $? -ne 0 ]; then
-       printf "sha1sum not available, skipping atomic header checks.\n"
-       exit 0
-fi
-
-cat <<EOF |
-linux/atomic/atomic-instrumented.h
-linux/atomic/atomic-long.h
-linux/atomic/atomic-arch-fallback.h
-EOF
-while read header; do
-       OLDSUM="$(tail -n 1 ${LINUXDIR}/include/${header})"
-       OLDSUM="${OLDSUM#// }"
-
-       NEWSUM="$(sed '$d' ${LINUXDIR}/include/${header} | sha1sum)"
-       NEWSUM="${NEWSUM%% *}"
-
-       if [ "${OLDSUM}" != "${NEWSUM}" ]; then
-               printf "warning: generated include/${header} has been modified.\n"
-       fi
-done
-
-exit 0
index 6ccc2f4674166c2b22d22cf04e9d0c34224a5151..f90b5a9c67b357fa94b43ffacc3335d82d5bfc90 100755 (executable)
@@ -1,25 +1,14 @@
-#!/usr/bin/env bash
+#!/bin/sh
 # SPDX-License-Identifier: GPL-2.0-only
 #
 # Copyright (C) 2022 Masahiro Yamada <masahiroy@kernel.org>
+# Copyright (C) 2022 Owen Rafferty <owen@owenrafferty.com>
 #
 # Exit with error if a local exported symbol is found.
 # EXPORT_SYMBOL should be used for global symbols.
 
 set -e
-
-# catch errors from ${NM}
-set -o pipefail
-
-# Run the last element of a pipeline in the current shell.
-# Without this, the while-loop would be executed in a subshell, and
-# the changes made to 'symbol_types' and 'export_symbols' would be lost.
-shopt -s lastpipe
-
-declare -A symbol_types
-declare -a export_symbols
-
-exit_code=0
+pid=$$
 
 # If there is no symbol in the object, ${NM} (both GNU nm and llvm-nm) shows
 # 'no symbols' diagnostic (but exits with 0). It is harmless and hidden by
@@ -29,43 +18,53 @@ exit_code=0
 # TODO:
 # Use --quiet instead of 2>/dev/null when we upgrade the minimum version of
 # binutils to 2.37, llvm to 13.0.0.
-# Then, the following line will be really simple:
-#   ${NM} --quiet ${1} |
+# Then, the following line will be simpler:
+#   { ${NM} --quiet ${1} || kill 0; } |
+
+{ ${NM} ${1} 2>/dev/null || { echo "${0}: ${NM} failed" >&2; kill $pid; } } |
+${AWK} -v "file=${1}" '
+BEGIN {
+       i = 0
+}
+
+# Skip the line if the number of fields is less than 3.
+#
+# case 1)
+#   For undefined symbols, the first field (value) is empty.
+#   The outout looks like this:
+#     "                 U _printk"
+#   It is unneeded to record undefined symbols.
+#
+# case 2)
+#   For Clang LTO, llvm-nm outputs a line with type t but empty name:
+#     "---------------- t"
+!length($3) {
+       next
+}
 
-{ ${NM} ${1} 2>/dev/null || { echo "${0}: ${NM} failed" >&2; false; } } |
-while read value type name
-do
-       # Skip the line if the number of fields is less than 3.
-       #
-       # case 1)
-       #   For undefined symbols, the first field (value) is empty.
-       #   The outout looks like this:
-       #     "                 U _printk"
-       #   It is unneeded to record undefined symbols.
-       #
-       # case 2)
-       #   For Clang LTO, llvm-nm outputs a line with type 't' but empty name:
-       #     "---------------- t"
-       if [[ -z ${name} ]]; then
-               continue
-       fi
+# save (name, type) in the associative array
+{ symbol_types[$3]=$2 }
 
-       # save (name, type) in the associative array
-       symbol_types[${name}]=${type}
+# append the exported symbol to the array
+($3 ~ /^__ksymtab_/) {
+       export_symbols[i] = $3
+       sub(/^__ksymtab_/, "", export_symbols[i])
+       i++
+}
 
-       # append the exported symbol to the array
-       if [[ ${name} == __ksymtab_* ]]; then
-               export_symbols+=(${name#__ksymtab_})
-       fi
-done
+END {
+       exit_code = 0
+       for (j = 0; j < i; ++j) {
+               name = export_symbols[j]
+               # nm(3) says "If lowercase, the symbol is usually local"
+               if (symbol_types[name] ~ /[a-z]/) {
+                       printf "%s: error: local symbol %s was exported\n",
+                               file, name | "cat 1>&2"
+                       exit_code = 1
+               }
+       }
 
-for name in "${export_symbols[@]}"
-do
-       # nm(3) says "If lowercase, the symbol is usually local"
-       if [[ ${symbol_types[$name]} =~ [a-z] ]]; then
-               echo "$@: error: local symbol '${name}' was exported" >&2
-               exit_code=1
-       fi
-done
+       exit exit_code
+}'
 
-exit ${exit_code}
+exit $?
index 47da25b3ba7d206b7000847597c1519dd9dd3155..d800b2c0af9771644f51bc0d8fb60d831b0b61f0 100755 (executable)
@@ -109,20 +109,6 @@ def to_cmdfile(path):
     return os.path.join(dir, '.' + base + '.cmd')
 
 
-def cmdfiles_for_o(obj):
-    """Generate the iterator of .cmd files associated with the object
-
-    Yield the .cmd file used to build the given object
-
-    Args:
-        obj: The object path
-
-    Yields:
-        The path to .cmd file
-    """
-    yield to_cmdfile(obj)
-
-
 def cmdfiles_for_a(archive, ar):
     """Generate the iterator of .cmd files associated with the archive.
 
@@ -211,13 +197,10 @@ def main():
     for path in paths:
         # If 'path' is a directory, handle all .cmd files under it.
         # Otherwise, handle .cmd files associated with the file.
-        # Most of built-in objects are linked via archives (built-in.a or lib.a)
-        # but some objects are linked to vmlinux directly.
+        # built-in objects are linked via vmlinux.a
         # Modules are listed in modules.order.
         if os.path.isdir(path):
             cmdfiles = cmdfiles_in_dir(path)
-        elif path.endswith('.o'):
-            cmdfiles = cmdfiles_for_o(path)
         elif path.endswith('.a'):
             cmdfiles = cmdfiles_for_a(path, ar)
         elif path.endswith('modules.order'):
diff --git a/scripts/head-object-list.txt b/scripts/head-object-list.txt
new file mode 100644 (file)
index 0000000..b16326a
--- /dev/null
@@ -0,0 +1,53 @@
+# Head objects
+#
+# The objects listed here are placed at the head of vmlinux. A typical use-case
+# is an object that contains the entry point. This is kept for compatibility
+# with head-y, which Kbuild used to support.
+#
+# A counter approach is to control the section placement by the linker script.
+# The code marked as __HEAD goes into the ".head.text" section, which is placed
+# before the normal ".text" section.
+#
+# If you can achieve the correct code ordering by linker script, please delete
+# the entry from this file.
+#
+arch/alpha/kernel/head.o
+arch/arc/kernel/head.o
+arch/arm/kernel/head-nommu.o
+arch/arm/kernel/head.o
+arch/arm64/kernel/head.o
+arch/csky/kernel/head.o
+arch/hexagon/kernel/head.o
+arch/ia64/kernel/head.o
+arch/loongarch/kernel/head.o
+arch/m68k/68000/head.o
+arch/m68k/coldfire/head.o
+arch/m68k/kernel/head.o
+arch/m68k/kernel/sun3-head.o
+arch/microblaze/kernel/head.o
+arch/mips/kernel/head.o
+arch/nios2/kernel/head.o
+arch/openrisc/kernel/head.o
+arch/parisc/kernel/head.o
+arch/powerpc/kernel/head_40x.o
+arch/powerpc/kernel/head_44x.o
+arch/powerpc/kernel/head_64.o
+arch/powerpc/kernel/head_8xx.o
+arch/powerpc/kernel/head_85xx.o
+arch/powerpc/kernel/head_book3s_32.o
+arch/powerpc/kernel/entry_64.o
+arch/powerpc/kernel/fpu.o
+arch/powerpc/kernel/vector.o
+arch/powerpc/kernel/prom_init.o
+arch/riscv/kernel/head.o
+arch/s390/kernel/head64.o
+arch/sh/kernel/head_32.o
+arch/sparc/kernel/head_32.o
+arch/sparc/kernel/head_64.o
+arch/x86/kernel/head_32.o
+arch/x86/kernel/head_64.o
+arch/x86/kernel/head32.o
+arch/x86/kernel/head64.o
+arch/x86/kernel/ebda.o
+arch/x86/kernel/platform-quirks.o
+arch/xtensa/kernel/head.o
index ff5e7810e437b65c0e37b38d6f5a62f85b9dd657..03fa07ad45d95b8e6ff64820fc4d34c2bc607214 100644 (file)
@@ -18,6 +18,7 @@
  *
  */
 
+#include <getopt.h>
 #include <stdbool.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -87,7 +88,7 @@ static unsigned char best_table_len[256];
 static void usage(void)
 {
        fprintf(stderr, "Usage: kallsyms [--all-symbols] [--absolute-percpu] "
-                       "[--base-relative] in.map > out.S\n");
+                       "[--base-relative] in.map > out.S\n");
        exit(1);
 }
 
@@ -123,9 +124,6 @@ static bool is_ignored_symbol(const char *name, char type)
 
        /* Symbol names that begin with the following are ignored.*/
        static const char * const ignored_prefixes[] = {
-               "$",                    /* local symbols for ARM, MIPS, etc. */
-               ".L",                   /* local labels, .LBB,.Ltmpxxx,.L__unnamed_xx,.LASANPC, etc. */
-               "__crc_",               /* modversions */
                "__efistub_",           /* arm64 EFI stub namespace */
                "__kvm_nvhe_$",         /* arm64 local symbols in non-VHE KVM namespace */
                "__kvm_nvhe_.L",        /* arm64 local symbols in non-VHE KVM namespace */
@@ -330,12 +328,19 @@ static void shrink_table(void)
        }
 }
 
-static void read_map(FILE *in)
+static void read_map(const char *in)
 {
+       FILE *fp;
        struct sym_entry *sym;
 
-       while (!feof(in)) {
-               sym = read_symbol(in);
+       fp = fopen(in, "r");
+       if (!fp) {
+               perror(in);
+               exit(1);
+       }
+
+       while (!feof(fp)) {
+               sym = read_symbol(fp);
                if (!sym)
                        continue;
 
@@ -346,12 +351,15 @@ static void read_map(FILE *in)
                        table = realloc(table, sizeof(*table) * table_size);
                        if (!table) {
                                fprintf(stderr, "out of memory\n");
+                               fclose(fp);
                                exit (1);
                        }
                }
 
                table[table_cnt++] = sym;
        }
+
+       fclose(fp);
 }
 
 static void output_label(const char *label)
@@ -805,22 +813,26 @@ static void record_relative_base(void)
 
 int main(int argc, char **argv)
 {
-       if (argc >= 2) {
-               int i;
-               for (i = 1; i < argc; i++) {
-                       if(strcmp(argv[i], "--all-symbols") == 0)
-                               all_symbols = 1;
-                       else if (strcmp(argv[i], "--absolute-percpu") == 0)
-                               absolute_percpu = 1;
-                       else if (strcmp(argv[i], "--base-relative") == 0)
-                               base_relative = 1;
-                       else
-                               usage();
-               }
-       } else if (argc != 1)
+       while (1) {
+               static struct option long_options[] = {
+                       {"all-symbols",     no_argument, &all_symbols,     1},
+                       {"absolute-percpu", no_argument, &absolute_percpu, 1},
+                       {"base-relative",   no_argument, &base_relative,   1},
+                       {},
+               };
+
+               int c = getopt_long(argc, argv, "", long_options, NULL);
+
+               if (c == -1)
+                       break;
+               if (c != 0)
+                       usage();
+       }
+
+       if (optind >= argc)
                usage();
 
-       read_map(stdin);
+       read_map(argv[optind]);
        shrink_table();
        if (absolute_percpu)
                make_percpus_absolute();
index 4178065ca27fd626476bd84216992c877a6f54b9..33d19e419908b8315603f04db41189ed9c506a0c 100644 (file)
@@ -551,7 +551,7 @@ static int conf_choice(struct menu *menu)
                        print_help(child);
                        continue;
                }
-               sym_set_choice_value(sym, child->sym);
+               sym_set_tristate_value(child->sym, yes);
                for (child = child->list; child; child = child->next) {
                        indent += 2;
                        conf(child);
index c396aa10409027fdd4e248267879a4d9abee271e..6ac2eabe109d2659232e774681dae6323529c00e 100644 (file)
@@ -123,11 +123,6 @@ static inline struct symbol *sym_get_choice_value(struct symbol *sym)
        return (struct symbol *)sym->curr.val;
 }
 
-static inline bool sym_set_choice_value(struct symbol *ch, struct symbol *chval)
-{
-       return sym_set_tristate_value(chval, yes);
-}
-
 static inline bool sym_is_choice(struct symbol *sym)
 {
        return sym->flags & SYMBOL_CHOICE ? true : false;
index eecc1863e556b95acce0222fed00760708f5c60b..918470d768e9c7d9a1fbbdda6aea85ff59002e1a 100755 (executable)
@@ -3,17 +3,15 @@
 #
 # link vmlinux
 #
-# vmlinux is linked from the objects selected by $(KBUILD_VMLINUX_OBJS) and
-# $(KBUILD_VMLINUX_LIBS). Most are built-in.a files from top-level directories
-# in the kernel tree, others are specified in arch/$(ARCH)/Makefile.
+# vmlinux is linked from the objects in vmlinux.a and $(KBUILD_VMLINUX_LIBS).
+# vmlinux.a contains objects that are linked unconditionally.
 # $(KBUILD_VMLINUX_LIBS) are archives which are linked conditionally
 # (not within --whole-archive), and do not require symbol indexes added.
 #
 # vmlinux
 #   ^
 #   |
-#   +--< $(KBUILD_VMLINUX_OBJS)
-#   |    +--< init/built-in.a drivers/built-in.a mm/built-in.a + more
+#   +--< vmlinux.a
 #   |
 #   +--< $(KBUILD_VMLINUX_LIBS)
 #   |    +--< lib/lib.a + more
@@ -67,7 +65,7 @@ vmlinux_link()
                objs=vmlinux.o
                libs=
        else
-               objs="${KBUILD_VMLINUX_OBJS}"
+               objs=vmlinux.a
                libs="${KBUILD_VMLINUX_LIBS}"
        fi
 
@@ -75,6 +73,8 @@ vmlinux_link()
                objs="${objs} .vmlinux.export.o"
        fi
 
+       objs="${objs} init/version-timestamp.o"
+
        if [ "${SRCARCH}" = "um" ]; then
                wl=-Wl,
                ld="${CC}"
@@ -157,7 +157,7 @@ kallsyms()
        fi
 
        info KSYMS ${2}
-       ${NM} -n ${1} | scripts/kallsyms ${kallsymopt} > ${2}
+       scripts/kallsyms ${kallsymopt} ${1} > ${2}
 }
 
 # Perform one step in kallsyms generation, including temporary linking of
@@ -170,7 +170,8 @@ kallsyms_step()
        kallsyms_S=${kallsyms_vmlinux}.S
 
        vmlinux_link ${kallsyms_vmlinux} "${kallsymso_prev}" ${btf_vmlinux_bin_o}
-       kallsyms ${kallsyms_vmlinux} ${kallsyms_S}
+       mksysmap ${kallsyms_vmlinux} ${kallsyms_vmlinux}.syms
+       kallsyms ${kallsyms_vmlinux}.syms ${kallsyms_S}
 
        info AS ${kallsyms_S}
        ${CC} ${NOSTDINC_FLAGS} ${LINUXINCLUDE} ${KBUILD_CPPFLAGS} \
@@ -182,6 +183,7 @@ kallsyms_step()
 # See mksymap for additional details
 mksysmap()
 {
+       info NM ${2}
        ${CONFIG_SHELL} "${srctree}/scripts/mksysmap" ${1} ${2}
 }
 
@@ -197,8 +199,6 @@ cleanup()
        rm -f System.map
        rm -f vmlinux
        rm -f vmlinux.map
-       rm -f .vmlinux.objs
-       rm -f .vmlinux.export.c
 }
 
 # Use "make V=1" to debug this script
@@ -213,52 +213,7 @@ if [ "$1" = "clean" ]; then
        exit 0
 fi
 
-# Update version
-info GEN .version
-if [ -r .version ]; then
-       VERSION=$(expr 0$(cat .version) + 1)
-       echo $VERSION > .version
-else
-       rm -f .version
-       echo 1 > .version
-fi;
-
-# final build of init/
-${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init need-builtin=1
-
-#link vmlinux.o
-${MAKE} -f "${srctree}/scripts/Makefile.vmlinux_o"
-
-# Generate the list of in-tree objects in vmlinux
-#
-# This is used to retrieve symbol versions generated by genksyms.
-for f in ${KBUILD_VMLINUX_OBJS} ${KBUILD_VMLINUX_LIBS}; do
-       case ${f} in
-       *libgcc.a)
-               # Some architectures do '$(CC) --print-libgcc-file-name' to
-               # borrow libgcc.a from the toolchain.
-               # There is no EXPORT_SYMBOL in external objects. Ignore this.
-               ;;
-       *.a)
-               ${AR} t ${f} ;;
-       *)
-               echo ${f} ;;
-       esac
-done > .vmlinux.objs
-
-# modpost vmlinux.o to check for section mismatches
-${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1
-
-info MODINFO modules.builtin.modinfo
-${OBJCOPY} -j .modinfo -O binary vmlinux.o modules.builtin.modinfo
-info GEN modules.builtin
-# The second line aids cases where multiple modules share the same object.
-tr '\0' '\n' < modules.builtin.modinfo | sed -n 's/^[[:alnum:]:_]*\.file=//p' |
-       tr ' ' '\n' | uniq | sed -e 's:^:kernel/:' -e 's/$/.ko/' > modules.builtin
-
-if is_enabled CONFIG_MODULES; then
-       ${MAKE} -f "${srctree}/scripts/Makefile.vmlinux" .vmlinux.export.o
-fi
+${MAKE} -f "${srctree}/scripts/Makefile.build" obj=init init/version-timestamp.o
 
 btf_vmlinux_bin_o=""
 if is_enabled CONFIG_DEBUG_INFO_BTF; then
@@ -318,7 +273,6 @@ if is_enabled CONFIG_DEBUG_INFO_BTF && is_enabled CONFIG_BPF; then
        ${RESOLVE_BTFIDS} vmlinux
 fi
 
-info SYSMAP System.map
 mksysmap vmlinux System.map
 
 if is_enabled CONFIG_BUILDTIME_TABLE_SORT; then
@@ -331,9 +285,7 @@ fi
 
 # step a (see comment above)
 if is_enabled CONFIG_KALLSYMS; then
-       mksysmap ${kallsyms_vmlinux} .tmp_System.map
-
-       if ! cmp -s System.map .tmp_System.map; then
+       if ! cmp -s System.map ${kallsyms_vmlinux}.syms; then
                echo >&2 Inconsistent kallsyms data
                echo >&2 Try "make KALLSYMS_EXTRA_PASS=1" as a workaround
                exit 1
index ca40a5258c8778214c93f32ae241b1274d0cceaf..2596f78e52ef95683a11110085878233d564b40a 100755 (executable)
@@ -1,33 +1,10 @@
 #!/bin/sh
 # SPDX-License-Identifier: GPL-2.0
 
-TARGET=$1
-ARCH=$2
-SMP=$3
-PREEMPT=$4
-PREEMPT_DYNAMIC=$5
-PREEMPT_RT=$6
-CC_VERSION="$7"
-LD=$8
+UTS_MACHINE=$1
+CC_VERSION="$2"
+LD=$3
 
-# Do not expand names
-set -f
-
-# Fix the language to get consistent output
-LC_ALL=C
-export LC_ALL
-
-if [ -z "$KBUILD_BUILD_VERSION" ]; then
-       VERSION=$(cat .version 2>/dev/null || echo 1)
-else
-       VERSION=$KBUILD_BUILD_VERSION
-fi
-
-if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then
-       TIMESTAMP=`date`
-else
-       TIMESTAMP=$KBUILD_BUILD_TIMESTAMP
-fi
 if test -z "$KBUILD_BUILD_USER"; then
        LINUX_COMPILE_BY=$(whoami | sed 's/\\/\\\\/')
 else
@@ -39,63 +16,12 @@ else
        LINUX_COMPILE_HOST=$KBUILD_BUILD_HOST
 fi
 
-UTS_VERSION="#$VERSION"
-CONFIG_FLAGS=""
-if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi
-
-if [ -n "$PREEMPT_RT" ] ; then
-       CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT_RT"
-elif [ -n "$PREEMPT_DYNAMIC" ] ; then
-       CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT_DYNAMIC"
-elif [ -n "$PREEMPT" ] ; then
-       CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"
-fi
-
-# Truncate to maximum length
-UTS_LEN=64
-UTS_VERSION="$(echo $UTS_VERSION $CONFIG_FLAGS $TIMESTAMP | cut -b -$UTS_LEN)"
-
-# Generate a temporary compile.h
+LD_VERSION=$(LC_ALL=C $LD -v | head -n1 |
+               sed -e 's/(compatible with [^)]*)//' -e 's/[[:space:]]*$//')
 
-{ echo /\* This file is auto generated, version $VERSION \*/
-  if [ -n "$CONFIG_FLAGS" ] ; then echo "/* $CONFIG_FLAGS */"; fi
-
-  echo \#define UTS_MACHINE \"$ARCH\"
-
-  echo \#define UTS_VERSION \"$UTS_VERSION\"
-
-  printf '#define LINUX_COMPILE_BY "%s"\n' "$LINUX_COMPILE_BY"
-  echo \#define LINUX_COMPILE_HOST \"$LINUX_COMPILE_HOST\"
-
-  LD_VERSION=$($LD -v | head -n1 | sed 's/(compatible with [^)]*)//' \
-                     | sed 's/[[:space:]]*$//')
-  printf '#define LINUX_COMPILER "%s"\n' "$CC_VERSION, $LD_VERSION"
-} > .tmpcompile
-
-# Only replace the real compile.h if the new one is different,
-# in order to preserve the timestamp and avoid unnecessary
-# recompilations.
-# We don't consider the file changed if only the date/time changed,
-# unless KBUILD_BUILD_TIMESTAMP was explicitly set (e.g. for
-# reproducible builds with that value referring to a commit timestamp).
-# A kernel config change will increase the generation number, thus
-# causing compile.h to be updated (including date/time) due to the
-# changed comment in the
-# first line.
-
-if [ -z "$KBUILD_BUILD_TIMESTAMP" ]; then
-   IGNORE_PATTERN="UTS_VERSION"
-else
-   IGNORE_PATTERN="NOT_A_PATTERN_TO_BE_MATCHED"
-fi
-
-if [ -r $TARGET ] && \
-      grep -v $IGNORE_PATTERN $TARGET > .tmpver.1 && \
-      grep -v $IGNORE_PATTERN .tmpcompile > .tmpver.2 && \
-      cmp -s .tmpver.1 .tmpver.2; then
-   rm -f .tmpcompile
-else
-   echo "  UPD     $TARGET"
-   mv -f .tmpcompile $TARGET
-fi
-rm -f .tmpver.1 .tmpver.2
+cat <<EOF
+#define UTS_MACHINE            "${UTS_MACHINE}"
+#define LINUX_COMPILE_BY       "${LINUX_COMPILE_BY}"
+#define LINUX_COMPILE_HOST     "${LINUX_COMPILE_HOST}"
+#define LINUX_COMPILER         "${CC_VERSION}, ${LD_VERSION}"
+EOF
index ad8bbc52267d052d0d083a0f6b12e8faf7342a90..16a08b8ef2f83d5b9a16e4af4a998f1ae6dd17df 100755 (executable)
 
 # readprofile starts reading symbols when _stext is found, and
 # continue until it finds a symbol which is not either of 'T', 't',
-# 'W' or 'w'. __crc_ are 'A' and placed in the middle
-# so we just ignore them to let readprofile continue to work.
-# (At least sparc64 has __crc_ in the middle).
+# 'W' or 'w'.
+#
+# Ignored prefixes:
+#  $                    - local symbols for ARM, MIPS, etc.
+#  .L                   - local labels, .LBB,.Ltmpxxx,.L__unnamed_xx,.LASANPC, etc.
+#  __crc_               - modversions
+#  __kstrtab_           - EXPORT_SYMBOL (symbol name)
+#  __kstrtabns_         - EXPORT_SYMBOL (namespace)
+#
+# Ignored symbols:
+#  L0                   - for LoongArch?
 
-$NM -n $1 | grep -v '\( [aNUw] \)\|\(__crc_\)\|\( \$[adt]\)\|\( \.L\)\|\( L0\)' > $2
+$NM -n $1 | grep -v            \
+       -e ' [aNUw] '           \
+       -e ' \$'                \
+       -e ' \.L'               \
+       -e ' __crc_'            \
+       -e ' __kstrtab_'        \
+       -e ' __kstrtabns_'      \
+       -e ' L0$'               \
+> $2
index 8fa7c5b8a1a15d4ed004f3cebd5fd0ded82f2441..c920c1b18e7ada2819afe82c1277a09f604f7141 100755 (executable)
@@ -88,10 +88,10 @@ $S
        mkdir -p %{buildroot}/boot
        %ifarch ia64
        mkdir -p %{buildroot}/boot/efi
-       cp \$($MAKE image_name) %{buildroot}/boot/efi/vmlinuz-$KERNELRELEASE
+       cp \$($MAKE -s image_name) %{buildroot}/boot/efi/vmlinuz-$KERNELRELEASE
        ln -s efi/vmlinuz-$KERNELRELEASE %{buildroot}/boot/
        %else
-       cp \$($MAKE image_name) %{buildroot}/boot/vmlinuz-$KERNELRELEASE
+       cp \$($MAKE -s image_name) %{buildroot}/boot/vmlinuz-$KERNELRELEASE
        %endif
 $M     $MAKE %{?_smp_mflags} INSTALL_MOD_PATH=%{buildroot} modules_install
        $MAKE %{?_smp_mflags} INSTALL_HDR_PATH=%{buildroot}/usr headers_install