@@ -1186,6 +1186,9 @@ quiet_cmd_autoksyms_h = GEN $@
$(autoksyms_h):
$(call cmd,autoksyms_h)
+$(KBUILD_LDS): prepare FORCE
+ $(Q)$(MAKE) $(build)=$(patsubst %/,%,$(dir $@)) $@
+
ARCH_POSTLINK := $(wildcard $(srctree)/arch/$(SRCARCH)/Makefile.postlink)
# Final link of vmlinux with optional arch pass after final link
@@ -1193,14 +1196,15 @@ 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 autoksyms_recursive $(KBUILD_LDS) \
+ $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE
+$(call if_changed,link-vmlinux)
targets := vmlinux
# The actual objects are generated when descending,
# make sure no implicit rule kicks in
-$(sort $(vmlinux-deps) $(subdir-modorder)): descend ;
+$(sort $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) $(subdir-modorder)): descend ;
filechk_kernel.release = \
echo "$(KERNELVERSION)$$($(CONFIG_SHELL) $(srctree)/scripts/setlocalversion $(srctree))"
@@ -3,7 +3,8 @@
# Makefile for the linux kernel.
#
-extra-y := head.o vmlinux.lds
+extra-y := head.o
+targets += vmlinux.lds
asflags-y := $(KBUILD_CFLAGS)
ccflags-y := -Wno-sign-compare
@@ -31,4 +31,5 @@ else
obj-y += ctx_sw_asm.o
endif
-extra-y := vmlinux.lds head.o
+targets += vmlinux.lds
+extra-y := head.o
@@ -106,4 +106,5 @@ endif
obj-$(CONFIG_HAVE_ARM_SMCCC) += smccc-call.o
-extra-y := $(head-y) vmlinux.lds
+extra-y := $(head-y)
+targets += vmlinux.lds
@@ -64,7 +64,8 @@ obj-$(CONFIG_COMPAT_VDSO) += vdso32-wrap.o
obj-y += probes/
head-y := head.o
-extra-y += $(head-y) vmlinux.lds
+extra-y += $(head-y)
+targets += vmlinux.lds
ifeq ($(CONFIG_DEBUG_EFI),y)
AFLAGS_head.o += -DVMLINUX_PATH="\"$(realpath $(objtree)/vmlinux)\""
@@ -1,5 +1,6 @@
# SPDX-License-Identifier: GPL-2.0-only
-extra-y := head.o vmlinux.lds
+extra-y := head.o
+targets += vmlinux.lds
obj-y += 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
@@ -3,7 +3,7 @@
# Makefile for the linux kernel.
#
-extra-y := vmlinux.lds
+targets += vmlinux.lds
obj-y := process.o traps.o ptrace.o \
signal.o setup.o syscalls.o \
@@ -1,5 +1,6 @@
# SPDX-License-Identifier: GPL-2.0
-extra-y := head.o vmlinux.lds
+extra-y := head.o
+targets += vmlinux.lds
obj-$(CONFIG_SMP) += smp.o
@@ -7,7 +7,8 @@ ifdef CONFIG_DYNAMIC_FTRACE
CFLAGS_REMOVE_ftrace.o = -pg
endif
-extra-y := head.o vmlinux.lds
+extra-y := head.o
+targets += vmlinux.lds
obj-y := entry.o efi.o efi_stub.o gate-data.o fsys.o ia64_ksyms.o irq.o irq_ia64.o \
irq_lsapic.o ivt.o pal.o patch.o process.o ptrace.o sal.o \
@@ -12,7 +12,7 @@ extra-$(CONFIG_HP300) := head.o
extra-$(CONFIG_Q40) := head.o
extra-$(CONFIG_SUN3X) := head.o
extra-$(CONFIG_SUN3) := sun3-head.o
-extra-y += vmlinux.lds
+targets += vmlinux.lds
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
@@ -12,7 +12,8 @@ CFLAGS_REMOVE_ftrace.o = -pg
CFLAGS_REMOVE_process.o = -pg
endif
-extra-y := head.o vmlinux.lds
+extra-y := head.o
+targets += vmlinux.lds
obj-y += dma.o exceptions.o \
hw_exception_handler.o irq.o \
@@ -3,7 +3,8 @@
# Makefile for the Linux/MIPS kernel.
#
-extra-y := head.o vmlinux.lds
+extra-y := head.o
+targets += vmlinux.lds
obj-y += 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 \
@@ -19,7 +19,8 @@ obj-$(CONFIG_OF) += devtree.o
obj-$(CONFIG_CACHE_L2) += atl2c.o
obj-$(CONFIG_PERF_EVENTS) += perf_event_cpu.o
obj-$(CONFIG_PM) += pm.o sleep.o
-extra-y := head.o vmlinux.lds
+extra-y := head.o
+targets += vmlinux.lds
CFLAGS_fpu.o += -mext-fpu-sp -mext-fpu-dp
@@ -4,7 +4,7 @@
#
extra-y += head.o
-extra-y += vmlinux.lds
+targets += vmlinux.lds
obj-y += cpuinfo.o
obj-y += entry.o
@@ -3,7 +3,8 @@
# Makefile for the linux kernel.
#
-extra-y := head.o vmlinux.lds
+extra-y := head.o
+targets += vmlinux.lds
obj-y := setup.o or32_ksyms.o process.o dma.o \
traps.o time.o irq.o entry.o ptrace.o signal.o \
@@ -3,7 +3,8 @@
# Makefile for arch/parisc/kernel
#
-extra-y := head.o vmlinux.lds
+extra-y := head.o
+targets += vmlinux.lds
obj-y := 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 \
@@ -101,7 +101,7 @@ 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
-extra-y += vmlinux.lds
+targets += vmlinux.lds
obj-$(CONFIG_RELOCATABLE) += reloc_$(BITS).o
@@ -10,7 +10,7 @@ CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE)
endif
extra-y += head.o
-extra-y += vmlinux.lds
+targets += vmlinux.lds
obj-y += soc.o
obj-y += cpu.o
@@ -42,7 +42,8 @@ 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
-extra-y += head64.o vmlinux.lds
+extra-y += head64.o
+targets += vmlinux.lds
obj-$(CONFIG_SYSFS) += nospec-sysfs.o
CFLAGS_REMOVE_nospec-branch.o += $(CC_FLAGS_EXPOLINE)
@@ -3,7 +3,8 @@
# Makefile for the Linux/SuperH kernel.
#
-extra-y := head_32.o vmlinux.lds
+extra-y := head_32.o
+targets += vmlinux.lds
ifdef CONFIG_FUNCTION_TRACER
# Do not profile debug and lowlevel utilities
@@ -12,7 +12,7 @@ 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)
-extra-y += vmlinux.lds
+targets += vmlinux.lds
ifdef CONFIG_FUNCTION_TRACER
# Do not profile debug and lowlevel utilities
@@ -12,7 +12,7 @@ CPPFLAGS_vmlinux.lds := -DSTART=$(LDS_START) \
-DELF_ARCH=$(LDS_ELF_ARCH) \
-DELF_FORMAT=$(LDS_ELF_FORMAT) \
$(LDS_EXTRA)
-extra-y := vmlinux.lds
+targets += vmlinux.lds
obj-y = config.o exec.o exitcode.o irq.o ksyms.o mem.o \
physmem.o process.o ptrace.o reboot.o sigio.o \
@@ -7,7 +7,7 @@ extra-y := head_$(BITS).o
extra-y += head$(BITS).o
extra-y += ebda.o
extra-y += platform-quirks.o
-extra-y += vmlinux.lds
+targets += vmlinux.lds
CPPFLAGS_vmlinux.lds += -U$(UTS_MACHINE)
@@ -3,7 +3,8 @@
# Makefile for the Linux/Xtensa kernel.
#
-extra-y := head.o vmlinux.lds
+extra-y := head.o
+targets += vmlinux.lds
obj-y := 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 \
@@ -62,12 +62,14 @@ ifndef obj
$(warning kbuild: Makefile.build is included improperly)
endif
+ifeq ($(filter-out %.mod, $(MAKECMDGOALS)),)
ifeq ($(need-modorder),)
ifneq ($(obj-m),)
$(warning $(patsubst %.o,'%.ko',$(obj-m)) will not be built even though obj-m is specified.)
$(warning You cannot use subdir-y/m to visit a module Makefile. Use obj-y/m instead.)
endif
endif
+endif
# ===========================================================================
This is a preparation for the CONFIG_TRIM_UNUSED_KSYMS improvement. In the new implementation of CONFIG_TRIM_UNUSED_KSYMS (next commit), unused export symbols will be trimmed at the link stage. Kbuild will need to traverse the tree to know which symbols are needed by modules. The list of sections that need linking shall be generated after the directory traverse, and included from vmlinux.lds.S and module.lds.S. The build rule of module.lds is already separated as modules_prepare. The build of vmlinux.lds must be delayed because such a list is not yet available while Kbuild is visiting arch/$(SRCARCH)/kernel/Makefile. Separate the build rule of vmlinux.lds, and invokes it from the top Makefile. I guarded the $(warning ) in scripts/Makefile.build, otherwise a false- positive warning would be displayed, for example when building ARCH=ia64 with CONFIG_IA64_PALINFO=m. Ideally, vmlinux.lds.S could be moved to a different directory, but I am just doing less-invasive changes for now. Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> --- (no changes since v1) Makefile | 8 ++++++-- arch/alpha/kernel/Makefile | 3 ++- arch/arc/kernel/Makefile | 3 ++- arch/arm/kernel/Makefile | 3 ++- arch/arm64/kernel/Makefile | 3 ++- arch/csky/kernel/Makefile | 3 ++- arch/h8300/kernel/Makefile | 2 +- arch/hexagon/kernel/Makefile | 3 ++- arch/ia64/kernel/Makefile | 3 ++- arch/m68k/kernel/Makefile | 2 +- arch/microblaze/kernel/Makefile | 3 ++- arch/mips/kernel/Makefile | 3 ++- arch/nds32/kernel/Makefile | 3 ++- arch/nios2/kernel/Makefile | 2 +- arch/openrisc/kernel/Makefile | 3 ++- arch/parisc/kernel/Makefile | 3 ++- arch/powerpc/kernel/Makefile | 2 +- arch/riscv/kernel/Makefile | 2 +- arch/s390/kernel/Makefile | 3 ++- arch/sh/kernel/Makefile | 3 ++- arch/sparc/kernel/Makefile | 2 +- arch/um/kernel/Makefile | 2 +- arch/x86/kernel/Makefile | 2 +- arch/xtensa/kernel/Makefile | 3 ++- scripts/Makefile.build | 2 ++ 25 files changed, 46 insertions(+), 25 deletions(-)