2022-09-24 18:21:53

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v3 0/7] kbuild: various cleanups

- Link vmlinux and modules in parallel
- Remove head-y syntax


Masahiro Yamada (7):
kbuild: hard-code KBUILD_ALLDIRS in scripts/Makefile.package
kbuild: list sub-directories in ./Kbuild
kbuild: move .vmlinux.objs rule to Makefile.modpost
kbuild: move vmlinux.o rule to the top Makefile
kbuild: unify two modpost invocations
kbuild: use obj-y instead extra-y for objects placed at the head
kbuild: remove head-y syntax

Documentation/kbuild/makefiles.rst | 27 +----
Kbuild | 24 ++++
Makefile | 119 +++++++++++---------
arch/alpha/Makefile | 2 -
arch/alpha/kernel/Makefile | 4 +-
arch/arc/Makefile | 2 -
arch/arc/kernel/Makefile | 4 +-
arch/arm/Makefile | 3 -
arch/arm/kernel/Makefile | 4 +-
arch/arm64/Makefile | 3 -
arch/arm64/kernel/Makefile | 4 +-
arch/csky/Makefile | 2 -
arch/csky/kernel/Makefile | 4 +-
arch/hexagon/Makefile | 2 -
arch/hexagon/kernel/Makefile | 3 +-
arch/ia64/Makefile | 1 -
arch/ia64/kernel/Makefile | 4 +-
arch/loongarch/Makefile | 2 -
arch/loongarch/kernel/Makefile | 4 +-
arch/m68k/68000/Makefile | 2 +-
arch/m68k/Makefile | 9 --
arch/m68k/coldfire/Makefile | 2 +-
arch/m68k/kernel/Makefile | 23 ++--
arch/microblaze/Makefile | 1 -
arch/microblaze/kernel/Makefile | 4 +-
arch/mips/Makefile | 2 -
arch/mips/kernel/Makefile | 4 +-
arch/nios2/Makefile | 1 -
arch/nios2/kernel/Makefile | 2 +-
arch/openrisc/Makefile | 2 -
arch/openrisc/kernel/Makefile | 4 +-
arch/parisc/Makefile | 2 -
arch/parisc/kernel/Makefile | 4 +-
arch/powerpc/Makefile | 12 --
arch/powerpc/kernel/Makefile | 20 ++--
arch/riscv/Makefile | 2 -
arch/riscv/kernel/Makefile | 2 +-
arch/s390/Makefile | 2 -
arch/s390/kernel/Makefile | 4 +-
arch/sh/Makefile | 2 -
arch/sh/kernel/Makefile | 4 +-
arch/sparc/Makefile | 2 -
arch/sparc/kernel/Makefile | 3 +-
arch/x86/Makefile | 5 -
arch/x86/kernel/Makefile | 10 +-
arch/xtensa/Makefile | 2 -
arch/xtensa/kernel/Makefile | 4 +-
scripts/Makefile.lib | 2 +
scripts/Makefile.modfinal | 2 +-
scripts/Makefile.modpost | 112 ++++++++----------
scripts/Makefile.package | 5 +-
scripts/Makefile.vmlinux_o | 6 +-
scripts/clang-tools/gen_compile_commands.py | 19 +---
scripts/head-object-list.txt | 53 +++++++++
scripts/link-vmlinux.sh | 34 +-----
55 files changed, 273 insertions(+), 314 deletions(-)
create mode 100644 scripts/head-object-list.txt

--
2.34.1


2022-09-24 18:22:10

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v3 2/7] kbuild: list sub-directories in ./Kbuild

Use the ordinary obj-y syntax to list subdirectories.

Note1:
Previously, the link order of lib-y depended on CONFIG_MODULES; lib-y
was linked before drivers-y when CONFIG_MODULES=y, otherwise after
drivers-y. This was a bug of commit 7273ad2b08f8 ("kbuild: link lib-y
objects to vmlinux forcibly when CONFIG_MODULES=y"), but it was not a
big deal after all. Now, all objects listed in lib-y are linked last,
irrespective of CONFIG_MODULES.

Note2:
Finally, the single target build in arch/*/lib/ works correctly. There was
a bug report about this. [1]

$ make ARCH=arm arch/arm/lib/findbit.o
CALL scripts/checksyscalls.sh
AS arch/arm/lib/findbit.o

[1]: https://lore.kernel.org/linux-kbuild/YvUQOwL6lD4%2F5%[email protected]/

Signed-off-by: Masahiro Yamada <[email protected]>
---

Changes in v3:
- Also move libs-y to fix the bug reported by:
https://lore.kernel.org/linux-kbuild/[email protected]/

Kbuild | 24 ++++++++++++++++
Makefile | 65 ++++++++++++++------------------------------
scripts/Makefile.lib | 2 ++
3 files changed, 46 insertions(+), 45 deletions(-)

diff --git a/Kbuild b/Kbuild
index 0b9e8a16a621..8a37584d1fd6 100644
--- a/Kbuild
+++ b/Kbuild
@@ -72,3 +72,27 @@ $(atomic-checks): $(obj)/.checked-%: include/linux/atomic/% FORCE
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-y += $(ARCH_LIB)
+obj-y += drivers/
+obj-y += sound/
+obj-$(CONFIG_SAMPLES) += samples/
+obj-$(CONFIG_NET) += net/
+obj-y += virt/
+obj-y += $(ARCH_DRIVERS)
diff --git a/Makefile b/Makefile
index eb4bbbc898d0..f793c3b1eaec 100644
--- a/Makefile
+++ b/Makefile
@@ -676,11 +676,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

@@ -1099,33 +1096,24 @@ 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/

-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 := $(head-y) ./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_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
@@ -1140,7 +1128,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
@@ -1168,7 +1156,7 @@ targets := vmlinux

# The actual objects are generated when descending,
# make sure no implicit rule kicks in
-$(sort $(vmlinux-deps) $(subdir-modorder)): descend ;
+$(sort $(vmlinux-deps)): $(build-dir) ;

filechk_kernel.release = \
echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
@@ -1439,13 +1427,6 @@ endif

modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_prepare

-cmd_modules_order = cat $(real-prereqs) > $@
-
-modules.order: $(subdir-modorder) FORCE
- $(call if_changed,modules_order)
-
-targets += modules.order
-
# Target to prepare building external modules
modules_prepare: prepare
$(Q)$(MAKE) $(build)=scripts scripts/module.lds
@@ -1716,9 +1697,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
@@ -1756,6 +1735,9 @@ PHONY += modules modules_install modules_prepare

ifdef CONFIG_MODULES

+$(MODORDER): $(build-dir)
+ @:
+
modules: modules_check
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost

@@ -1809,7 +1791,7 @@ single-no-ko := $(filter-out $(single-ko), $(MAKECMDGOALS)) \

$(single-ko): single_modpost
@:
-$(single-no-ko): descend
+$(single-no-ko): $(build-dir)
@:

# Remove MODORDER when done because it is not the real one.
@@ -1819,24 +1801,17 @@ single_modpost: $(single-no-ko) modules_prepare
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
$(Q)rm -f $(MODORDER)

-single-goals := $(addprefix $(extmod_prefix), $(single-no-ko))
-
-# trim unrelated directories
-build-dirs := $(foreach d, $(build-dirs), \
- $(if $(filter $d/%, $(single-goals)), $d))
+single-goals := $(addprefix $(build-dir)/, $(single-no-ko))

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)=$@ need-builtin=1 need-modorder=1 \
- $(filter $@/%, $(single-goals))
+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
diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
index 3fb6a99e78c4..140dcc3c57bd 100644
--- a/scripts/Makefile.lib
+++ b/scripts/Makefile.lib
@@ -89,6 +89,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))
@@ -100,6 +101,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.
--
2.34.1

2022-09-24 18:22:48

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v3 1/7] kbuild: hard-code KBUILD_ALLDIRS in scripts/Makefile.package

My plan is to list subdirectories in ./Kbuild. Once it occurs,
$(vmlinux-alldirs) will not contain all subdirectories.

Let's hard-code the directory list until I get around to implementing
a more sophisticated way for generating a source tarball.

Signed-off-by: Masahiro Yamada <[email protected]>
---

Changes in v3:
- New patch

Makefile | 2 --
scripts/Makefile.package | 5 ++++-
2 files changed, 4 insertions(+), 3 deletions(-)

diff --git a/Makefile b/Makefile
index 57cf4a5bea6d..eb4bbbc898d0 100644
--- a/Makefile
+++ b/Makefile
@@ -1129,8 +1129,6 @@ KBUILD_VMLINUX_OBJS += $(patsubst %/,%/built-in.a, $(drivers-y))

export KBUILD_VMLINUX_OBJS 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)

diff --git a/scripts/Makefile.package b/scripts/Makefile.package
index 5017f6b2da80..8bbcced67c22 100644
--- a/scripts/Makefile.package
+++ b/scripts/Makefile.package
@@ -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

--
2.34.1

2022-09-24 18:23:51

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v3 5/7] kbuild: unify two modpost invocations

Currently, modpost is executed twice; first for vmlinux, second
for modules.

This commit merges them.

Current build flow
==================

1) build obj-y and obj-m objects
2) link vmlinux.o
3) modpost for vmlinux
4) link vmlinux
5) modpost for modules
6) link modules (*.ko)

The build steps 1) through 6) are serialized, that is, modules are
built after vmlinux. You do not get benefits of parallel builds when
scripts/link-vmlinux.sh is being run.

New build flow
==============

1) build obj-y and obj-m objects
2) link vmlinux.o
3) modpost for vmlinux and modules
4a) link vmlinux
4b) link modules (*.ko)

In the new build flow, modpost is invoked just once.

vmlinux and modules are built in parallel. One exception is
CONFIG_DEBUG_INFO_BTF_MODULES=y, where modules depend on vmlinux.

Signed-off-by: Masahiro Yamada <[email protected]>
---

(no changes since v1)

Makefile | 30 ++++++++++---
scripts/Makefile.modfinal | 2 +-
scripts/Makefile.modpost | 93 ++++++++++++---------------------------
scripts/link-vmlinux.sh | 3 --
4 files changed, 53 insertions(+), 75 deletions(-)

diff --git a/Makefile b/Makefile
index b5dfb54b1993..cf9d7b1d8c14 100644
--- a/Makefile
+++ b/Makefile
@@ -1152,7 +1152,7 @@ cmd_link-vmlinux = \
$(CONFIG_SHELL) $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)"; \
$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)

-vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) FORCE
+vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) modpost FORCE
+$(call if_changed_dep,link-vmlinux)

targets := vmlinux
@@ -1428,7 +1428,13 @@ endif
# Build modules
#

-modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_prepare
+# *.ko are usually independent of vmlinux, but CONFIG_DEBUG_INFOBTF_MODULES
+# is an exception.
+ifdef CONFIG_DEBUG_INFO_BTF_MODULES
+modules: vmlinux
+endif
+
+modules: modules_prepare

# Target to prepare building external modules
modules_prepare: prepare
@@ -1741,8 +1747,12 @@ ifdef CONFIG_MODULES
$(MODORDER): $(build-dir)
@:

-modules: modules_check
- $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+# 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)
@@ -1773,6 +1783,11 @@ 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:
@@ -1792,16 +1807,19 @@ 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): $(build-dir)
@:

# Remove MODORDER when done because it is not the real one.
PHONY += single_modpost
-single_modpost: $(single-no-ko) modules_prepare
+single_modules: $(single-no-ko) modules_prepare
$(Q){ $(foreach m, $(single-ko), echo $(extmod_prefix)$m;) } > $(MODORDER)
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
+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))
diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal
index 35100e981f4a..a3cf9e3647c9 100644
--- a/scripts/Makefile.modfinal
+++ b/scripts/Makefile.modfinal
@@ -55,7 +55,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))
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
index 04ad00917b2f..2daf760eeb25 100644
--- a/scripts/Makefile.modpost
+++ b/scripts/Makefile.modpost
@@ -32,9 +32,6 @@
# 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:

@@ -45,24 +42,23 @@ MODPOST = scripts/mod/modpost \
$(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)
+# 'make -i -k' ignores compile errors, and builds as many modules as possible.
+ifneq ($(findstring i,$(filter-out --%,$(MAKEFLAGS))),)
+MODPOST += -n
+endif

-__modpost: vmlinux.symvers
+ifeq ($(KBUILD_EXTMOD),)

# Generate the list of in-tree objects in vmlinux
# ---------------------------------------------------------------------------

# This is used to retrieve symbol versions generated by genksyms.
ifdef CONFIG_MODVERSIONS
-vmlinux.symvers: .vmlinux.objs
+vmlinux.symvers Module.symvers: .vmlinux.objs
endif

# Ignore libgcc.a
@@ -83,24 +79,12 @@ targets += .vmlinux.objs
.vmlinux.objs: $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
$(call if_changed,vmlinux_objs)

-else
-
-ifeq ($(KBUILD_EXTMOD),)
-
-input-symdump := vmlinux.symvers
-output-symdump := modules-only.symvers
-
-quiet_cmd_cat = GEN $@
- cmd_cat = cat $(real-prereqs) > $@
-
-ifneq ($(wildcard vmlinux.symvers),)
-
-__modpost: Module.symvers
-Module.symvers: vmlinux.symvers modules-only.symvers FORCE
- $(call if_changed,cat)
-
-targets += Module.symvers
+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
@@ -112,56 +96,35 @@ 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 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)
-
-# 'make -i -k' ignores compile errors, and builds as many modules as possible.
-ifneq ($(findstring i,$(filter-out --%,$(MAKEFLAGS))),)
-MODPOST += -n
-endif
+MODPOST += -e $(addprefix -i ,$(module.symvers-if-present) $(KBUILD_EXTRA_SYMBOLS))

-# 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.'
+endif # ($(KBUILD_EXTMOD),)

-# 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)),)
+ifneq ($(KBUILD_MODPOST_WARN)$(missing-input),)
MODPOST += -w
endif

+modorder-if-needed := $(if $(KBUILD_MODULES), $(MODORDER))
+
# 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) $(vmlinux.o-if-present) -T -

targets += $(output-symdump)
+$(output-symdump): $(modorder-if-needed) $(vmlinux.o-if-present) $(moudle.symvers-if-present) FORCE
+ $(call if_changed,modpost)

__modpost: $(output-symdump)
-ifneq ($(KBUILD_MODPOST_NOFINAL),1)
- $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
-endif
-
-endif
-
PHONY += FORCE
FORCE:

diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
index 07486f90d5e2..6a197d8a88ac 100755
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
@@ -214,9 +214,6 @@ if [ "$1" = "clean" ]; then
exit 0
fi

-# 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
--
2.34.1

2022-09-24 18:33:40

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v3 4/7] kbuild: move vmlinux.o rule to the top Makefile

Move the build rules of vmlinux.o out of scripts/link-vmlinux.sh to
clearly separate 1) pre-modpost, 2) modpost, 3) post-modpost stages.
This will make furture refactoring possible.

Signed-off-by: Masahiro Yamada <[email protected]>
---

(no changes since v1)

Makefile | 5 ++++-
scripts/link-vmlinux.sh | 3 ---
2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/Makefile b/Makefile
index 92413b6de451..b5dfb54b1993 100644
--- a/Makefile
+++ b/Makefile
@@ -1142,6 +1142,9 @@ quiet_cmd_autoksyms_h = GEN $@
$(autoksyms_h):
$(call cmd,autoksyms_h)

+vmlinux.o: autoksyms_recursive $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
+ $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux_o
+
ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)

# Final link of vmlinux with optional arch pass after final link
@@ -1149,7 +1152,7 @@ cmd_link-vmlinux = \
$(CONFIG_SHELL) $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)"; \
$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)

-vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE
+vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) FORCE
+$(call if_changed_dep,link-vmlinux)

targets := vmlinux
diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
index 161bca64e8aa..07486f90d5e2 100755
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
@@ -214,9 +214,6 @@ if [ "$1" = "clean" ]; then
exit 0
fi

-#link vmlinux.o
-${MAKE} -f "${srctree}/scripts/Makefile.vmlinux_o"
-
# modpost vmlinux.o to check for section mismatches
${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1

--
2.34.1

2022-09-24 18:36:29

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v3 7/7] kbuild: remove head-y syntax

Kbuild puts the objects listed in head-y at the head of vmlinux.
Conventionally, we do this for head*.S, which contains the kernel entry
point.

A counter approach is to control the section order by the linker script.
Actually, the code marked as __HEAD goes into the ".head.text" section,
which is placed before the normal ".text" section.

I do not know if both of them are needed. From the build system
perspective, head-y is not mandatory. If you can achieve the proper code
placement by the linker script only, it would be cleaner.

I collected the current head-y objects into head-object-list.txt. It is
a whitelist. My hope is it will be reduced in the long run.

Signed-off-by: Masahiro Yamada <[email protected]>
---

(no changes since v1)

Documentation/kbuild/makefiles.rst | 9 ++---
Makefile | 4 +--
arch/alpha/Makefile | 2 --
arch/arc/Makefile | 2 --
arch/arm/Makefile | 3 --
arch/arm64/Makefile | 3 --
arch/csky/Makefile | 2 --
arch/hexagon/Makefile | 2 --
arch/ia64/Makefile | 1 -
arch/loongarch/Makefile | 2 --
arch/m68k/Makefile | 9 -----
arch/microblaze/Makefile | 1 -
arch/mips/Makefile | 2 --
arch/nios2/Makefile | 1 -
arch/openrisc/Makefile | 2 --
arch/parisc/Makefile | 2 --
arch/powerpc/Makefile | 12 -------
arch/riscv/Makefile | 2 --
arch/s390/Makefile | 2 --
arch/sh/Makefile | 2 --
arch/sparc/Makefile | 2 --
arch/x86/Makefile | 5 ---
arch/xtensa/Makefile | 2 --
scripts/head-object-list.txt | 53 ++++++++++++++++++++++++++++++
24 files changed, 60 insertions(+), 67 deletions(-)
create mode 100644 scripts/head-object-list.txt

diff --git a/Documentation/kbuild/makefiles.rst b/Documentation/kbuild/makefiles.rst
index 5a6a8426cc97..60134ddf3db1 100644
--- a/Documentation/kbuild/makefiles.rst
+++ b/Documentation/kbuild/makefiles.rst
@@ -1070,8 +1070,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
@@ -1219,6 +1218,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
@@ -1262,8 +1264,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.

diff --git a/Makefile b/Makefile
index a8c19f92ac9e..ab986e4c5189 100644
--- a/Makefile
+++ b/Makefile
@@ -1149,10 +1149,10 @@ quiet_cmd_ar_vmlinux.a = AR $@
cmd_ar_vmlinux.a = \
rm -f $@; \
$(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
- $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $(head-y)
+ $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $$($(AR) t $@ | grep -F --file=$(srctree)/scripts/head-object-list.txt)

targets += vmlinux.a
-vmlinux.a: $(KBUILD_VMLINUX_OBJS) FORCE
+vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
$(call if_changed,ar_vmlinux.a)

vmlinux.o: autoksyms_recursive vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
diff --git a/arch/alpha/Makefile b/arch/alpha/Makefile
index 881cb913e23a..45158024085e 100644
--- a/arch/alpha/Makefile
+++ b/arch/alpha/Makefile
@@ -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
diff --git a/arch/arc/Makefile b/arch/arc/Makefile
index efc54f3e35e0..329400a1c355 100644
--- a/arch/arc/Makefile
+++ b/arch/arc/Makefile
@@ -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/

diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 56f655deebb1..29d15c9a433e 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -134,9 +134,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
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index 6d9d4a58b898..6e03f15bb041 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -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)
diff --git a/arch/csky/Makefile b/arch/csky/Makefile
index 4e1d619fd5c6..0e4237e55758 100644
--- a/arch/csky/Makefile
+++ b/arch/csky/Makefile
@@ -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/ \
diff --git a/arch/hexagon/Makefile b/arch/hexagon/Makefile
index 44312bc147d8..92d005958dfb 100644
--- a/arch/hexagon/Makefile
+++ b/arch/hexagon/Makefile
@@ -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
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile
index e55c2f138656..56c4bb276b6e 100644
--- a/arch/ia64/Makefile
+++ b/arch/ia64/Makefile
@@ -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/

diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
index ec3de6191276..131fc210c2bf 100644
--- a/arch/loongarch/Makefile
+++ b/arch/loongarch/Makefile
@@ -72,8 +72,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/

ifeq ($(KBUILD_EXTMOD),)
diff --git a/arch/m68k/Makefile b/arch/m68k/Makefile
index e358605b70ba..43e39040d3ac 100644
--- a/arch/m68k/Makefile
+++ b/arch/m68k/Makefile
@@ -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/


diff --git a/arch/microblaze/Makefile b/arch/microblaze/Makefile
index 1826d9ce4459..3f8a86c4336a 100644
--- a/arch/microblaze/Makefile
+++ b/arch/microblaze/Makefile
@@ -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
diff --git a/arch/mips/Makefile b/arch/mips/Makefile
index 4d2a3e73fc45..b296e33f8e33 100644
--- a/arch/mips/Makefile
+++ b/arch/mips/Makefile
@@ -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/

diff --git a/arch/nios2/Makefile b/arch/nios2/Makefile
index 3f34e6831863..f1ff4ce0f1a2 100644
--- a/arch/nios2/Makefile
+++ b/arch/nios2/Makefile
@@ -37,7 +37,6 @@ 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)

INSTALL_PATH ?= /tftpboot
diff --git a/arch/openrisc/Makefile b/arch/openrisc/Makefile
index b446510173cd..68249521db5a 100644
--- a/arch/openrisc/Makefile
+++ b/arch/openrisc/Makefile
@@ -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
diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile
index e38d993d87f2..a2d8600521f9 100644
--- a/arch/parisc/Makefile
+++ b/arch/parisc/Makefile
@@ -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
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 02742facf895..89c27827a11f 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -226,18 +226,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_FSL_BOOKE) := arch/powerpc/kernel/head_fsl_booke.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

diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
index 3fa8ef336822..e013df8e7b8b 100644
--- a/arch/riscv/Makefile
+++ b/arch/riscv/Makefile
@@ -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

diff --git a/arch/s390/Makefile b/arch/s390/Makefile
index 4cb5d17e7ead..de6d8b2ea4d8 100644
--- a/arch/s390/Makefile
+++ b/arch/s390/Makefile
@@ -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/

diff --git a/arch/sh/Makefile b/arch/sh/Makefile
index b39412bf91fb..5c8776482530 100644
--- a/arch/sh/Makefile
+++ b/arch/sh/Makefile
@@ -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
diff --git a/arch/sparc/Makefile b/arch/sparc/Makefile
index fe58a410b4ce..a4ea5b05f288 100644
--- a/arch/sparc/Makefile
+++ b/arch/sparc/Makefile
@@ -56,8 +56,6 @@ endif

endif

-head-y := arch/sparc/kernel/head_$(BITS).o
-
libs-y += arch/sparc/prom/
libs-y += arch/sparc/lib/

diff --git a/arch/x86/Makefile b/arch/x86/Makefile
index bafbd905e6e7..9afd323c6916 100644
--- a/arch/x86/Makefile
+++ b/arch/x86/Makefile
@@ -234,11 +234,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
diff --git a/arch/xtensa/Makefile b/arch/xtensa/Makefile
index 5097caa7bf0c..bfd8e433ed62 100644
--- a/arch/xtensa/Makefile
+++ b/arch/xtensa/Makefile
@@ -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
diff --git a/scripts/head-object-list.txt b/scripts/head-object-list.txt
new file mode 100644
index 000000000000..dd2ba2eda636
--- /dev/null
+++ b/scripts/head-object-list.txt
@@ -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_book3s_32.o
+arch/powerpc/kernel/head_fsl_booke.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
--
2.34.1

2022-09-24 19:03:35

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v3 6/7] kbuild: use obj-y instead extra-y for objects placed at the head

The objects placed at the head of vmlinux need special treatments:

- arch/$(SRCARCH)/Makefile adds them to head-y in order to place
them before other archives in the linker command line.

- arch/$(SRCARCH)/kernel/Makefile adds them to extra-y instead of
obj-y to avoid them going into built-in.a.

This commit gets rid of the latter.

Create vmlinux.a to collect all the objects that are unconditionally
linked to vmlinux. The objects listed in head-y are moved to the head
of vmlinux.a by using 'ar m'.

With this, arch/$(SRCARCH)/kernel/Makefile can consistently use obj-y
for builtin objects.

There is no *.o that is directly linked to vmlinux. Drop unneeded code
in scripts/clang-tools/gen_compile_commands.py.

$(AR) mPi needs 'T' to workaround the llvm-ar bug. The fix was suggested
by Nathan Chancellor [1].

[1]: https://lore.kernel.org/llvm/[email protected]/

Signed-off-by: Masahiro Yamada <[email protected]>
---

Changes in v3:
- Fix build error for m68k
- Fix the bug for llvm-ar <= 14

Documentation/kbuild/makefiles.rst | 18 +---------------
Makefile | 23 ++++++++++++++++-----
arch/alpha/kernel/Makefile | 4 ++--
arch/arc/kernel/Makefile | 4 ++--
arch/arm/kernel/Makefile | 4 ++--
arch/arm64/kernel/Makefile | 4 ++--
arch/csky/kernel/Makefile | 4 ++--
arch/hexagon/kernel/Makefile | 3 ++-
arch/ia64/kernel/Makefile | 4 ++--
arch/loongarch/kernel/Makefile | 4 ++--
arch/m68k/68000/Makefile | 2 +-
arch/m68k/coldfire/Makefile | 2 +-
arch/m68k/kernel/Makefile | 23 +++++++++++----------
arch/microblaze/kernel/Makefile | 4 ++--
arch/mips/kernel/Makefile | 4 ++--
arch/nios2/kernel/Makefile | 2 +-
arch/openrisc/kernel/Makefile | 4 ++--
arch/parisc/kernel/Makefile | 4 ++--
arch/powerpc/kernel/Makefile | 20 +++++++++---------
arch/riscv/kernel/Makefile | 2 +-
arch/s390/kernel/Makefile | 4 ++--
arch/sh/kernel/Makefile | 4 ++--
arch/sparc/kernel/Makefile | 3 +--
arch/x86/kernel/Makefile | 10 ++++-----
arch/xtensa/kernel/Makefile | 4 ++--
scripts/Makefile.modpost | 5 ++---
scripts/Makefile.vmlinux_o | 6 +++---
scripts/clang-tools/gen_compile_commands.py | 19 +----------------
scripts/link-vmlinux.sh | 10 ++++-----
29 files changed, 91 insertions(+), 113 deletions(-)

diff --git a/Documentation/kbuild/makefiles.rst b/Documentation/kbuild/makefiles.rst
index ee7e3ea1fbe1..5a6a8426cc97 100644
--- a/Documentation/kbuild/makefiles.rst
+++ b/Documentation/kbuild/makefiles.rst
@@ -340,19 +340,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
@@ -360,10 +348,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.
diff --git a/Makefile b/Makefile
index cf9d7b1d8c14..a8c19f92ac9e 100644
--- a/Makefile
+++ b/Makefile
@@ -645,6 +645,8 @@ else
__all: modules
endif

+targets :=
+
# Decide whether to build built-in, modular, or both.
# Normally, just do built-in.

@@ -1107,7 +1109,7 @@ 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) ./built-in.a
+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))
@@ -1115,7 +1117,7 @@ else
KBUILD_VMLINUX_LIBS := $(patsubst %/,%/lib.a, $(libs-y))
endif

-export KBUILD_VMLINUX_OBJS KBUILD_VMLINUX_LIBS
+export KBUILD_VMLINUX_LIBS
export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds

vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)
@@ -1142,7 +1144,18 @@ quiet_cmd_autoksyms_h = GEN $@
$(autoksyms_h):
$(call cmd,autoksyms_h)

-vmlinux.o: autoksyms_recursive $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
+# '$(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) $@ $(head-y)
+
+targets += vmlinux.a
+vmlinux.a: $(KBUILD_VMLINUX_OBJS) FORCE
+ $(call if_changed,ar_vmlinux.a)
+
+vmlinux.o: autoksyms_recursive vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux_o

ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
@@ -1155,7 +1168,7 @@ cmd_link-vmlinux = \
vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) modpost FORCE
+$(call if_changed_dep,link-vmlinux)

-targets := vmlinux
+targets += vmlinux

# The actual objects are generated when descending,
# make sure no implicit rule kicks in
@@ -1880,7 +1893,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)

diff --git a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile
index 5a74581bf0ee..5a5b0a8b7c6a 100644
--- a/arch/alpha/kernel/Makefile
+++ b/arch/alpha/kernel/Makefile
@@ -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

diff --git a/arch/arc/kernel/Makefile b/arch/arc/kernel/Makefile
index 8c4fc4b54c14..0723d888ac44 100644
--- a/arch/arc/kernel/Makefile
+++ b/arch/arc/kernel/Makefile
@@ -3,7 +3,7 @@
# Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (http://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
diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
index 553866751e1a..8feaa3217ec5 100644
--- a/arch/arm/kernel/Makefile
+++ b/arch/arm/kernel/Makefile
@@ -89,7 +89,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
@@ -109,4 +109,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
diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
index 1add7b01efa7..b619ff207a57 100644
--- a/arch/arm64/kernel/Makefile
+++ b/arch/arm64/kernel/Makefile
@@ -85,8 +85,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)\""
diff --git a/arch/csky/kernel/Makefile b/arch/csky/kernel/Makefile
index 6f14c924b20d..8a868316b912 100644
--- a/arch/csky/kernel/Makefile
+++ b/arch/csky/kernel/Makefile
@@ -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/
diff --git a/arch/hexagon/kernel/Makefile b/arch/hexagon/kernel/Makefile
index fae3dce32fde..e73cb321630e 100644
--- a/arch/hexagon/kernel/Makefile
+++ b/arch/hexagon/kernel/Makefile
@@ -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
diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile
index 08d4a2ba0652..4a1fcb121dda 100644
--- a/arch/ia64/kernel/Makefile
+++ b/arch/ia64/kernel/Makefile
@@ -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 \
diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile
index e5be17009fe8..6c33b5c45573 100644
--- a/arch/loongarch/kernel/Makefile
+++ b/arch/loongarch/kernel/Makefile
@@ -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

diff --git a/arch/m68k/68000/Makefile b/arch/m68k/68000/Makefile
index 674541fdf5b8..279560add577 100644
--- a/arch/m68k/68000/Makefile
+++ b/arch/m68k/68000/Makefile
@@ -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
diff --git a/arch/m68k/coldfire/Makefile b/arch/m68k/coldfire/Makefile
index 9419a6c1f036..c56bc0dc7f2e 100644
--- a/arch/m68k/coldfire/Makefile
+++ b/arch/m68k/coldfire/Makefile
@@ -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
diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile
index c0833da6a2ca..af015447dfb4 100644
--- a/arch/m68k/kernel/Makefile
+++ b/arch/m68k/kernel/Makefile
@@ -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
diff --git a/arch/microblaze/kernel/Makefile b/arch/microblaze/kernel/Makefile
index 15a20eb814ce..4393bee64eaf 100644
--- a/arch/microblaze/kernel/Makefile
+++ b/arch/microblaze/kernel/Makefile
@@ -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
diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile
index 7c96282bff2e..5d1addac5e28 100644
--- a/arch/mips/kernel/Makefile
+++ b/arch/mips/kernel/Makefile
@@ -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
diff --git a/arch/nios2/kernel/Makefile b/arch/nios2/kernel/Makefile
index 0b645e1e3158..78a913181fa1 100644
--- a/arch/nios2/kernel/Makefile
+++ b/arch/nios2/kernel/Makefile
@@ -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
diff --git a/arch/openrisc/kernel/Makefile b/arch/openrisc/kernel/Makefile
index 2d172e79f58d..79129161f3e0 100644
--- a/arch/openrisc/kernel/Makefile
+++ b/arch/openrisc/kernel/Makefile
@@ -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

diff --git a/arch/parisc/kernel/Makefile b/arch/parisc/kernel/Makefile
index d0bfac89a842..3d138c9cf9ce 100644
--- a/arch/parisc/kernel/Makefile
+++ b/arch/parisc/kernel/Makefile
@@ -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 \
diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
index 06d2d1f78f71..ad3decb9f20b 100644
--- a/arch/powerpc/kernel/Makefile
+++ b/arch/powerpc/kernel/Makefile
@@ -118,12 +118,12 @@ obj-$(CONFIG_PPC_FSL_BOOK3E) += cpu_setup_fsl_booke.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_FSL_BOOKE) := head_fsl_booke.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_FSL_BOOKE) += head_fsl_booke.o
+obj-$(CONFIG_PPC_8xx) += head_8xx.o
extra-y += vmlinux.lds

obj-$(CONFIG_RELOCATABLE) += reloc_$(BITS).o
@@ -198,10 +198,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

diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
index 33bb60a354cd..db6e4b1294ba 100644
--- a/arch/riscv/kernel/Makefile
+++ b/arch/riscv/kernel/Makefile
@@ -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
diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile
index 3cbfa9fddd9a..7ce00816b8df 100644
--- a/arch/s390/kernel/Makefile
+++ b/arch/s390/kernel/Makefile
@@ -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

-extra-y += head64.o vmlinux.lds
+extra-y += vmlinux.lds

obj-$(CONFIG_SYSFS) += nospec-sysfs.o
CFLAGS_REMOVE_nospec-branch.o += $(CC_FLAGS_EXPOLINE)
diff --git a/arch/sh/kernel/Makefile b/arch/sh/kernel/Makefile
index aa0fbc9202b1..69cd9ac4b2ab 100644
--- a/arch/sh/kernel/Makefile
+++ b/arch/sh/kernel/Makefile
@@ -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 \
diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile
index d3a0e072ebe8..b328e4a0bd57 100644
--- a/arch/sparc/kernel/Makefile
+++ b/arch/sparc/kernel/Makefile
@@ -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
diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
index a20a5ebfacd7..956e50ca06e0 100644
--- a/arch/x86/kernel/Makefile
+++ b/arch/x86/kernel/Makefile
@@ -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
diff --git a/arch/xtensa/kernel/Makefile b/arch/xtensa/kernel/Makefile
index 897c1c741058..f28b8e3d717e 100644
--- a/arch/xtensa/kernel/Makefile
+++ b/arch/xtensa/kernel/Makefile
@@ -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

diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
index 2daf760eeb25..ceb1d78140e7 100644
--- a/scripts/Makefile.modpost
+++ b/scripts/Makefile.modpost
@@ -70,13 +70,12 @@ quiet_cmd_vmlinux_objs = GEN $@
for f in $(real-prereqs); do \
case $${f} in \
*libgcc.a) ;; \
- *.a) $(AR) t $${f} ;; \
- *) echo $${f} ;; \
+ *) $(AR) t $${f} ;; \
esac \
done > $@

targets += .vmlinux.objs
-.vmlinux.objs: $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
+.vmlinux.objs: vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
$(call if_changed,vmlinux_objs)

vmlinux.o-if-present := $(wildcard vmlinux.o)
diff --git a/scripts/Makefile.vmlinux_o b/scripts/Makefile.vmlinux_o
index 84019814f33f..81a4e0484457 100644
--- a/scripts/Makefile.vmlinux_o
+++ b/scripts/Makefile.vmlinux_o
@@ -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
@@ -55,7 +55,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,7 +64,7 @@ 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
diff --git a/scripts/clang-tools/gen_compile_commands.py b/scripts/clang-tools/gen_compile_commands.py
index 47da25b3ba7d..d800b2c0af97 100755
--- a/scripts/clang-tools/gen_compile_commands.py
+++ b/scripts/clang-tools/gen_compile_commands.py
@@ -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/link-vmlinux.sh b/scripts/link-vmlinux.sh
index 6a197d8a88ac..23ac13fd9d89 100755
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
@@ -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

--
2.34.1

2022-09-24 19:03:42

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v3 3/7] kbuild: move .vmlinux.objs rule to Makefile.modpost

.vmlinux.objs is used by modpost, so scripts/Makefile.modpost is
a better place to generate it.

It is used only when CONFIG_MODVERSIONS=y. It should be guarded
by "ifdef CONFIG_MODVERSIONS".

Signed-off-by: Masahiro Yamada <[email protected]>
---

(no changes since v1)

Makefile | 2 +-
scripts/Makefile.modpost | 30 ++++++++++++++++++++++++++++--
scripts/link-vmlinux.sh | 18 ------------------
3 files changed, 29 insertions(+), 21 deletions(-)

diff --git a/Makefile b/Makefile
index f793c3b1eaec..92413b6de451 100644
--- a/Makefile
+++ b/Makefile
@@ -1477,7 +1477,7 @@ 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
+ compile_commands.json .thinlto-cache .vmlinux.objs

# Directories & files removed with 'make mrproper'
MRPROPER_FILES += include/config include/generated \
diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
index 911606496341..04ad00917b2f 100644
--- a/scripts/Makefile.modpost
+++ b/scripts/Makefile.modpost
@@ -57,6 +57,32 @@ vmlinux.symvers: vmlinux.o

__modpost: vmlinux.symvers

+# Generate the list of in-tree objects in vmlinux
+# ---------------------------------------------------------------------------
+
+# This is used to retrieve symbol versions generated by genksyms.
+ifdef CONFIG_MODVERSIONS
+vmlinux.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) ;; \
+ *.a) $(AR) t $${f} ;; \
+ *) echo $${f} ;; \
+ esac \
+ done > $@
+
+targets += .vmlinux.objs
+.vmlinux.objs: $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
+ $(call if_changed,vmlinux_objs)
+
else

ifeq ($(KBUILD_EXTMOD),)
@@ -134,6 +160,8 @@ ifneq ($(KBUILD_MODPOST_NOFINAL),1)
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
endif

+endif
+
PHONY += FORCE
FORCE:

@@ -141,6 +169,4 @@ existing-targets := $(wildcard $(sort $(targets)))

-include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)

-endif
-
.PHONY: $(PHONY)
diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
index 8d982574145a..161bca64e8aa 100755
--- a/scripts/link-vmlinux.sh
+++ b/scripts/link-vmlinux.sh
@@ -199,7 +199,6 @@ cleanup()
rm -f System.map
rm -f vmlinux
rm -f vmlinux.map
- rm -f .vmlinux.objs
rm -f .vmlinux.export.c
}

@@ -218,23 +217,6 @@ fi
#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

--
2.34.1

2022-09-24 19:55:47

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v3 2/7] kbuild: list sub-directories in ./Kbuild

Hi Masahiro,

I love your patch! Perhaps something to improve:

[auto build test WARNING on masahiroy-kbuild/for-next]
[cannot apply to arm64/for-next/core gerg-m68knommu/for-next geert-m68k/for-next deller-parisc/for-next powerpc/next s390/features tip/x86/core linus/master v6.0-rc6 next-20220923]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Masahiro-Yamada/kbuild-various-cleanups/20220925-022150
base: https://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git for-next
config: um-i386_defconfig
compiler: gcc-11 (Debian 11.3.0-5) 11.3.0
reproduce (this is a W=1 build):
# https://github.com/intel-lab-lkp/linux/commit/d721cc5614aaa17b2965db04e9319d4ef5f7eaf7
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Masahiro-Yamada/kbuild-various-cleanups/20220925-022150
git checkout d721cc5614aaa17b2965db04e9319d4ef5f7eaf7
# save the config file
mkdir build_dir && cp config build_dir/.config
make W=1 O=build_dir ARCH=um SUBARCH=i386 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>):

>> /usr/bin/ld: warning: ./arch/x86/um/checksum_32.o: missing .note.GNU-stack section implies executable stack
/usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
/usr/bin/ld: warning: .tmp_vmlinux.kallsyms1 has a LOAD segment with RWX permissions
/usr/bin/ld: warning: .tmp_vmlinux.kallsyms1.o: missing .note.GNU-stack section implies executable stack
/usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
/usr/bin/ld: warning: .tmp_vmlinux.kallsyms2 has a LOAD segment with RWX permissions
/usr/bin/ld: warning: .tmp_vmlinux.kallsyms2.o: missing .note.GNU-stack section implies executable stack
/usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
/usr/bin/ld: warning: vmlinux has a LOAD segment with RWX permissions

--
0-DAY CI Kernel Test Service
https://01.org/lkp


Attachments:
(No filename) (2.38 kB)
config (42.02 kB)
Download all attachments

2022-09-24 20:39:28

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH v3 2/7] kbuild: list sub-directories in ./Kbuild

Hi Masahiro,

I love your patch! Perhaps something to improve:

[auto build test WARNING on masahiroy-kbuild/for-next]
[cannot apply to arm64/for-next/core gerg-m68knommu/for-next geert-m68k/for-next deller-parisc/for-next powerpc/next s390/features tip/x86/core linus/master v6.0-rc6 next-20220923]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Masahiro-Yamada/kbuild-various-cleanups/20220925-022150
base: https://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git for-next
config: um-x86_64_defconfig
compiler: gcc-11 (Debian 11.3.0-5) 11.3.0
reproduce (this is a W=1 build):
# https://github.com/intel-lab-lkp/linux/commit/d721cc5614aaa17b2965db04e9319d4ef5f7eaf7
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Masahiro-Yamada/kbuild-various-cleanups/20220925-022150
git checkout d721cc5614aaa17b2965db04e9319d4ef5f7eaf7
# save the config file
mkdir build_dir && cp config build_dir/.config
make W=1 O=build_dir ARCH=um SUBARCH=x86_64 SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
| Reported-by: kernel test robot <[email protected]>

All warnings (new ones prefixed by >>):

>> /usr/bin/ld: warning: ./arch/x86/um/vdso/vdso.o: missing .note.GNU-stack section implies executable stack
/usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
/usr/bin/ld: warning: .tmp_vmlinux.kallsyms1 has a LOAD segment with RWX permissions
/usr/bin/ld: warning: .tmp_vmlinux.kallsyms1.o: missing .note.GNU-stack section implies executable stack
/usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
/usr/bin/ld: warning: .tmp_vmlinux.kallsyms2 has a LOAD segment with RWX permissions
/usr/bin/ld: warning: .tmp_vmlinux.kallsyms2.o: missing .note.GNU-stack section implies executable stack
/usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
/usr/bin/ld: warning: vmlinux has a LOAD segment with RWX permissions

--
0-DAY CI Kernel Test Service
https://01.org/lkp


Attachments:
(No filename) (2.38 kB)
config (41.40 kB)
Download all attachments

2022-09-25 00:44:44

by Masahiro Yamada

[permalink] [raw]
Subject: Re: [PATCH v3 2/7] kbuild: list sub-directories in ./Kbuild

On Sun, Sep 25, 2022 at 5:28 AM kernel test robot <[email protected]> wrote:
>
> Hi Masahiro,
>
> I love your patch! Perhaps something to improve:
>
> [auto build test WARNING on masahiroy-kbuild/for-next]
> [cannot apply to arm64/for-next/core gerg-m68knommu/for-next geert-m68k/for-next deller-parisc/for-next powerpc/next s390/features tip/x86/core linus/master v6.0-rc6 next-20220923]
> [If your patch is applied to the wrong git tree, kindly drop us a note.
> And when submitting patch, we suggest to use '--base' as documented in
> https://git-scm.com/docs/git-format-patch#_base_tree_information]
>
> url: https://github.com/intel-lab-lkp/linux/commits/Masahiro-Yamada/kbuild-various-cleanups/20220925-022150
> base: https://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git for-next
> config: um-x86_64_defconfig
> compiler: gcc-11 (Debian 11.3.0-5) 11.3.0
> reproduce (this is a W=1 build):
> # https://github.com/intel-lab-lkp/linux/commit/d721cc5614aaa17b2965db04e9319d4ef5f7eaf7
> git remote add linux-review https://github.com/intel-lab-lkp/linux
> git fetch --no-tags linux-review Masahiro-Yamada/kbuild-various-cleanups/20220925-022150
> git checkout d721cc5614aaa17b2965db04e9319d4ef5f7eaf7
> # save the config file
> mkdir build_dir && cp config build_dir/.config
> make W=1 O=build_dir ARCH=um SUBARCH=x86_64 SHELL=/bin/bash
>
> If you fix the issue, kindly add following tag where applicable
> | Reported-by: kernel test robot <[email protected]>
>
> All warnings (new ones prefixed by >>):
>
> >> /usr/bin/ld: warning: ./arch/x86/um/vdso/vdso.o: missing .note.GNU-stack section implies executable stack
> /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
> /usr/bin/ld: warning: .tmp_vmlinux.kallsyms1 has a LOAD segment with RWX permissions
> /usr/bin/ld: warning: .tmp_vmlinux.kallsyms1.o: missing .note.GNU-stack section implies executable stack
> /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
> /usr/bin/ld: warning: .tmp_vmlinux.kallsyms2 has a LOAD segment with RWX permissions
> /usr/bin/ld: warning: .tmp_vmlinux.kallsyms2.o: missing .note.GNU-stack section implies executable stack
> /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
> /usr/bin/ld: warning: vmlinux has a LOAD segment with RWX permissions
>
> --
> 0-DAY CI Kernel Test Service
> https://01.org/lkp








My compiler is slightly different
(gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0), but
I cannot reproduce it.



Perhaps, 0day thought this is a new warning
due to a slightly different path?


[before]
warning: arch/x86/um/vdso/vdso.o

[after]
warning: ./arch/x86/um/vdso/vdso.o




--
Best Regards
Masahiro Yamada

2022-09-26 21:40:38

by Nick Desaulniers

[permalink] [raw]
Subject: Re: [PATCH v3 2/7] kbuild: list sub-directories in ./Kbuild

On Sat, Sep 24, 2022 at 5:29 PM Masahiro Yamada <[email protected]> wrote:
>
> On Sun, Sep 25, 2022 at 5:28 AM kernel test robot <[email protected]> wrote:
> >
> > Hi Masahiro,
> >
> > I love your patch! Perhaps something to improve:
> >
> > [auto build test WARNING on masahiroy-kbuild/for-next]
> > [cannot apply to arm64/for-next/core gerg-m68knommu/for-next geert-m68k/for-next deller-parisc/for-next powerpc/next s390/features tip/x86/core linus/master v6.0-rc6 next-20220923]
> > [If your patch is applied to the wrong git tree, kindly drop us a note.
> > And when submitting patch, we suggest to use '--base' as documented in
> > https://git-scm.com/docs/git-format-patch#_base_tree_information]
> >
> > url: https://github.com/intel-lab-lkp/linux/commits/Masahiro-Yamada/kbuild-various-cleanups/20220925-022150
> > base: https://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git for-next
> > config: um-x86_64_defconfig
> > compiler: gcc-11 (Debian 11.3.0-5) 11.3.0
> > reproduce (this is a W=1 build):
> > # https://github.com/intel-lab-lkp/linux/commit/d721cc5614aaa17b2965db04e9319d4ef5f7eaf7
> > git remote add linux-review https://github.com/intel-lab-lkp/linux
> > git fetch --no-tags linux-review Masahiro-Yamada/kbuild-various-cleanups/20220925-022150
> > git checkout d721cc5614aaa17b2965db04e9319d4ef5f7eaf7
> > # save the config file
> > mkdir build_dir && cp config build_dir/.config
> > make W=1 O=build_dir ARCH=um SUBARCH=x86_64 SHELL=/bin/bash
> >
> > If you fix the issue, kindly add following tag where applicable
> > | Reported-by: kernel test robot <[email protected]>
> >
> > All warnings (new ones prefixed by >>):
> >
> > >> /usr/bin/ld: warning: ./arch/x86/um/vdso/vdso.o: missing .note.GNU-stack section implies executable stack
> > /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
> > /usr/bin/ld: warning: .tmp_vmlinux.kallsyms1 has a LOAD segment with RWX permissions
> > /usr/bin/ld: warning: .tmp_vmlinux.kallsyms1.o: missing .note.GNU-stack section implies executable stack
> > /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
> > /usr/bin/ld: warning: .tmp_vmlinux.kallsyms2 has a LOAD segment with RWX permissions
> > /usr/bin/ld: warning: .tmp_vmlinux.kallsyms2.o: missing .note.GNU-stack section implies executable stack
> > /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
> > /usr/bin/ld: warning: vmlinux has a LOAD segment with RWX permissions

See also:
https://lore.kernel.org/lkml/[email protected]/

> >
> > --
> > 0-DAY CI Kernel Test Service
> > https://01.org/lkp
>
>
>
>
>
>
>
>
> My compiler is slightly different
> (gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0), but
> I cannot reproduce it.
>
>
>
> Perhaps, 0day thought this is a new warning
> due to a slightly different path?
>
>
> [before]
> warning: arch/x86/um/vdso/vdso.o
>
> [after]
> warning: ./arch/x86/um/vdso/vdso.o
>
>
>
>
> --
> Best Regards
> Masahiro Yamada



--
Thanks,
~Nick Desaulniers

2022-09-26 22:46:32

by Nick Desaulniers

[permalink] [raw]
Subject: Re: [PATCH v3 0/7] kbuild: various cleanups

On Sat, Sep 24, 2022 at 11:20 AM Masahiro Yamada <[email protected]> wrote:
>
> - Link vmlinux and modules in parallel

I was curious if this resulted in an observable improvement. N=1

Mainline:
$ /usr/bin/time -v make ARCH=arm64 LLVM=1 -j128 -s
Elapsed (wall clock) time (h:mm:ss or m:ss): 2:15.68


With this series:
$ /usr/bin/time -v make ARCH=arm64 LLVM=1 -j128 -s
Elapsed (wall clock) time (h:mm:ss or m:ss): 2:12.22

I'll take it!
Tested-by: Nick Desaulniers <[email protected]>


> - Remove head-y syntax
>
>
> Masahiro Yamada (7):
> kbuild: hard-code KBUILD_ALLDIRS in scripts/Makefile.package
> kbuild: list sub-directories in ./Kbuild
> kbuild: move .vmlinux.objs rule to Makefile.modpost
> kbuild: move vmlinux.o rule to the top Makefile
> kbuild: unify two modpost invocations
> kbuild: use obj-y instead extra-y for objects placed at the head
> kbuild: remove head-y syntax
>
> Documentation/kbuild/makefiles.rst | 27 +----
> Kbuild | 24 ++++
> Makefile | 119 +++++++++++---------
> arch/alpha/Makefile | 2 -
> arch/alpha/kernel/Makefile | 4 +-
> arch/arc/Makefile | 2 -
> arch/arc/kernel/Makefile | 4 +-
> arch/arm/Makefile | 3 -
> arch/arm/kernel/Makefile | 4 +-
> arch/arm64/Makefile | 3 -
> arch/arm64/kernel/Makefile | 4 +-
> arch/csky/Makefile | 2 -
> arch/csky/kernel/Makefile | 4 +-
> arch/hexagon/Makefile | 2 -
> arch/hexagon/kernel/Makefile | 3 +-
> arch/ia64/Makefile | 1 -
> arch/ia64/kernel/Makefile | 4 +-
> arch/loongarch/Makefile | 2 -
> arch/loongarch/kernel/Makefile | 4 +-
> arch/m68k/68000/Makefile | 2 +-
> arch/m68k/Makefile | 9 --
> arch/m68k/coldfire/Makefile | 2 +-
> arch/m68k/kernel/Makefile | 23 ++--
> arch/microblaze/Makefile | 1 -
> arch/microblaze/kernel/Makefile | 4 +-
> arch/mips/Makefile | 2 -
> arch/mips/kernel/Makefile | 4 +-
> arch/nios2/Makefile | 1 -
> arch/nios2/kernel/Makefile | 2 +-
> arch/openrisc/Makefile | 2 -
> arch/openrisc/kernel/Makefile | 4 +-
> arch/parisc/Makefile | 2 -
> arch/parisc/kernel/Makefile | 4 +-
> arch/powerpc/Makefile | 12 --
> arch/powerpc/kernel/Makefile | 20 ++--
> arch/riscv/Makefile | 2 -
> arch/riscv/kernel/Makefile | 2 +-
> arch/s390/Makefile | 2 -
> arch/s390/kernel/Makefile | 4 +-
> arch/sh/Makefile | 2 -
> arch/sh/kernel/Makefile | 4 +-
> arch/sparc/Makefile | 2 -
> arch/sparc/kernel/Makefile | 3 +-
> arch/x86/Makefile | 5 -
> arch/x86/kernel/Makefile | 10 +-
> arch/xtensa/Makefile | 2 -
> arch/xtensa/kernel/Makefile | 4 +-
> scripts/Makefile.lib | 2 +
> scripts/Makefile.modfinal | 2 +-
> scripts/Makefile.modpost | 112 ++++++++----------
> scripts/Makefile.package | 5 +-
> scripts/Makefile.vmlinux_o | 6 +-
> scripts/clang-tools/gen_compile_commands.py | 19 +---
> scripts/head-object-list.txt | 53 +++++++++
> scripts/link-vmlinux.sh | 34 +-----
> 55 files changed, 273 insertions(+), 314 deletions(-)
> create mode 100644 scripts/head-object-list.txt
>
> --
> 2.34.1
>


--
Thanks,
~Nick Desaulniers

2022-09-28 09:34:20

by Masahiro Yamada

[permalink] [raw]
Subject: Re: [PATCH v3 2/7] kbuild: list sub-directories in ./Kbuild

On Tue, Sep 27, 2022 at 6:06 AM Nick Desaulniers
<[email protected]> wrote:
>
> On Sat, Sep 24, 2022 at 5:29 PM Masahiro Yamada <[email protected]> wrote:
> >
> > On Sun, Sep 25, 2022 at 5:28 AM kernel test robot <[email protected]> wrote:
> > >
> > > Hi Masahiro,
> > >
> > > I love your patch! Perhaps something to improve:
> > >
> > > [auto build test WARNING on masahiroy-kbuild/for-next]
> > > [cannot apply to arm64/for-next/core gerg-m68knommu/for-next geert-m68k/for-next deller-parisc/for-next powerpc/next s390/features tip/x86/core linus/master v6.0-rc6 next-20220923]
> > > [If your patch is applied to the wrong git tree, kindly drop us a note.
> > > And when submitting patch, we suggest to use '--base' as documented in
> > > https://git-scm.com/docs/git-format-patch#_base_tree_information]
> > >
> > > url: https://github.com/intel-lab-lkp/linux/commits/Masahiro-Yamada/kbuild-various-cleanups/20220925-022150
> > > base: https://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git for-next
> > > config: um-x86_64_defconfig
> > > compiler: gcc-11 (Debian 11.3.0-5) 11.3.0
> > > reproduce (this is a W=1 build):
> > > # https://github.com/intel-lab-lkp/linux/commit/d721cc5614aaa17b2965db04e9319d4ef5f7eaf7
> > > git remote add linux-review https://github.com/intel-lab-lkp/linux
> > > git fetch --no-tags linux-review Masahiro-Yamada/kbuild-various-cleanups/20220925-022150
> > > git checkout d721cc5614aaa17b2965db04e9319d4ef5f7eaf7
> > > # save the config file
> > > mkdir build_dir && cp config build_dir/.config
> > > make W=1 O=build_dir ARCH=um SUBARCH=x86_64 SHELL=/bin/bash
> > >
> > > If you fix the issue, kindly add following tag where applicable
> > > | Reported-by: kernel test robot <[email protected]>
> > >
> > > All warnings (new ones prefixed by >>):
> > >
> > > >> /usr/bin/ld: warning: ./arch/x86/um/vdso/vdso.o: missing .note.GNU-stack section implies executable stack
> > > /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
> > > /usr/bin/ld: warning: .tmp_vmlinux.kallsyms1 has a LOAD segment with RWX permissions
> > > /usr/bin/ld: warning: .tmp_vmlinux.kallsyms1.o: missing .note.GNU-stack section implies executable stack
> > > /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
> > > /usr/bin/ld: warning: .tmp_vmlinux.kallsyms2 has a LOAD segment with RWX permissions
> > > /usr/bin/ld: warning: .tmp_vmlinux.kallsyms2.o: missing .note.GNU-stack section implies executable stack
> > > /usr/bin/ld: NOTE: This behaviour is deprecated and will be removed in a future version of the linker
> > > /usr/bin/ld: warning: vmlinux has a LOAD segment with RWX permissions
>
> See also:
> https://lore.kernel.org/lkml/[email protected]/



Ah, thank you.
My binutils version is 2.38, and
that is why I was not able to reproduce the issue.


With binutils 2.39, now I see the warnings in the mainline kernel.
My patch is not the root cause.



--
Best Regards
Masahiro Yamada

2022-09-28 20:22:40

by Nicolas Schier

[permalink] [raw]
Subject: Re: [PATCH v3 1/7] kbuild: hard-code KBUILD_ALLDIRS in scripts/Makefile.package

On Sun, 25 Sep 2022 03:19:09 +0900 Masahiro Yamada wrote:
> My plan is to list subdirectories in ./Kbuild. Once it occurs,
> $(vmlinux-alldirs) will not contain all subdirectories.
>
> Let's hard-code the directory list until I get around to implementing
> a more sophisticated way for generating a source tarball.
>
> Signed-off-by: Masahiro Yamada <[email protected]>
> ---

Reviewed-by: Nicolas Schier <[email protected]>

> Changes in v3:
> - New patch
>
> Makefile | 2 --
> scripts/Makefile.package | 5 ++++-
> 2 files changed, 4 insertions(+), 3 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 57cf4a5bea6d..eb4bbbc898d0 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1129,8 +1129,6 @@ KBUILD_VMLINUX_OBJS += $(patsubst %/,%/built-in.a, $(drivers-y))
>
> export KBUILD_VMLINUX_OBJS 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)
>
> diff --git a/scripts/Makefile.package b/scripts/Makefile.package
> index 5017f6b2da80..8bbcced67c22 100644
> --- a/scripts/Makefile.package
> +++ b/scripts/Makefile.package
> @@ -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
>
> --
> 2.34.1

--
epost|xmpp: [email protected] irc://oftc.net/nsc
↳ gpg: 18ed 52db e34f 860e e9fb c82b 7d97 0932 55a0 ce7f
-- frykten for herren er opphav til kunnskap --


Attachments:
(No filename) (2.17 kB)
signature.asc (849.00 B)
Download all attachments

2022-09-28 20:28:20

by Nicolas Schier

[permalink] [raw]
Subject: Re: [PATCH v3 6/7] kbuild: use obj-y instead extra-y for objects placed at the head

On Sun, 25 Sep 2022 03:19:14 +0900 Masahiro Yamada wrote:
> The objects placed at the head of vmlinux need special treatments:
>
> - arch/$(SRCARCH)/Makefile adds them to head-y in order to place
> them before other archives in the linker command line.
>
> - arch/$(SRCARCH)/kernel/Makefile adds them to extra-y instead of
> obj-y to avoid them going into built-in.a.
>
> This commit gets rid of the latter.
>
> Create vmlinux.a to collect all the objects that are unconditionally
> linked to vmlinux. The objects listed in head-y are moved to the head
> of vmlinux.a by using 'ar m'.
>
> With this, arch/$(SRCARCH)/kernel/Makefile can consistently use obj-y
> for builtin objects.
>
> There is no *.o that is directly linked to vmlinux. Drop unneeded code
> in scripts/clang-tools/gen_compile_commands.py.
>
> $(AR) mPi needs 'T' to workaround the llvm-ar bug. The fix was suggested
> by Nathan Chancellor [1].
>
> [1]: https://lore.kernel.org/llvm/[email protected]/
>
> Signed-off-by: Masahiro Yamada <[email protected]>
> ---

Reviewed-by: Nicolas Schier <[email protected]>


> Changes in v3:
> - Fix build error for m68k
> - Fix the bug for llvm-ar <= 14
>
> Documentation/kbuild/makefiles.rst | 18 +---------------
> Makefile | 23 ++++++++++++++++-----
> arch/alpha/kernel/Makefile | 4 ++--
> arch/arc/kernel/Makefile | 4 ++--
> arch/arm/kernel/Makefile | 4 ++--
> arch/arm64/kernel/Makefile | 4 ++--
> arch/csky/kernel/Makefile | 4 ++--
> arch/hexagon/kernel/Makefile | 3 ++-
> arch/ia64/kernel/Makefile | 4 ++--
> arch/loongarch/kernel/Makefile | 4 ++--
> arch/m68k/68000/Makefile | 2 +-
> arch/m68k/coldfire/Makefile | 2 +-
> arch/m68k/kernel/Makefile | 23 +++++++++++----------
> arch/microblaze/kernel/Makefile | 4 ++--
> arch/mips/kernel/Makefile | 4 ++--
> arch/nios2/kernel/Makefile | 2 +-
> arch/openrisc/kernel/Makefile | 4 ++--
> arch/parisc/kernel/Makefile | 4 ++--
> arch/powerpc/kernel/Makefile | 20 +++++++++---------
> arch/riscv/kernel/Makefile | 2 +-
> arch/s390/kernel/Makefile | 4 ++--
> arch/sh/kernel/Makefile | 4 ++--
> arch/sparc/kernel/Makefile | 3 +--
> arch/x86/kernel/Makefile | 10 ++++-----
> arch/xtensa/kernel/Makefile | 4 ++--
> scripts/Makefile.modpost | 5 ++---
> scripts/Makefile.vmlinux_o | 6 +++---
> scripts/clang-tools/gen_compile_commands.py | 19 +----------------
> scripts/link-vmlinux.sh | 10 ++++-----
> 29 files changed, 91 insertions(+), 113 deletions(-)
>
> diff --git a/Documentation/kbuild/makefiles.rst b/Documentation/kbuild/makefiles.rst
> index ee7e3ea1fbe1..5a6a8426cc97 100644
> --- a/Documentation/kbuild/makefiles.rst
> +++ b/Documentation/kbuild/makefiles.rst
> @@ -340,19 +340,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
> @@ -360,10 +348,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.
> diff --git a/Makefile b/Makefile
> index cf9d7b1d8c14..a8c19f92ac9e 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -645,6 +645,8 @@ else
> __all: modules
> endif
>
> +targets :=
> +
> # Decide whether to build built-in, modular, or both.
> # Normally, just do built-in.
>
> @@ -1107,7 +1109,7 @@ 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) ./built-in.a
> +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))
> @@ -1115,7 +1117,7 @@ else
> KBUILD_VMLINUX_LIBS := $(patsubst %/,%/lib.a, $(libs-y))
> endif
>
> -export KBUILD_VMLINUX_OBJS KBUILD_VMLINUX_LIBS
> +export KBUILD_VMLINUX_LIBS
> export KBUILD_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
>
> vmlinux-deps := $(KBUILD_LDS) $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS)
> @@ -1142,7 +1144,18 @@ quiet_cmd_autoksyms_h = GEN $@
> $(autoksyms_h):
> $(call cmd,autoksyms_h)
>
> -vmlinux.o: autoksyms_recursive $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
> +# '$(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) $@ $(head-y)
> +
> +targets += vmlinux.a
> +vmlinux.a: $(KBUILD_VMLINUX_OBJS) FORCE
> + $(call if_changed,ar_vmlinux.a)
> +
> +vmlinux.o: autoksyms_recursive vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
> $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux_o
>
> ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
> @@ -1155,7 +1168,7 @@ cmd_link-vmlinux = \
> vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) modpost FORCE
> +$(call if_changed_dep,link-vmlinux)
>
> -targets := vmlinux
> +targets += vmlinux
>
> # The actual objects are generated when descending,
> # make sure no implicit rule kicks in
> @@ -1880,7 +1893,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)
>
> diff --git a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile
> index 5a74581bf0ee..5a5b0a8b7c6a 100644
> --- a/arch/alpha/kernel/Makefile
> +++ b/arch/alpha/kernel/Makefile
> @@ -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
>
> diff --git a/arch/arc/kernel/Makefile b/arch/arc/kernel/Makefile
> index 8c4fc4b54c14..0723d888ac44 100644
> --- a/arch/arc/kernel/Makefile
> +++ b/arch/arc/kernel/Makefile
> @@ -3,7 +3,7 @@
> # Copyright (C) 2004, 2007-2010, 2011-2012 Synopsys, Inc. (http://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
> diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile
> index 553866751e1a..8feaa3217ec5 100644
> --- a/arch/arm/kernel/Makefile
> +++ b/arch/arm/kernel/Makefile
> @@ -89,7 +89,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
> @@ -109,4 +109,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
> diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile
> index 1add7b01efa7..b619ff207a57 100644
> --- a/arch/arm64/kernel/Makefile
> +++ b/arch/arm64/kernel/Makefile
> @@ -85,8 +85,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)\""
> diff --git a/arch/csky/kernel/Makefile b/arch/csky/kernel/Makefile
> index 6f14c924b20d..8a868316b912 100644
> --- a/arch/csky/kernel/Makefile
> +++ b/arch/csky/kernel/Makefile
> @@ -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/
> diff --git a/arch/hexagon/kernel/Makefile b/arch/hexagon/kernel/Makefile
> index fae3dce32fde..e73cb321630e 100644
> --- a/arch/hexagon/kernel/Makefile
> +++ b/arch/hexagon/kernel/Makefile
> @@ -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
> diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile
> index 08d4a2ba0652..4a1fcb121dda 100644
> --- a/arch/ia64/kernel/Makefile
> +++ b/arch/ia64/kernel/Makefile
> @@ -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 \
> diff --git a/arch/loongarch/kernel/Makefile b/arch/loongarch/kernel/Makefile
> index e5be17009fe8..6c33b5c45573 100644
> --- a/arch/loongarch/kernel/Makefile
> +++ b/arch/loongarch/kernel/Makefile
> @@ -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
>
> diff --git a/arch/m68k/68000/Makefile b/arch/m68k/68000/Makefile
> index 674541fdf5b8..279560add577 100644
> --- a/arch/m68k/68000/Makefile
> +++ b/arch/m68k/68000/Makefile
> @@ -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
> diff --git a/arch/m68k/coldfire/Makefile b/arch/m68k/coldfire/Makefile
> index 9419a6c1f036..c56bc0dc7f2e 100644
> --- a/arch/m68k/coldfire/Makefile
> +++ b/arch/m68k/coldfire/Makefile
> @@ -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
> diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile
> index c0833da6a2ca..af015447dfb4 100644
> --- a/arch/m68k/kernel/Makefile
> +++ b/arch/m68k/kernel/Makefile
> @@ -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
> diff --git a/arch/microblaze/kernel/Makefile b/arch/microblaze/kernel/Makefile
> index 15a20eb814ce..4393bee64eaf 100644
> --- a/arch/microblaze/kernel/Makefile
> +++ b/arch/microblaze/kernel/Makefile
> @@ -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
> diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile
> index 7c96282bff2e..5d1addac5e28 100644
> --- a/arch/mips/kernel/Makefile
> +++ b/arch/mips/kernel/Makefile
> @@ -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
> diff --git a/arch/nios2/kernel/Makefile b/arch/nios2/kernel/Makefile
> index 0b645e1e3158..78a913181fa1 100644
> --- a/arch/nios2/kernel/Makefile
> +++ b/arch/nios2/kernel/Makefile
> @@ -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
> diff --git a/arch/openrisc/kernel/Makefile b/arch/openrisc/kernel/Makefile
> index 2d172e79f58d..79129161f3e0 100644
> --- a/arch/openrisc/kernel/Makefile
> +++ b/arch/openrisc/kernel/Makefile
> @@ -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
>
> diff --git a/arch/parisc/kernel/Makefile b/arch/parisc/kernel/Makefile
> index d0bfac89a842..3d138c9cf9ce 100644
> --- a/arch/parisc/kernel/Makefile
> +++ b/arch/parisc/kernel/Makefile
> @@ -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 \
> diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile
> index 06d2d1f78f71..ad3decb9f20b 100644
> --- a/arch/powerpc/kernel/Makefile
> +++ b/arch/powerpc/kernel/Makefile
> @@ -118,12 +118,12 @@ obj-$(CONFIG_PPC_FSL_BOOK3E) += cpu_setup_fsl_booke.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_FSL_BOOKE) := head_fsl_booke.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_FSL_BOOKE) += head_fsl_booke.o
> +obj-$(CONFIG_PPC_8xx) += head_8xx.o
> extra-y += vmlinux.lds
>
> obj-$(CONFIG_RELOCATABLE) += reloc_$(BITS).o
> @@ -198,10 +198,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
>
> diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile
> index 33bb60a354cd..db6e4b1294ba 100644
> --- a/arch/riscv/kernel/Makefile
> +++ b/arch/riscv/kernel/Makefile
> @@ -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
> diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile
> index 3cbfa9fddd9a..7ce00816b8df 100644
> --- a/arch/s390/kernel/Makefile
> +++ b/arch/s390/kernel/Makefile
> @@ -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
>
> -extra-y += head64.o vmlinux.lds
> +extra-y += vmlinux.lds
>
> obj-$(CONFIG_SYSFS) += nospec-sysfs.o
> CFLAGS_REMOVE_nospec-branch.o += $(CC_FLAGS_EXPOLINE)
> diff --git a/arch/sh/kernel/Makefile b/arch/sh/kernel/Makefile
> index aa0fbc9202b1..69cd9ac4b2ab 100644
> --- a/arch/sh/kernel/Makefile
> +++ b/arch/sh/kernel/Makefile
> @@ -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 \
> diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile
> index d3a0e072ebe8..b328e4a0bd57 100644
> --- a/arch/sparc/kernel/Makefile
> +++ b/arch/sparc/kernel/Makefile
> @@ -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
> diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile
> index a20a5ebfacd7..956e50ca06e0 100644
> --- a/arch/x86/kernel/Makefile
> +++ b/arch/x86/kernel/Makefile
> @@ -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
> diff --git a/arch/xtensa/kernel/Makefile b/arch/xtensa/kernel/Makefile
> index 897c1c741058..f28b8e3d717e 100644
> --- a/arch/xtensa/kernel/Makefile
> +++ b/arch/xtensa/kernel/Makefile
> @@ -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
>
> diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
> index 2daf760eeb25..ceb1d78140e7 100644
> --- a/scripts/Makefile.modpost
> +++ b/scripts/Makefile.modpost
> @@ -70,13 +70,12 @@ quiet_cmd_vmlinux_objs = GEN $@
> for f in $(real-prereqs); do \
> case $${f} in \
> *libgcc.a) ;; \
> - *.a) $(AR) t $${f} ;; \
> - *) echo $${f} ;; \
> + *) $(AR) t $${f} ;; \
> esac \
> done > $@
>
> targets += .vmlinux.objs
> -.vmlinux.objs: $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
> +.vmlinux.objs: vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
> $(call if_changed,vmlinux_objs)
>
> vmlinux.o-if-present := $(wildcard vmlinux.o)
> diff --git a/scripts/Makefile.vmlinux_o b/scripts/Makefile.vmlinux_o
> index 84019814f33f..81a4e0484457 100644
> --- a/scripts/Makefile.vmlinux_o
> +++ b/scripts/Makefile.vmlinux_o
> @@ -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
> @@ -55,7 +55,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,7 +64,7 @@ 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
> diff --git a/scripts/clang-tools/gen_compile_commands.py b/scripts/clang-tools/gen_compile_commands.py
> index 47da25b3ba7d..d800b2c0af97 100755
> --- a/scripts/clang-tools/gen_compile_commands.py
> +++ b/scripts/clang-tools/gen_compile_commands.py
> @@ -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/link-vmlinux.sh b/scripts/link-vmlinux.sh
> index 6a197d8a88ac..23ac13fd9d89 100755
> --- a/scripts/link-vmlinux.sh
> +++ b/scripts/link-vmlinux.sh
> @@ -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
>
> --
> 2.34.1

--
epost|xmpp: [email protected] irc://oftc.net/nsc
↳ gpg: 18ed 52db e34f 860e e9fb c82b 7d97 0932 55a0 ce7f
-- frykten for herren er opphav til kunnskap --


Attachments:
(No filename) (27.19 kB)
signature.asc (849.00 B)
Download all attachments

2022-09-28 20:45:15

by Nicolas Schier

[permalink] [raw]
Subject: Re: [PATCH v3 5/7] kbuild: unify two modpost invocations

On Sun, 25 Sep 2022 03:19:13 +0900 Masahiro Yamada wrote:
> Currently, modpost is executed twice; first for vmlinux, second
> for modules.
>
> This commit merges them.
>
> Current build flow
> ==================
>
> 1) build obj-y and obj-m objects
> 2) link vmlinux.o
> 3) modpost for vmlinux
> 4) link vmlinux
> 5) modpost for modules
> 6) link modules (*.ko)
>
> The build steps 1) through 6) are serialized, that is, modules are
> built after vmlinux. You do not get benefits of parallel builds when
> scripts/link-vmlinux.sh is being run.
>
> New build flow
> ==============
>
> 1) build obj-y and obj-m objects
> 2) link vmlinux.o
> 3) modpost for vmlinux and modules
> 4a) link vmlinux
> 4b) link modules (*.ko)
>
> In the new build flow, modpost is invoked just once.
>
> vmlinux and modules are built in parallel. One exception is
> CONFIG_DEBUG_INFO_BTF_MODULES=y, where modules depend on vmlinux.
>
> Signed-off-by: Masahiro Yamada <[email protected]>
> ---
>
> (no changes since v1)
>
> Makefile | 30 ++++++++++---
> scripts/Makefile.modfinal | 2 +-
> scripts/Makefile.modpost | 93 ++++++++++++---------------------------
> scripts/link-vmlinux.sh | 3 --
> 4 files changed, 53 insertions(+), 75 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index b5dfb54b1993..cf9d7b1d8c14 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1152,7 +1152,7 @@ cmd_link-vmlinux = \
> $(CONFIG_SHELL) $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)"; \
> $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
>
> -vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) FORCE
> +vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) modpost FORCE
> +$(call if_changed_dep,link-vmlinux)
>
> targets := vmlinux
> @@ -1428,7 +1428,13 @@ endif
> # Build modules
> #
>
> -modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_prepare
> +# *.ko are usually independent of vmlinux, but CONFIG_DEBUG_INFOBTF_MODULES
> +# is an exception.
> +ifdef CONFIG_DEBUG_INFO_BTF_MODULES
> +modules: vmlinux
> +endif
> +
> +modules: modules_prepare
>
> # Target to prepare building external modules
> modules_prepare: prepare
> @@ -1741,8 +1747,12 @@ ifdef CONFIG_MODULES
> $(MODORDER): $(build-dir)
> @:
>
> -modules: modules_check
> - $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
> +# 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)
> @@ -1773,6 +1783,11 @@ 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:
> @@ -1792,16 +1807,19 @@ 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): $(build-dir)
> @:
>
> # Remove MODORDER when done because it is not the real one.
> PHONY += single_modpost

PHONY += single_modules

Reviewed-by: Nicolas Schier <[email protected]>

> -single_modpost: $(single-no-ko) modules_prepare
> +single_modules: $(single-no-ko) modules_prepare
> $(Q){ $(foreach m, $(single-ko), echo $(extmod_prefix)$m;) } > $(MODORDER)
> $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
> +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))
> diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal
> index 35100e981f4a..a3cf9e3647c9 100644
> --- a/scripts/Makefile.modfinal
> +++ b/scripts/Makefile.modfinal
> @@ -55,7 +55,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))
> diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
> index 04ad00917b2f..2daf760eeb25 100644
> --- a/scripts/Makefile.modpost
> +++ b/scripts/Makefile.modpost
> @@ -32,9 +32,6 @@
> # 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:
>
> @@ -45,24 +42,23 @@ MODPOST = scripts/mod/modpost \
> $(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)
> +# 'make -i -k' ignores compile errors, and builds as many modules as possible.
> +ifneq ($(findstring i,$(filter-out --%,$(MAKEFLAGS))),)
> +MODPOST += -n
> +endif
>
> -__modpost: vmlinux.symvers
> +ifeq ($(KBUILD_EXTMOD),)
>
> # Generate the list of in-tree objects in vmlinux
> # ---------------------------------------------------------------------------
>
> # This is used to retrieve symbol versions generated by genksyms.
> ifdef CONFIG_MODVERSIONS
> -vmlinux.symvers: .vmlinux.objs
> +vmlinux.symvers Module.symvers: .vmlinux.objs
> endif
>
> # Ignore libgcc.a
> @@ -83,24 +79,12 @@ targets += .vmlinux.objs
> .vmlinux.objs: $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
> $(call if_changed,vmlinux_objs)
>
> -else
> -
> -ifeq ($(KBUILD_EXTMOD),)
> -
> -input-symdump := vmlinux.symvers
> -output-symdump := modules-only.symvers
> -
> -quiet_cmd_cat = GEN $@
> - cmd_cat = cat $(real-prereqs) > $@
> -
> -ifneq ($(wildcard vmlinux.symvers),)
> -
> -__modpost: Module.symvers
> -Module.symvers: vmlinux.symvers modules-only.symvers FORCE
> - $(call if_changed,cat)
> -
> -targets += Module.symvers
> +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
> @@ -112,56 +96,35 @@ 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 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)
> -
> -# 'make -i -k' ignores compile errors, and builds as many modules as possible.
> -ifneq ($(findstring i,$(filter-out --%,$(MAKEFLAGS))),)
> -MODPOST += -n
> -endif
> +MODPOST += -e $(addprefix -i ,$(module.symvers-if-present) $(KBUILD_EXTRA_SYMBOLS))
>
> -# 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.'
> +endif # ($(KBUILD_EXTMOD),)
>
> -# 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)),)
> +ifneq ($(KBUILD_MODPOST_WARN)$(missing-input),)
> MODPOST += -w
> endif
>
> +modorder-if-needed := $(if $(KBUILD_MODULES), $(MODORDER))
> +
> # 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) $(vmlinux.o-if-present) -T -
>
> targets += $(output-symdump)
> +$(output-symdump): $(modorder-if-needed) $(vmlinux.o-if-present) $(moudle.symvers-if-present) FORCE
> + $(call if_changed,modpost)
>
> __modpost: $(output-symdump)
> -ifneq ($(KBUILD_MODPOST_NOFINAL),1)
> - $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
> -endif
> -
> -endif
> -
> PHONY += FORCE
> FORCE:
>
> diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
> index 07486f90d5e2..6a197d8a88ac 100755
> --- a/scripts/link-vmlinux.sh
> +++ b/scripts/link-vmlinux.sh
> @@ -214,9 +214,6 @@ if [ "$1" = "clean" ]; then
> exit 0
> fi
>
> -# 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
> --
> 2.34.1

--
epost|xmpp: [email protected] irc://oftc.net/nsc
↳ gpg: 18ed 52db e34f 860e e9fb c82b 7d97 0932 55a0 ce7f
-- frykten for herren er opphav til kunnskap --


Attachments:
(No filename) (10.91 kB)
signature.asc (849.00 B)
Download all attachments

2022-09-28 20:45:36

by Nicolas Schier

[permalink] [raw]
Subject: Re: [PATCH v3 2/7] kbuild: list sub-directories in ./Kbuild

On Sun, 25 Sep 2022 03:19:10 +0900 Masahiro Yamada wrote:
> Use the ordinary obj-y syntax to list subdirectories.
>
> Note1:
> Previously, the link order of lib-y depended on CONFIG_MODULES; lib-y
> was linked before drivers-y when CONFIG_MODULES=y, otherwise after
> drivers-y. This was a bug of commit 7273ad2b08f8 ("kbuild: link lib-y
> objects to vmlinux forcibly when CONFIG_MODULES=y"), but it was not a
> big deal after all. Now, all objects listed in lib-y are linked last,
> irrespective of CONFIG_MODULES.
>
> Note2:
> Finally, the single target build in arch/*/lib/ works correctly. There was
> a bug report about this. [1]
>
> $ make ARCH=arm arch/arm/lib/findbit.o
> CALL scripts/checksyscalls.sh
> AS arch/arm/lib/findbit.o
>
> [1]: https://lore.kernel.org/linux-kbuild/YvUQOwL6lD4%2F5%[email protected]/
>
> Signed-off-by: Masahiro Yamada <[email protected]>
> ---

Reviewed-by: Nicolas Schier <[email protected]>

>
> Changes in v3:
> - Also move libs-y to fix the bug reported by:
> https://lore.kernel.org/linux-kbuild/[email protected]/
>
> Kbuild | 24 ++++++++++++++++
> Makefile | 65 ++++++++++++++------------------------------
> scripts/Makefile.lib | 2 ++
> 3 files changed, 46 insertions(+), 45 deletions(-)
>
> diff --git a/Kbuild b/Kbuild
> index 0b9e8a16a621..8a37584d1fd6 100644
> --- a/Kbuild
> +++ b/Kbuild
> @@ -72,3 +72,27 @@ $(atomic-checks): $(obj)/.checked-%: include/linux/atomic/% FORCE
> 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-y += $(ARCH_LIB)
> +obj-y += drivers/
> +obj-y += sound/
> +obj-$(CONFIG_SAMPLES) += samples/
> +obj-$(CONFIG_NET) += net/
> +obj-y += virt/
> +obj-y += $(ARCH_DRIVERS)
> diff --git a/Makefile b/Makefile
> index eb4bbbc898d0..f793c3b1eaec 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -676,11 +676,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
>
> @@ -1099,33 +1096,24 @@ 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/
>
> -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 := $(head-y) ./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_LDS := arch/$(SRCARCH)/kernel/vmlinux.lds
> @@ -1140,7 +1128,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
> @@ -1168,7 +1156,7 @@ targets := vmlinux
>
> # The actual objects are generated when descending,
> # make sure no implicit rule kicks in
> -$(sort $(vmlinux-deps) $(subdir-modorder)): descend ;
> +$(sort $(vmlinux-deps)): $(build-dir) ;
>
> filechk_kernel.release = \
> echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
> @@ -1439,13 +1427,6 @@ endif
>
> modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_prepare
>
> -cmd_modules_order = cat $(real-prereqs) > $@
> -
> -modules.order: $(subdir-modorder) FORCE
> - $(call if_changed,modules_order)
> -
> -targets += modules.order
> -
> # Target to prepare building external modules
> modules_prepare: prepare
> $(Q)$(MAKE) $(build)=scripts scripts/module.lds
> @@ -1716,9 +1697,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
> @@ -1756,6 +1735,9 @@ PHONY += modules modules_install modules_prepare
>
> ifdef CONFIG_MODULES
>
> +$(MODORDER): $(build-dir)
> + @:
> +
> modules: modules_check
> $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
>
> @@ -1809,7 +1791,7 @@ single-no-ko := $(filter-out $(single-ko), $(MAKECMDGOALS)) \
>
> $(single-ko): single_modpost
> @:
> -$(single-no-ko): descend
> +$(single-no-ko): $(build-dir)
> @:
>
> # Remove MODORDER when done because it is not the real one.
> @@ -1819,24 +1801,17 @@ single_modpost: $(single-no-ko) modules_prepare
> $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
> $(Q)rm -f $(MODORDER)
>
> -single-goals := $(addprefix $(extmod_prefix), $(single-no-ko))
> -
> -# trim unrelated directories
> -build-dirs := $(foreach d, $(build-dirs), \
> - $(if $(filter $d/%, $(single-goals)), $d))
> +single-goals := $(addprefix $(build-dir)/, $(single-no-ko))
>
> 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)=$@ need-builtin=1 need-modorder=1 \
> - $(filter $@/%, $(single-goals))
> +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
> diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib
> index 3fb6a99e78c4..140dcc3c57bd 100644
> --- a/scripts/Makefile.lib
> +++ b/scripts/Makefile.lib
> @@ -89,6 +89,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))
> @@ -100,6 +101,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.
> --
> 2.34.1

--
epost|xmpp: [email protected] irc://oftc.net/nsc
↳ gpg: 18ed 52db e34f 860e e9fb c82b 7d97 0932 55a0 ce7f
-- frykten for herren er opphav til kunnskap --


Attachments:
(No filename) (8.43 kB)
signature.asc (849.00 B)
Download all attachments

2022-09-28 20:47:48

by Nicolas Schier

[permalink] [raw]
Subject: Re: [PATCH v3 4/7] kbuild: move vmlinux.o rule to the top Makefile

On Sun, 25 Sep 2022 03:19:12 +0900 Masahiro Yamada wrote:
> Move the build rules of vmlinux.o out of scripts/link-vmlinux.sh to
> clearly separate 1) pre-modpost, 2) modpost, 3) post-modpost stages.
> This will make furture refactoring possible.

s/furture/future/

>
> Signed-off-by: Masahiro Yamada <[email protected]>
> ---
>
> (no changes since v1)
>
> Makefile | 5 ++++-
> scripts/link-vmlinux.sh | 3 ---
> 2 files changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 92413b6de451..b5dfb54b1993 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1142,6 +1142,9 @@ quiet_cmd_autoksyms_h = GEN $@
> $(autoksyms_h):
> $(call cmd,autoksyms_h)
>
> +vmlinux.o: autoksyms_recursive $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
> + $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.vmlinux_o
> +
> ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
>
> # Final link of vmlinux with optional arch pass after final link
> @@ -1149,7 +1152,7 @@ cmd_link-vmlinux = \
> $(CONFIG_SHELL) $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)"; \
> $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
>
> -vmlinux: scripts/link-vmlinux.sh autoksyms_recursive $(vmlinux-deps) FORCE
> +vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) FORCE
> +$(call if_changed_dep,link-vmlinux)
>
> targets := vmlinux
> diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
> index 161bca64e8aa..07486f90d5e2 100755
> --- a/scripts/link-vmlinux.sh
> +++ b/scripts/link-vmlinux.sh
> @@ -214,9 +214,6 @@ if [ "$1" = "clean" ]; then
> exit 0
> fi
>
> -#link vmlinux.o
> -${MAKE} -f "${srctree}/scripts/Makefile.vmlinux_o"
> -
> # modpost vmlinux.o to check for section mismatches
> ${MAKE} -f "${srctree}/scripts/Makefile.modpost" MODPOST_VMLINUX=1
>
> --
> 2.34.1

Reviewed-by: Nicolas Schier <[email protected]>


Attachments:
(No filename) (1.98 kB)
signature.asc (849.00 B)
Download all attachments

2022-09-28 20:48:09

by Nicolas Schier

[permalink] [raw]
Subject: Re: [PATCH v3 3/7] kbuild: move .vmlinux.objs rule to Makefile.modpost

On Sun, 25 Sep 2022 03:19:11 +0900 Masahiro Yamada wrote:
> .vmlinux.objs is used by modpost, so scripts/Makefile.modpost is
> a better place to generate it.
>
> It is used only when CONFIG_MODVERSIONS=y. It should be guarded
> by "ifdef CONFIG_MODVERSIONS".
>
> Signed-off-by: Masahiro Yamada <[email protected]>
> ---

Reviewed-by: Nicolas Schier <[email protected]>

> (no changes since v1)
>
> Makefile | 2 +-
> scripts/Makefile.modpost | 30 ++++++++++++++++++++++++++++--
> scripts/link-vmlinux.sh | 18 ------------------
> 3 files changed, 29 insertions(+), 21 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index f793c3b1eaec..92413b6de451 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1477,7 +1477,7 @@ 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
> + compile_commands.json .thinlto-cache .vmlinux.objs
>
> # Directories & files removed with 'make mrproper'
> MRPROPER_FILES += include/config include/generated \
> diff --git a/scripts/Makefile.modpost b/scripts/Makefile.modpost
> index 911606496341..04ad00917b2f 100644
> --- a/scripts/Makefile.modpost
> +++ b/scripts/Makefile.modpost
> @@ -57,6 +57,32 @@ vmlinux.symvers: vmlinux.o
>
> __modpost: vmlinux.symvers
>
> +# Generate the list of in-tree objects in vmlinux
> +# ---------------------------------------------------------------------------
> +
> +# This is used to retrieve symbol versions generated by genksyms.
> +ifdef CONFIG_MODVERSIONS
> +vmlinux.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) ;; \
> + *.a) $(AR) t $${f} ;; \
> + *) echo $${f} ;; \
> + esac \
> + done > $@
> +
> +targets += .vmlinux.objs
> +.vmlinux.objs: $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
> + $(call if_changed,vmlinux_objs)
> +
> else
>
> ifeq ($(KBUILD_EXTMOD),)
> @@ -134,6 +160,8 @@ ifneq ($(KBUILD_MODPOST_NOFINAL),1)
> $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modfinal
> endif
>
> +endif
> +
> PHONY += FORCE
> FORCE:
>
> @@ -141,6 +169,4 @@ existing-targets := $(wildcard $(sort $(targets)))
>
> -include $(foreach f,$(existing-targets),$(dir $(f)).$(notdir $(f)).cmd)
>
> -endif
> -
> .PHONY: $(PHONY)
> diff --git a/scripts/link-vmlinux.sh b/scripts/link-vmlinux.sh
> index 8d982574145a..161bca64e8aa 100755
> --- a/scripts/link-vmlinux.sh
> +++ b/scripts/link-vmlinux.sh
> @@ -199,7 +199,6 @@ cleanup()
> rm -f System.map
> rm -f vmlinux
> rm -f vmlinux.map
> - rm -f .vmlinux.objs
> rm -f .vmlinux.export.c
> }
>
> @@ -218,23 +217,6 @@ fi
> #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
>
> --
> 2.34.1

--
epost|xmpp: [email protected] irc://oftc.net/nsc
↳ gpg: 18ed 52db e34f 860e e9fb c82b 7d97 0932 55a0 ce7f
-- frykten for herren er opphav til kunnskap --


Attachments:
(No filename) (3.95 kB)
signature.asc (849.00 B)
Download all attachments

2022-09-28 21:41:31

by Masahiro Yamada

[permalink] [raw]
Subject: Re: [PATCH v3 5/7] kbuild: unify two modpost invocations

On Thu, Sep 29, 2022 at 4:59 AM Nicolas Schier <[email protected]> wrote:
>
> On Sun, 25 Sep 2022 03:19:13 +0900 Masahiro Yamada wrote:
> > Currently, modpost is executed twice; first for vmlinux, second
> > for modules.
> >
> > This commit merges them.
> >
> > Current build flow
> > ==================
> >
> > 1) build obj-y and obj-m objects
> > 2) link vmlinux.o
> > 3) modpost for vmlinux
> > 4) link vmlinux
> > 5) modpost for modules
> > 6) link modules (*.ko)
> >
> > The build steps 1) through 6) are serialized, that is, modules are
> > built after vmlinux. You do not get benefits of parallel builds when
> > scripts/link-vmlinux.sh is being run.
> >
> > New build flow
> > ==============
> >
> > 1) build obj-y and obj-m objects
> > 2) link vmlinux.o
> > 3) modpost for vmlinux and modules
> > 4a) link vmlinux
> > 4b) link modules (*.ko)
> >
> > In the new build flow, modpost is invoked just once.
> >
> > vmlinux and modules are built in parallel. One exception is
> > CONFIG_DEBUG_INFO_BTF_MODULES=y, where modules depend on vmlinux.
> >
> > Signed-off-by: Masahiro Yamada <[email protected]>
> > ---
> >
> > (no changes since v1)
> >
> > Makefile | 30 ++++++++++---
> > scripts/Makefile.modfinal | 2 +-
> > scripts/Makefile.modpost | 93 ++++++++++++---------------------------
> > scripts/link-vmlinux.sh | 3 --
> > 4 files changed, 53 insertions(+), 75 deletions(-)
> >
> > diff --git a/Makefile b/Makefile
> > index b5dfb54b1993..cf9d7b1d8c14 100644
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -1152,7 +1152,7 @@ cmd_link-vmlinux = \
> > $(CONFIG_SHELL) $< "$(LD)" "$(KBUILD_LDFLAGS)" "$(LDFLAGS_vmlinux)"; \
> > $(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
> >
> > -vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) FORCE
> > +vmlinux: scripts/link-vmlinux.sh vmlinux.o $(KBUILD_LDS) modpost FORCE
> > +$(call if_changed_dep,link-vmlinux)
> >
> > targets := vmlinux
> > @@ -1428,7 +1428,13 @@ endif
> > # Build modules
> > #
> >
> > -modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_prepare
> > +# *.ko are usually independent of vmlinux, but CONFIG_DEBUG_INFOBTF_MODULES
> > +# is an exception.
> > +ifdef CONFIG_DEBUG_INFO_BTF_MODULES
> > +modules: vmlinux
> > +endif
> > +
> > +modules: modules_prepare
> >
> > # Target to prepare building external modules
> > modules_prepare: prepare
> > @@ -1741,8 +1747,12 @@ ifdef CONFIG_MODULES
> > $(MODORDER): $(build-dir)
> > @:
> >
> > -modules: modules_check
> > - $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
> > +# 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)
> > @@ -1773,6 +1783,11 @@ 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:
> > @@ -1792,16 +1807,19 @@ 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): $(build-dir)
> > @:
> >
> > # Remove MODORDER when done because it is not the real one.
> > PHONY += single_modpost
>
> PHONY += single_modules


Thank you for your close review!
I will fix it locally.




>
> Reviewed-by: Nicolas Schier <[email protected]>
>

--
Best Regards
Masahiro Yamada

2022-09-29 15:24:34

by Nicolas Schier

[permalink] [raw]
Subject: Re: [PATCH v3 7/7] kbuild: remove head-y syntax

On Sun, 25 Sep 2022 03:19:15 +0900 Masahiro Yamada wrote:
> Kbuild puts the objects listed in head-y at the head of vmlinux.
> Conventionally, we do this for head*.S, which contains the kernel entry
> point.
>
> A counter approach is to control the section order by the linker script.
> Actually, the code marked as __HEAD goes into the ".head.text" section,
> which is placed before the normal ".text" section.
>
> I do not know if both of them are needed. From the build system
> perspective, head-y is not mandatory. If you can achieve the proper code
> placement by the linker script only, it would be cleaner.
>
> I collected the current head-y objects into head-object-list.txt. It is
> a whitelist. My hope is it will be reduced in the long run.
>
> Signed-off-by: Masahiro Yamada <[email protected]>
> ---

Reviewed-by: Nicolas Schier <[email protected]>

(sorry for the sending this one so late, it got lost yesterday.)

> (no changes since v1)
>
> Documentation/kbuild/makefiles.rst | 9 ++---
> Makefile | 4 +--
> arch/alpha/Makefile | 2 --
> arch/arc/Makefile | 2 --
> arch/arm/Makefile | 3 --
> arch/arm64/Makefile | 3 --
> arch/csky/Makefile | 2 --
> arch/hexagon/Makefile | 2 --
> arch/ia64/Makefile | 1 -
> arch/loongarch/Makefile | 2 --
> arch/m68k/Makefile | 9 -----
> arch/microblaze/Makefile | 1 -
> arch/mips/Makefile | 2 --
> arch/nios2/Makefile | 1 -
> arch/openrisc/Makefile | 2 --
> arch/parisc/Makefile | 2 --
> arch/powerpc/Makefile | 12 -------
> arch/riscv/Makefile | 2 --
> arch/s390/Makefile | 2 --
> arch/sh/Makefile | 2 --
> arch/sparc/Makefile | 2 --
> arch/x86/Makefile | 5 ---
> arch/xtensa/Makefile | 2 --
> scripts/head-object-list.txt | 53 ++++++++++++++++++++++++++++++
> 24 files changed, 60 insertions(+), 67 deletions(-)
> create mode 100644 scripts/head-object-list.txt
>
> diff --git a/Documentation/kbuild/makefiles.rst b/Documentation/kbuild/makefiles.rst
> index 5a6a8426cc97..60134ddf3db1 100644
> --- a/Documentation/kbuild/makefiles.rst
> +++ b/Documentation/kbuild/makefiles.rst
> @@ -1070,8 +1070,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
> @@ -1219,6 +1218,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
> @@ -1262,8 +1264,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.
>
> diff --git a/Makefile b/Makefile
> index a8c19f92ac9e..ab986e4c5189 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1149,10 +1149,10 @@ quiet_cmd_ar_vmlinux.a = AR $@
> cmd_ar_vmlinux.a = \
> rm -f $@; \
> $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
> - $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $(head-y)
> + $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $$($(AR) t $@ | grep -F --file=$(srctree)/scripts/head-object-list.txt)
>
> targets += vmlinux.a
> -vmlinux.a: $(KBUILD_VMLINUX_OBJS) FORCE
> +vmlinux.a: $(KBUILD_VMLINUX_OBJS) scripts/head-object-list.txt FORCE
> $(call if_changed,ar_vmlinux.a)
>
> vmlinux.o: autoksyms_recursive vmlinux.a $(KBUILD_VMLINUX_LIBS) FORCE
> diff --git a/arch/alpha/Makefile b/arch/alpha/Makefile
> index 881cb913e23a..45158024085e 100644
> --- a/arch/alpha/Makefile
> +++ b/arch/alpha/Makefile
> @@ -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
> diff --git a/arch/arc/Makefile b/arch/arc/Makefile
> index efc54f3e35e0..329400a1c355 100644
> --- a/arch/arc/Makefile
> +++ b/arch/arc/Makefile
> @@ -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/
>
> diff --git a/arch/arm/Makefile b/arch/arm/Makefile
> index 56f655deebb1..29d15c9a433e 100644
> --- a/arch/arm/Makefile
> +++ b/arch/arm/Makefile
> @@ -134,9 +134,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
> diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
> index 6d9d4a58b898..6e03f15bb041 100644
> --- a/arch/arm64/Makefile
> +++ b/arch/arm64/Makefile
> @@ -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)
> diff --git a/arch/csky/Makefile b/arch/csky/Makefile
> index 4e1d619fd5c6..0e4237e55758 100644
> --- a/arch/csky/Makefile
> +++ b/arch/csky/Makefile
> @@ -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/ \
> diff --git a/arch/hexagon/Makefile b/arch/hexagon/Makefile
> index 44312bc147d8..92d005958dfb 100644
> --- a/arch/hexagon/Makefile
> +++ b/arch/hexagon/Makefile
> @@ -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
> diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile
> index e55c2f138656..56c4bb276b6e 100644
> --- a/arch/ia64/Makefile
> +++ b/arch/ia64/Makefile
> @@ -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/
>
> diff --git a/arch/loongarch/Makefile b/arch/loongarch/Makefile
> index ec3de6191276..131fc210c2bf 100644
> --- a/arch/loongarch/Makefile
> +++ b/arch/loongarch/Makefile
> @@ -72,8 +72,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/
>
> ifeq ($(KBUILD_EXTMOD),)
> diff --git a/arch/m68k/Makefile b/arch/m68k/Makefile
> index e358605b70ba..43e39040d3ac 100644
> --- a/arch/m68k/Makefile
> +++ b/arch/m68k/Makefile
> @@ -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/
>
>
> diff --git a/arch/microblaze/Makefile b/arch/microblaze/Makefile
> index 1826d9ce4459..3f8a86c4336a 100644
> --- a/arch/microblaze/Makefile
> +++ b/arch/microblaze/Makefile
> @@ -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
> diff --git a/arch/mips/Makefile b/arch/mips/Makefile
> index 4d2a3e73fc45..b296e33f8e33 100644
> --- a/arch/mips/Makefile
> +++ b/arch/mips/Makefile
> @@ -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/
>
> diff --git a/arch/nios2/Makefile b/arch/nios2/Makefile
> index 3f34e6831863..f1ff4ce0f1a2 100644
> --- a/arch/nios2/Makefile
> +++ b/arch/nios2/Makefile
> @@ -37,7 +37,6 @@ 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)
>
> INSTALL_PATH ?= /tftpboot
> diff --git a/arch/openrisc/Makefile b/arch/openrisc/Makefile
> index b446510173cd..68249521db5a 100644
> --- a/arch/openrisc/Makefile
> +++ b/arch/openrisc/Makefile
> @@ -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
> diff --git a/arch/parisc/Makefile b/arch/parisc/Makefile
> index e38d993d87f2..a2d8600521f9 100644
> --- a/arch/parisc/Makefile
> +++ b/arch/parisc/Makefile
> @@ -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
> diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
> index 02742facf895..89c27827a11f 100644
> --- a/arch/powerpc/Makefile
> +++ b/arch/powerpc/Makefile
> @@ -226,18 +226,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_FSL_BOOKE) := arch/powerpc/kernel/head_fsl_booke.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
>
> diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
> index 3fa8ef336822..e013df8e7b8b 100644
> --- a/arch/riscv/Makefile
> +++ b/arch/riscv/Makefile
> @@ -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
>
> diff --git a/arch/s390/Makefile b/arch/s390/Makefile
> index 4cb5d17e7ead..de6d8b2ea4d8 100644
> --- a/arch/s390/Makefile
> +++ b/arch/s390/Makefile
> @@ -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/
>
> diff --git a/arch/sh/Makefile b/arch/sh/Makefile
> index b39412bf91fb..5c8776482530 100644
> --- a/arch/sh/Makefile
> +++ b/arch/sh/Makefile
> @@ -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
> diff --git a/arch/sparc/Makefile b/arch/sparc/Makefile
> index fe58a410b4ce..a4ea5b05f288 100644
> --- a/arch/sparc/Makefile
> +++ b/arch/sparc/Makefile
> @@ -56,8 +56,6 @@ endif
>
> endif
>
> -head-y := arch/sparc/kernel/head_$(BITS).o
> -
> libs-y += arch/sparc/prom/
> libs-y += arch/sparc/lib/
>
> diff --git a/arch/x86/Makefile b/arch/x86/Makefile
> index bafbd905e6e7..9afd323c6916 100644
> --- a/arch/x86/Makefile
> +++ b/arch/x86/Makefile
> @@ -234,11 +234,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
> diff --git a/arch/xtensa/Makefile b/arch/xtensa/Makefile
> index 5097caa7bf0c..bfd8e433ed62 100644
> --- a/arch/xtensa/Makefile
> +++ b/arch/xtensa/Makefile
> @@ -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
> diff --git a/scripts/head-object-list.txt b/scripts/head-object-list.txt
> new file mode 100644
> index 000000000000..dd2ba2eda636
> --- /dev/null
> +++ b/scripts/head-object-list.txt
> @@ -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_book3s_32.o
> +arch/powerpc/kernel/head_fsl_booke.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
> --
> 2.34.1

--
epost|xmpp: [email protected] irc://oftc.net/nsc
↳ gpg: 18ed 52db e34f 860e e9fb c82b 7d97 0932 55a0 ce7f
-- frykten for herren er opphav til kunnskap --


Attachments:
(No filename) (16.37 kB)
signature.asc (849.00 B)
Download all attachments

2022-10-18 08:37:26

by Jiri Slaby

[permalink] [raw]
Subject: Re: [PATCH v3 7/7] kbuild: remove head-y syntax

Hi,

On 24. 09. 22, 20:19, Masahiro Yamada wrote:
> Kbuild puts the objects listed in head-y at the head of vmlinux.
> Conventionally, we do this for head*.S, which contains the kernel entry
> point.
>
> A counter approach is to control the section order by the linker script.
> Actually, the code marked as __HEAD goes into the ".head.text" section,
> which is placed before the normal ".text" section.
>
> I do not know if both of them are needed. From the build system
> perspective, head-y is not mandatory. If you can achieve the proper code
> placement by the linker script only, it would be cleaner.
>
> I collected the current head-y objects into head-object-list.txt. It is
> a whitelist. My hope is it will be reduced in the long run.
>
> Signed-off-by: Masahiro Yamada <[email protected]>
...
> --- a/Makefile
> +++ b/Makefile
> @@ -1149,10 +1149,10 @@ quiet_cmd_ar_vmlinux.a = AR $@
> cmd_ar_vmlinux.a = \
> rm -f $@; \
> $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
> - $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $(head-y)
> + $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $$($(AR) t $@ | grep -F --file=$(srctree)/scripts/head-object-list.txt)

With AR=gcc-ar, the "| head -n1" results in:
/usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ar
terminated with signal 13 [Broken pipe]

I found out only with gcc-lto. But maybe we should make it silent in any
case? I'm not sure how. This looks ugly (and needs the whole output to
be piped):
gcc-ar t vmlinux.a | ( head -n1; cat >/dev/null )

Note the result appears to be correct, it's only that gcc-ar complains
after printing out the very first line.

thanks,
--
js
suse labs

2022-10-18 09:26:36

by Masahiro Yamada

[permalink] [raw]
Subject: Re: [PATCH v3 7/7] kbuild: remove head-y syntax

On Tue, Oct 18, 2022 at 5:16 PM Jiri Slaby <[email protected]> wrote:
>
> Hi,
>
> On 24. 09. 22, 20:19, Masahiro Yamada wrote:
> > Kbuild puts the objects listed in head-y at the head of vmlinux.
> > Conventionally, we do this for head*.S, which contains the kernel entry
> > point.
> >
> > A counter approach is to control the section order by the linker script.
> > Actually, the code marked as __HEAD goes into the ".head.text" section,
> > which is placed before the normal ".text" section.
> >
> > I do not know if both of them are needed. From the build system
> > perspective, head-y is not mandatory. If you can achieve the proper code
> > placement by the linker script only, it would be cleaner.
> >
> > I collected the current head-y objects into head-object-list.txt. It is
> > a whitelist. My hope is it will be reduced in the long run.
> >
> > Signed-off-by: Masahiro Yamada <[email protected]>
> ...
> > --- a/Makefile
> > +++ b/Makefile
> > @@ -1149,10 +1149,10 @@ quiet_cmd_ar_vmlinux.a = AR $@
> > cmd_ar_vmlinux.a = \
> > rm -f $@; \
> > $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
> > - $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $(head-y)
> > + $(AR) mPiT $$($(AR) t $@ | head -n1) $@ $$($(AR) t $@ | grep -F --file=$(srctree)/scripts/head-object-list.txt)
>
> With AR=gcc-ar, the "| head -n1" results in:
> /usr/lib64/gcc/x86_64-suse-linux/7/../../../../x86_64-suse-linux/bin/ar
> terminated with signal 13 [Broken pipe]
>
> I found out only with gcc-lto. But maybe we should make it silent in any
> case? I'm not sure how. This looks ugly (and needs the whole output to
> be piped):
> gcc-ar t vmlinux.a | ( head -n1; cat >/dev/null )
>
> Note the result appears to be correct, it's only that gcc-ar complains
> after printing out the very first line.


Indeed, I see the same message.


sed does not show such an error, though.


masahiro@zoe:~/ref/linux$ gcc-ar t vmlinux.a | head -n1
arch/x86/kernel/head_64.o
/usr/bin/ar terminated with signal 13 [Broken pipe]


masahiro@zoe:~/ref/linux$ gcc-ar t vmlinux.a | sed -n 1p
arch/x86/kernel/head_64.o







--
Best Regards
Masahiro Yamada

2022-10-24 20:56:09

by Jiri Slaby

[permalink] [raw]
Subject: Re: [PATCH v3 6/7] kbuild: use obj-y instead extra-y for objects placed at the head

Hi,

following an IRC discussion with many parties...

On 24. 09. 22, 20:19, Masahiro Yamada wrote:
> The objects placed at the head of vmlinux need special treatments:
>
> - arch/$(SRCARCH)/Makefile adds them to head-y in order to place
> them before other archives in the linker command line.
>
> - arch/$(SRCARCH)/kernel/Makefile adds them to extra-y instead of
> obj-y to avoid them going into built-in.a.
>
> This commit gets rid of the latter.
>
> Create vmlinux.a to collect all the objects that are unconditionally
> linked to vmlinux. The objects listed in head-y are moved to the head
> of vmlinux.a by using 'ar m'.
>
> With this, arch/$(SRCARCH)/kernel/Makefile can consistently use obj-y
> for builtin objects.
>
> There is no *.o that is directly linked to vmlinux. Drop unneeded code
> in scripts/clang-tools/gen_compile_commands.py.
>
> $(AR) mPi needs 'T' to workaround the llvm-ar bug. The fix was suggested
> by Nathan Chancellor [1].
>
> [1]: https://lore.kernel.org/llvm/[email protected]/
>
> Signed-off-by: Masahiro Yamada <[email protected]>
> ---
...
> --- a/scripts/Makefile.vmlinux_o
> +++ b/scripts/Makefile.vmlinux_o
> @@ -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

There is a slight problem with this. The kernel built with gcc-LTO does
not boot. But as I understand it, it's not limited to gcc-LTO only.

On x86, startup_64() is supposed to be at offset >zero< of the image
(see .Lrelocated()). It was ensured by putting head64.o to the beginning
of vmlinux (by KBUILD_VMLINUX_OBJS on the LD command-line above). The
patch above instead packs head64.o into vmlinux.a and then moves it
using "ar -m" to the beginning (it's in 7/7 of the series IIRC).

The problem is that .o files listed on the LD command line explicitly
are taken as spelled. But unpacking .a inside LD gives no guarantees on
the order of packed objects. To quote: "that it happens to work
sometimes is pure luck." (Correct me guys, if I misunderstood you.)

For x86, the most ideal fix seems to be to fix it in the linker script.
By putting startup_64() to a different section and handle it in the ld
script specially -- see the attachment. It should always have been put
this way, the command line order is only a workaround. But this might
need more fixes on other archs too -- I haven't take a look.

Ideas, comments? I'll send the attachment as a PATCH later (if there are
no better suggestions).

thanks,
--
js
suse labs


Attachments:
0001-head-fix.patch (1.69 kB)

2022-10-25 13:07:58

by Michael Matz

[permalink] [raw]
Subject: Re: [PATCH v3 6/7] kbuild: use obj-y instead extra-y for objects placed at the head

Hello,

On Mon, 24 Oct 2022, Jiri Slaby wrote:

> > Create vmlinux.a to collect all the objects that are unconditionally
> > linked to vmlinux. The objects listed in head-y are moved to the head
> > of vmlinux.a by using 'ar m'.
...
> > --- a/scripts/Makefile.vmlinux_o
> > +++ b/scripts/Makefile.vmlinux_o
> > @@ -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
>
> There is a slight problem with this. The kernel built with gcc-LTO does not
> boot. But as I understand it, it's not limited to gcc-LTO only.
>
> On x86, startup_64() is supposed to be at offset >zero< of the image (see
> .Lrelocated()). It was ensured by putting head64.o to the beginning of vmlinux
> (by KBUILD_VMLINUX_OBJS on the LD command-line above). The patch above instead
> packs head64.o into vmlinux.a and then moves it using "ar -m" to the beginning
> (it's in 7/7 of the series IIRC).
>
> The problem is that .o files listed on the LD command line explicitly are
> taken as spelled. But unpacking .a inside LD gives no guarantees on the order
> of packed objects. To quote: "that it happens to work sometimes is pure luck."
> (Correct me guys, if I misunderstood you.)

To be precise: I know of no linker (outside LTO-like modes) that processes
archives in a different order than first-to-last-member (under
whole-archive), but that's not guaranteed anywhere. So relying on
member-order within archives is always brittle.

It will completely break down with LTO modes: the granularity for that is
functions, and they are placed in some unknown (from the outside, but
usually related to call-graph locality) order into several partitions,
with non-LTO-able parts (like asm code) being placed randomly between
them. The order of these blobs can not be defined in relation to the
input order of object files: with cross-file dependencies such order might
not even exist. Those whole sequence of blobs then takes the place of the
input archive (which, as there was only one, has no particular order from
the linker command lines perspective).

There are only two ways of guaranteeing an ordering: put non-LTO-.o files
at certain places of the link command, or, better, use a linker script to
specify an order.

> For x86, the most ideal fix seems to be to fix it in the linker script. By
> putting startup_64() to a different section and handle it in the ld script
> specially -- see the attachment. It should always have been put this way, the
> command line order is only a workaround. But this might need more fixes on
> other archs too -- I haven't take a look.
>
> Ideas, comments? I'll send the attachment as a PATCH later (if there are
> no better suggestions).

This will work. An alternative way would be to explicitely name the input
file in the section commands, without renaming the section:

@@ -126,6 +126,7 @@ SECTIONS
_text = .;
_stext = .;
/* bootstrapping code */
+ KEEP(vmlinux.a:head64.o(.head.text))
HEAD_TEXT
TEXT_TEXT

But I guess not all arch's name their must-be-first file head64.o (or even
have such requirement), so that's probably still arch-dependend and hence
not inherently better than your way.

(syntax for the section selector in linkerscripts is:

{archive-glob:}filename-glob (sectionname-glob)


Ciao,
Michael.

2022-10-26 08:42:37

by Jiri Slaby

[permalink] [raw]
Subject: Re: [PATCH v3 6/7] kbuild: use obj-y instead extra-y for objects placed at the head

On 25. 10. 22, 14:26, Michael Matz wrote:
>> Ideas, comments? I'll send the attachment as a PATCH later (if there are
>> no better suggestions).
>
> This will work. An alternative way would be to explicitly name the input
> file in the section commands, without renaming the section:
>
> @@ -126,6 +126,7 @@ SECTIONS
> _text = .;
> _stext = .;
> /* bootstrapping code */
> + KEEP(vmlinux.a:head64.o(.head.text))
> HEAD_TEXT
> TEXT_TEXT
>
> But I guess not all arch's name their must-be-first file head64.o (or even
> have such requirement), so that's probably still arch-dependend and hence
> not inherently better than your way.

The downside of this is that it doesn't make sure the function
(startup_64()) is the first one. When someone sticks something before
it, it breaks again. But leaving the decision up to the x86 maintainers ;).

Re. other archs, I have absolutely no idea (haven't looked into that at
all).

thanks,
--
js


2022-10-26 11:40:20

by Ard Biesheuvel

[permalink] [raw]
Subject: Re: [PATCH v3 6/7] kbuild: use obj-y instead extra-y for objects placed at the head

On Wed, 26 Oct 2022 at 10:35, Jiri Slaby <[email protected]> wrote:
>
> On 25. 10. 22, 14:26, Michael Matz wrote:
> >> Ideas, comments? I'll send the attachment as a PATCH later (if there are
> >> no better suggestions).
> >
> > This will work. An alternative way would be to explicitly name the input
> > file in the section commands, without renaming the section:
> >
> > @@ -126,6 +126,7 @@ SECTIONS
> > _text = .;
> > _stext = .;
> > /* bootstrapping code */
> > + KEEP(vmlinux.a:head64.o(.head.text))
> > HEAD_TEXT
> > TEXT_TEXT
> >
> > But I guess not all arch's name their must-be-first file head64.o (or even
> > have such requirement), so that's probably still arch-dependend and hence
> > not inherently better than your way.
>
> The downside of this is that it doesn't make sure the function
> (startup_64()) is the first one. When someone sticks something before
> it, it breaks again. But leaving the decision up to the x86 maintainers ;).
>
> Re. other archs, I have absolutely no idea (haven't looked into that at
> all).
>

I seriously doubt that those __head routines need to be in .head.text.
At the time, there seems to have been some regression related to
5-level paging, but whether and how that change actually fixed
anything at all is undocumented.

So the fix here is to move those __head routines into __init, so that
only startup_64 remains in .head.text, and the existing linker script
will put it where it belongs.





commit 26179670a68b7b365fbfe38afb043dcd2e1a4678
Author: Kirill A. Shutemov <[email protected]>
Date: Fri Jun 16 14:30:24 2017 +0300

x86/boot/64: Put __startup_64() into .head.text

Put __startup_64() and fixup_pointer() into .head.text section to make
sure it's always near startup_64() and always callable.

Signed-off-by: Kirill A. Shutemov <[email protected]>
Cc: Linus Torvalds <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Thomas Gleixner <[email protected]>
Cc: kernel test robot <[email protected]>
Cc: [email protected]
Link: http://lkml.kernel.org/r/[email protected]
Signed-off-by: Ingo Molnar <[email protected]>

2022-10-26 17:19:39

by Masahiro Yamada

[permalink] [raw]
Subject: Re: [PATCH v3 6/7] kbuild: use obj-y instead extra-y for objects placed at the head

On Tue, Oct 25, 2022 at 2:26 PM Michael Matz <[email protected]> wrote:
>
> Hello,
>
> On Mon, 24 Oct 2022, Jiri Slaby wrote:
>
> > > Create vmlinux.a to collect all the objects that are unconditionally
> > > linked to vmlinux. The objects listed in head-y are moved to the head
> > > of vmlinux.a by using 'ar m'.
> ...
> > > --- a/scripts/Makefile.vmlinux_o
> > > +++ b/scripts/Makefile.vmlinux_o
> > > @@ -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
> >
> > There is a slight problem with this. The kernel built with gcc-LTO does not
> > boot. But as I understand it, it's not limited to gcc-LTO only.
> >
> > On x86, startup_64() is supposed to be at offset >zero< of the image (see
> > .Lrelocated()). It was ensured by putting head64.o to the beginning of vmlinux
> > (by KBUILD_VMLINUX_OBJS on the LD command-line above). The patch above instead
> > packs head64.o into vmlinux.a and then moves it using "ar -m" to the beginning
> > (it's in 7/7 of the series IIRC).
> >
> > The problem is that .o files listed on the LD command line explicitly are
> > taken as spelled. But unpacking .a inside LD gives no guarantees on the order
> > of packed objects. To quote: "that it happens to work sometimes is pure luck."
> > (Correct me guys, if I misunderstood you.)
>
> To be precise: I know of no linker (outside LTO-like modes) that processes
> archives in a different order than first-to-last-member (under
> whole-archive), but that's not guaranteed anywhere. So relying on
> member-order within archives is always brittle.


The objects in an archive are linked first-to-last-member for a long time.
This is the assumption which we have relied on for a long time.


We assume the initcall order is preserved.
The call order within each of core_initcall, arch_initcall,
device_initcall, etc.
is the order of objects in built-in.a, in other words,
the order they appear in Makefiles.


If this assumption were broken, the initcall order would be randomised.
(Somebody would have screamed earlier, if so.)



Clang LTO came up with its own workaround.
See commit a8cccdd954732a558d481407ab7c3106b89c34ae


So, this is happening on (not-upstreamed-yet) GCC LTO only?





> It will completely break down with LTO modes: the granularity for that is
> functions, and they are placed in some unknown (from the outside, but
> usually related to call-graph locality) order into several partitions,
> with non-LTO-able parts (like asm code) being placed randomly between
> them. The order of these blobs can not be defined in relation to the
> input order of object files: with cross-file dependencies such order might
> not even exist. Those whole sequence of blobs then takes the place of the
> input archive (which, as there was only one, has no particular order from
> the linker command lines perspective).
>
> There are only two ways of guaranteeing an ordering: put non-LTO-.o files
> at certain places of the link command, or, better, use a linker script to
> specify an order.


The objects directly given in the command line are linked in the same order,
even under LTO mode. Is this what you mean?

Any documentation about that?





> > For x86, the most ideal fix seems to be to fix it in the linker script. By
> > putting startup_64() to a different section and handle it in the ld script
> > specially -- see the attachment. It should always have been put this way, the
> > command line order is only a workaround. But this might need more fixes on
> > other archs too -- I haven't take a look.
> >
> > Ideas, comments? I'll send the attachment as a PATCH later (if there are
> > no better suggestions).
>
> This will work. An alternative way would be to explicitely name the input
> file in the section commands, without renaming the section:
>
> @@ -126,6 +126,7 @@ SECTIONS
> _text = .;
> _stext = .;
> /* bootstrapping code */
> + KEEP(vmlinux.a:head64.o(.head.text))
> HEAD_TEXT
> TEXT_TEXT
>
> But I guess not all arch's name their must-be-first file head64.o (or even
> have such requirement), so that's probably still arch-dependend and hence
> not inherently better than your way.
>
> (syntax for the section selector in linkerscripts is:
>
> {archive-glob:}filename-glob (sectionname-glob)
>
>
> Ciao,
> Michael.



--
Best Regards

Masahiro Yamada

2022-10-26 17:46:41

by Michael Matz

[permalink] [raw]
Subject: Re: [PATCH v3 6/7] kbuild: use obj-y instead extra-y for objects placed at the head

Hello,

On Thu, 27 Oct 2022, Masahiro Yamada wrote:

> > To be precise: I know of no linker (outside LTO-like modes) that processes
> > archives in a different order than first-to-last-member (under
> > whole-archive), but that's not guaranteed anywhere. So relying on
> > member-order within archives is always brittle.
>
> The objects in an archive are linked first-to-last-member for a long time.
> This is the assumption which we have relied on for a long time.

Sure, that doesn't mean it's guaranteed, for this I'm just devils
advocate. As I said, it's the mode of operation of all currently existing
linkers I know, so for the forseeable future you can continue to rely on
it. But as soon as LTO enters the picture that all breaks down, as you
see here.

Consider how LTO works, the granularity of shuffling stuff around is the
functions of all inputs, not the object files. So, even if you say
obj1.o obj2.o
on the link command line, and supposed there are two functions in each of
obj1 and obj2, then it may just so happen that LTO partitions the program
such that it ends up with partitions
part1 : obj1:foo obj2:bar
part2 : obj1:bar obj2:foo
now, suddenly there is no order between part1 and part2 anymore that
would faithfully represent the original order between obj1 and obj2
functions. Of course the partitioning algorithm could be changed, but
that would limit the effectiveness of LTO.

> We assume the initcall order is preserved.
> The call order within each of core_initcall, arch_initcall,
> device_initcall, etc.
> is the order of objects in built-in.a, in other words,
> the order they appear in Makefiles.

If you rely on relative order of these, then you will probably see
interesting effects in LTO mode eventually.

> So, this is happening on (not-upstreamed-yet) GCC LTO only?

I don't know. As any kind of whole-program transformations is in
principle cross-file on per-function basis (that's the whole purpose) I
would imagine that you can see these effects in all compilers, if you try
hard enough.

> > There are only two ways of guaranteeing an ordering: put non-LTO-.o files
> > at certain places of the link command, or, better, use a linker script to
> > specify an order.
>
> The objects directly given in the command line are linked in the same order,
> even under LTO mode. Is this what you mean?

If they don't contain LTO code then yes, they are linked
in exactly the given order. If they do, they become part of the LTO blob
whose ordering isn't precisely influenced by cmdline order.

> Any documentation about that?

I think so, but I can't point my finger to anything. Several parts of the
toolchain rely on that (so the kernel is not alone), but those are either
carefully avoiding LTO or using other ordering means like linker script to
achieve what they need.


Ciao,
Michael.