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.
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
---
(no changes since v1)
Documentation/kbuild/makefiles.rst | 18 +----------------
Makefile | 18 +++++++++++++----
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 | 21 ++++++++++----------
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 | 22 ++++++++++-----------
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, 87 insertions(+), 112 deletions(-)
diff --git a/Documentation/kbuild/makefiles.rst b/Documentation/kbuild/makefiles.rst
index 11a296e52d68..07c7e5a843c1 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 f9ee16bd212d..f2d06aaaefd3 100644
--- a/Makefile
+++ b/Makefile
@@ -1113,7 +1113,7 @@ clean-dirs := $(vmlinux-alldirs)
export ARCH_CORE := $(core-y)
export ARCH_DRIVERS := $(drivers-y)
# Externally visible symbols (used by link-vmlinux.sh)
-KBUILD_VMLINUX_OBJS := $(head-y) ./built-in.a
+KBUILD_VMLINUX_OBJS := ./built-in.a
KBUILD_VMLINUX_OBJS += $(addsuffix built-in.a, $(filter %/, $(libs-y)))
ifdef CONFIG_MODULES
KBUILD_VMLINUX_OBJS += $(patsubst %/, %/lib.a, $(filter %/, $(libs-y)))
@@ -1122,7 +1122,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
# used by scripts/Makefile.package
export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) LICENSES arch include scripts tools)
@@ -1151,8 +1151,18 @@ quiet_cmd_autoksyms_h = GEN $@
$(autoksyms_h):
$(call cmd,autoksyms_h)
+quiet_cmd_ar_vmlinux.a = AR $@
+ cmd_ar_vmlinux.a = \
+ rm -f $@; \
+ $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
+ $(AR) mPi $$($(AR) t $@ | head -n1) $@ $(head-y)
+
+targets += vmlinux.a
+vmlinux.a: $(KBUILD_VMLINUX_OBJS) FORCE
+ $(call if_changed,ar_vmlinux.a)
+
targets += vmlinux.o
-vmlinux.o: autoksyms_recursive $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
+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)
@@ -1909,7 +1919,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. (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..1755e6cd309f 100644
--- a/arch/m68k/kernel/Makefile
+++ b/arch/m68k/kernel/Makefile
@@ -3,18 +3,19 @@
# 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-$(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
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..f264d9b2cb63 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,12 +198,12 @@ 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
+obj-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += prom_init_check
quiet_cmd_prom_init_check = PROMCHK $@
cmd_prom_init_check = $(CONFIG_SHELL) $< "$(NM)" $(obj)/prom_init.o; touch $@
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 d7d3138c5ecc..4f74370ad1ee 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
Hi, On Tue, Sep 06, 2022 at 03:13:12PM +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. > > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> > Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org> The following build failure is seen when building m68k:defconfig in next-20220919. m68k-linux-ld: arch/m68k/kernel/setup.o: in function `setup_arch': setup.c:(.init.text+0x2dc): undefined reference to `availmem' m68k-linux-ld: arch/m68k/kernel/early_printk.o: in function `debug_cons_write': early_printk.c:(.ref.text+0x28): undefined reference to `debug_cons_nputs' m68k-linux-ld: arch/m68k/mm/init.o: in function `mem_init': init.c:(.init.text+0x6e): undefined reference to `kernel_pg_dir' m68k-linux-ld: init.c:(.init.text+0x10): undefined reference to `kernel_pg_dir' m68k-linux-ld: init.c:(.init.text+0x1e): undefined reference to `kernel_pg_dir' m68k-linux-ld: arch/m68k/mm/motorola.o: in function `cache_page': motorola.c:(.text+0xfc): undefined reference to `m68k_supervisor_cachemode' m68k-linux-ld: arch/m68k/mm/motorola.o: in function `mmu_page_ctor': motorola.c:(.text+0x162): undefined reference to `m68k_pgtable_cachemode' m68k-linux-ld: arch/m68k/mm/motorola.o: in function `paging_init': motorola.c:(.init.text+0x3d2): undefined reference to `kernel_pg_dir' m68k-linux-ld: motorola.c:(.init.text+0x1d8): undefined reference to `availmem' m68k-linux-ld: motorola.c:(.init.text+0x32e): undefined reference to `m68k_supervisor_cachemode' m68k-linux-ld: motorola.c:(.init.text+0x3a8): undefined reference to `kernel_pg_dir' m68k-linux-ld: arch/m68k/q40/config.o: in function `q40_mem_console_write': config.c:(.text+0x25c): undefined reference to `q40_mem_cptr' m68k-linux-ld: config.c:(.text+0x254): undefined reference to `q40_mem_cptr' m68k-linux-ld: arch/m68k/q40/config.o: in function `q40_debug_setup': config.c:(.init.text+0x28): undefined reference to `q40_mem_cptr' m68k-linux-ld: arch/m68k/mvme16x/config.o: in function `mvme16x_abort_int': config.c:(.text+0x4): undefined reference to `mvme_bdid' m68k-linux-ld: arch/m68k/mvme16x/config.o: in function `mvme16x_get_model': config.c:(.text+0xc8): undefined reference to `mvme_bdid' m68k-linux-ld: config.c:(.text+0xce): undefined reference to `mvme_bdid' m68k-linux-ld: config.c:(.text+0xea): undefined reference to `mvme_bdid' m68k-linux-ld: arch/m68k/mvme16x/config.o: in function `mvme16x_get_hardware_list': config.c:(.text+0x148): undefined reference to `mvme_bdid' m68k-linux-ld: arch/m68k/mvme16x/config.o:config.c:(.text+0x1d0): more undefined references to `mvme_bdid' follow m68k-linux-ld: kernel/extable.o: in function `core_kernel_text': extable.c:(.text+0x52): undefined reference to `_stext' m68k-linux-ld: kernel/kallsyms.o: in function `is_ksym_addr': kallsyms.c:(.text+0x31c): undefined reference to `_stext' m68k-linux-ld: kernel/crash_core.o: in function `crash_save_vmcoreinfo_init': crash_core.c:(.init.text+0x4d4): undefined reference to `_stext' m68k-linux-ld: crash_core.c:(.init.text+0x4bc): undefined reference to `kernel_pg_dir' m68k-linux-ld: mm/page_alloc.o: in function `mem_init_print_info': page_alloc.c:(.init.text+0xff8): undefined reference to `_stext' m68k-linux-ld: page_alloc.c:(.init.text+0x1050): undefined reference to `_stext' m68k-linux-ld: mm/init-mm.o:(.data+0x18): undefined reference to `kernel_pg_dir' m68k-linux-ld: mm/usercopy.o: in function `__check_object_size': usercopy.c:(.text+0x15a): undefined reference to `_stext' Bisect points to this patch (or its equivalent in next-20220919). Guenter --- # bad: [4c9ca5b1597e3222177ba2a94658f78fa5ef4f58] Add linux-next specific files for 20220919 # good: [521a547ced6477c54b4b0cc206000406c221b4d6] Linux 6.0-rc6 git bisect start 'HEAD' 'v6.0-rc6' # bad: [8b4141305a585c4cb1147dcc164059dc3b5489e2] Merge branch 'drm-next' of git://git.freedesktop.org/git/drm/drm.git git bisect bad 8b4141305a585c4cb1147dcc164059dc3b5489e2 # bad: [03e33baab7f2c3459bd268639af383cafe0c0a4b] Merge branch 'docs-next' of git://git.lwn.net/linux.git git bisect bad 03e33baab7f2c3459bd268639af383cafe0c0a4b # bad: [c1a464c761e4098899873c472b3756f557a3b73c] Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/tmlind/linux-omap.git git bisect bad c1a464c761e4098899873c472b3756f557a3b73c # bad: [59d922adf1c023a84bd4dd4fad0442221fd6347f] Merge branch 'for-next/core' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux git bisect bad 59d922adf1c023a84bd4dd4fad0442221fd6347f # good: [166f57a723e13d816b09b2f27433f2c8ba2f06fe] Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/sre/linux-power-supply.git git bisect good 166f57a723e13d816b09b2f27433f2c8ba2f06fe # bad: [aaa38e8ca1345b2369051a6213f706d5107a20ba] Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/arnd/asm-generic.git git bisect bad aaa38e8ca1345b2369051a6213f706d5107a20ba # good: [1081fb0f6d6e68186e1088db33396b11770a0710] perf vendor events arm64: Move REMOTE_ACCESS to "memory" category git bisect good 1081fb0f6d6e68186e1088db33396b11770a0710 # bad: [4aaa1766cf8d19becdade98bff3960c6583b8d09] Merge branch 'for-next' of git://git.kernel.org/pub/scm/linux/kernel/git/masahiroy/linux-kbuild.git git bisect bad 4aaa1766cf8d19becdade98bff3960c6583b8d09 # good: [a521c97e2a63490c238865763fc86942dce8d6bb] kbuild: rewrite check-local-export in sh/awk git bisect good a521c97e2a63490c238865763fc86942dce8d6bb # bad: [6676e2cdd7c339dc40331faccbaac1112d2c1d78] kbuild: use obj-y instead extra-y for objects placed at the head git bisect bad 6676e2cdd7c339dc40331faccbaac1112d2c1d78 # good: [10d1d4b75525f3172c6930fb20445f669762ea95] kbuild: move core-y and drivers-y to ./Kbuild git bisect good 10d1d4b75525f3172c6930fb20445f669762ea95 # good: [b8d366ae69fe633e697776b839ac52d3eecf07d3] kbuild: move vmlinux.o rule to the top Makefile git bisect good b8d366ae69fe633e697776b839ac52d3eecf07d3 # good: [165b718fdd8c5a9165b4485019729c0cd8728120] kbuild: unify two modpost invocations git bisect good 165b718fdd8c5a9165b4485019729c0cd8728120 # first bad commit: [6676e2cdd7c339dc40331faccbaac1112d2c1d78] kbuild: use obj-y instead extra-y for objects placed at the head
Hi Günter,
On Tue, Sep 20, 2022 at 12:59 AM Guenter Roeck <linux@roeck-us.net> wrote:
> On Tue, Sep 06, 2022 at 03:13:12PM +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.
> >
> > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
> > Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
Where does this R-b come from? It was not present in Yamada-san's
posting. Added by b4?
> The following build failure is seen when building m68k:defconfig in
> next-20220919.
[...]
> # first bad commit: [6676e2cdd7c339dc40331faccbaac1112d2c1d78] kbuild: use obj-y instead extra-y for objects placed at the head
I did provide my R-b on Yamada-san's fix for this issue, which was
sent later in this thread.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
On 9/19/22 23:56, Geert Uytterhoeven wrote:
> Hi Günter,
>
> On Tue, Sep 20, 2022 at 12:59 AM Guenter Roeck <linux@roeck-us.net> wrote:
>> On Tue, Sep 06, 2022 at 03:13:12PM +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.
>>>
>>> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
>>> Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
>
> Where does this R-b come from? It was not present in Yamada-san's
> posting. Added by b4?
>
Maybe added by patchwork ? That is where I picked up the mbox.
Guenter
>> The following build failure is seen when building m68k:defconfig in
>> next-20220919.
>
> [...]
>
>> # first bad commit: [6676e2cdd7c339dc40331faccbaac1112d2c1d78] kbuild: use obj-y instead extra-y for objects placed at the head
>
> I did provide my R-b on Yamada-san's fix for this issue, which was
> sent later in this thread.
>
> Gr{oetje,eeting}s,
>
> Geert
>
> --
> Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
>
> In personal conversations with technical people, I call myself a hacker. But
> when I'm talking to journalists I just say "programmer" or something like that.
> -- Linus Torvalds
On Tue, Sep 6, 2022 at 3:13 PM Masahiro Yamada <masahiroy@kernel.org> 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. > > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> > --- > > (no changes since v1) > > @@ -198,12 +198,12 @@ 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 > +obj-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += prom_init_check This line should not be changed. I fixed it up locally. https://lore.kernel.org/lkml/CAK7LNARzFmJjpyUciy1LRvaFo72aZcqRbzY-63ArpeszC+HfmQ@mail.gmail.com/ -- Best Regards Masahiro Yamada
Hi Yamada-san,
On Tue, Sep 6, 2022 at 8:15 AM Masahiro Yamada <masahiroy@kernel.org> 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.
>
> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Thanks for your patch, which is now commit 6676e2cdd7c339dc ("kbuild:
use obj-y instead extra-y for objects placed at the head") in
next-20220916.
noreply@ellerman.id.au reported various build failures on m68k
since next-20220916, which I have bisected to the above commit:
m68k-linux-gnu-ld: warning: cannot find entry symbol _start;
defaulting to 0000000000001000
m68k-linux-gnu-ld: arch/m68k/kernel/setup.o: in function `setup_arch':
setup.c:(.init.text+0x2da): undefined reference to `availmem'
m68k-linux-gnu-ld: arch/m68k/kernel/early_printk.o: in function
`debug_cons_write':
early_printk.c:(.ref.text+0x28): undefined reference to `debug_cons_nputs'
m68k-linux-gnu-ld: arch/m68k/mm/init.o: in function `mem_init':
init.c:(.init.text+0x24): undefined reference to `kernel_pg_dir'
m68k-linux-gnu-ld: init.c:(.init.text+0x10): undefined reference to
`kernel_pg_dir'
m68k-linux-gnu-ld: init.c:(.init.text+0x1e): undefined reference to
`kernel_pg_dir'
m68k-linux-gnu-ld: arch/m68k/mm/motorola.o: in function `cache_page':
motorola.c:(.text+0xfc): undefined reference to `m68k_supervisor_cachemode'
m68k-linux-gnu-ld: arch/m68k/mm/motorola.o: in function `mmu_page_ctor':
motorola.c:(.text+0x162): undefined reference to `m68k_pgtable_cachemode'
m68k-linux-gnu-ld: arch/m68k/mm/motorola.o: in function `paging_init':
motorola.c:(.init.text+0x3d0): undefined reference to `kernel_pg_dir'
m68k-linux-gnu-ld: motorola.c:(.init.text+0x1d8): undefined reference
to `availmem'
m68k-linux-gnu-ld: motorola.c:(.init.text+0x32e): undefined reference
to `m68k_supervisor_cachemode'
m68k-linux-gnu-ld: motorola.c:(.init.text+0x3a6): undefined reference
to `kernel_pg_dir'
m68k-linux-gnu-ld: arch/m68k/q40/config.o: in function `q40_mem_console_write':
config.c:(.text+0x25c): undefined reference to `q40_mem_cptr'
m68k-linux-gnu-ld: config.c:(.text+0x254): undefined reference to `q40_mem_cptr'
m68k-linux-gnu-ld: arch/m68k/q40/config.o: in function `q40_debug_setup':
config.c:(.init.text+0x28): undefined reference to `q40_mem_cptr'
m68k-linux-gnu-ld: arch/m68k/mvme16x/config.o: in function `mvme16x_abort_int':
config.c:(.text+0x4): undefined reference to `mvme_bdid'
m68k-linux-gnu-ld: arch/m68k/mvme16x/config.o: in function `mvme16x_get_model':
config.c:(.text+0xc6): undefined reference to `mvme_bdid'
m68k-linux-gnu-ld: config.c:(.text+0xcc): undefined reference to `mvme_bdid'
m68k-linux-gnu-ld: config.c:(.text+0xe8): undefined reference to `mvme_bdid'
m68k-linux-gnu-ld: arch/m68k/mvme16x/config.o: in function
`mvme16x_get_hardware_list':
config.c:(.text+0x146): undefined reference to `mvme_bdid'
m68k-linux-gnu-ld: arch/m68k/mvme16x/config.o:config.c:(.text+0x1ce):
more undefined references to `mvme_bdid' follow
m68k-linux-gnu-ld: kernel/extable.o: in function `core_kernel_text':
extable.c:(.text+0x52): undefined reference to `_stext'
m68k-linux-gnu-ld: kernel/kallsyms.o: in function `is_ksym_addr':
kallsyms.c:(.text+0x28e): undefined reference to `_stext'
m68k-linux-gnu-ld: kernel/crash_core.o: in function
`crash_save_vmcoreinfo_init':
crash_core.c:(.init.text+0x4d8): undefined reference to `_stext'
m68k-linux-gnu-ld: crash_core.c:(.init.text+0x4c0): undefined
reference to `kernel_pg_dir'
m68k-linux-gnu-ld: mm/page_alloc.o: in function `mem_init_print_info':
page_alloc.c:(.init.text+0xfe4): undefined reference to `_stext'
m68k-linux-gnu-ld: page_alloc.c:(.init.text+0x103c): undefined
reference to `_stext'
m68k-linux-gnu-ld: mm/init-mm.o:(.data+0x24): undefined reference to
`kernel_pg_dir'
m68k-linux-gnu-ld: mm/usercopy.o: in function `__check_object_size':
usercopy.c:(.text+0x15a): undefined reference to `_stext'
make[1]: *** [Makefile:1175: vmlinux] Error 1
> ---
>
> (no changes since v1)
>
> Documentation/kbuild/makefiles.rst | 18 +----------------
> Makefile | 18 +++++++++++++----
> 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 | 21 ++++++++++----------
> 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 | 22 ++++++++++-----------
> 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, 87 insertions(+), 112 deletions(-)
>
> diff --git a/Documentation/kbuild/makefiles.rst b/Documentation/kbuild/makefiles.rst
> index 11a296e52d68..07c7e5a843c1 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 f9ee16bd212d..f2d06aaaefd3 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -1113,7 +1113,7 @@ clean-dirs := $(vmlinux-alldirs)
> export ARCH_CORE := $(core-y)
> export ARCH_DRIVERS := $(drivers-y)
> # Externally visible symbols (used by link-vmlinux.sh)
> -KBUILD_VMLINUX_OBJS := $(head-y) ./built-in.a
> +KBUILD_VMLINUX_OBJS := ./built-in.a
> KBUILD_VMLINUX_OBJS += $(addsuffix built-in.a, $(filter %/, $(libs-y)))
> ifdef CONFIG_MODULES
> KBUILD_VMLINUX_OBJS += $(patsubst %/, %/lib.a, $(filter %/, $(libs-y)))
> @@ -1122,7 +1122,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
> # used by scripts/Makefile.package
> export KBUILD_ALLDIRS := $(sort $(filter-out arch/%,$(vmlinux-alldirs)) LICENSES arch include scripts tools)
> @@ -1151,8 +1151,18 @@ quiet_cmd_autoksyms_h = GEN $@
> $(autoksyms_h):
> $(call cmd,autoksyms_h)
>
> +quiet_cmd_ar_vmlinux.a = AR $@
> + cmd_ar_vmlinux.a = \
> + rm -f $@; \
> + $(AR) cDPrST $@ $(KBUILD_VMLINUX_OBJS); \
> + $(AR) mPi $$($(AR) t $@ | head -n1) $@ $(head-y)
> +
> +targets += vmlinux.a
> +vmlinux.a: $(KBUILD_VMLINUX_OBJS) FORCE
> + $(call if_changed,ar_vmlinux.a)
> +
> targets += vmlinux.o
> -vmlinux.o: autoksyms_recursive $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
> +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)
> @@ -1909,7 +1919,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. (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..1755e6cd309f 100644
> --- a/arch/m68k/kernel/Makefile
> +++ b/arch/m68k/kernel/Makefile
> @@ -3,18 +3,19 @@
> # 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-$(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
>
> 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..f264d9b2cb63 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,12 +198,12 @@ 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
> +obj-$(CONFIG_PPC_OF_BOOT_TRAMPOLINE) += prom_init_check
>
> quiet_cmd_prom_init_check = PROMCHK $@
> cmd_prom_init_check = $(CONFIG_SHELL) $< "$(NM)" $(obj)/prom_init.o; touch $@
> 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 d7d3138c5ecc..4f74370ad1ee 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
>
--
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
On Mon, Sep 19, 2022 at 5:10 PM Geert Uytterhoeven <geert@linux-m68k.org> wrote: > > Hi Yamada-san, > > On Tue, Sep 6, 2022 at 8:15 AM Masahiro Yamada <masahiroy@kernel.org> 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. > > > > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Thanks for the report. I will squash the following: diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile index 1755e6cd309f..af015447dfb4 100644 --- a/arch/m68k/kernel/Makefile +++ b/arch/m68k/kernel/Makefile @@ -16,7 +16,7 @@ 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 += 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 -- Best Regards Masahiro Yamada
Hi Yamada-san,
On Mon, Sep 19, 2022 at 2:18 PM Masahiro Yamada <masahiroy@kernel.org> wrote:
> On Mon, Sep 19, 2022 at 5:10 PM Geert Uytterhoeven <geert@linux-m68k.org> wrote:
> > On Tue, Sep 6, 2022 at 8:15 AM Masahiro Yamada <masahiroy@kernel.org> 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.
> > >
> > > Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
>
> Thanks for the report.
>
> I will squash the following:
>
>
>
> diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile
> index 1755e6cd309f..af015447dfb4 100644
> --- a/arch/m68k/kernel/Makefile
> +++ b/arch/m68k/kernel/Makefile
> @@ -16,7 +16,7 @@ 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 += 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
Thank you, that fixed the build.
Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
© 2016 - 2026 Red Hat, Inc.