mirror of
https://github.com/torvalds/linux.git
synced 2026-10-23 15:32:04 +02:00
mksysmap is a sed script consisting of 30 patterns which link-vmlinux.sh
uses to generate *.syms files, and which kallsyms is then called against to
generate *.kallsyms files, with the final vmlinux build ultimately
generating System.map.
For an x86-64 allmodconfig build, this involves three nm runs over a 250
MiB file and half a million lines written and read each time - 0.5s per
pass for llvm-nm, and 0.2s for GNU nm, with parsing on top of that.
This is unnecessary, instead have kallsyms simply read the ELF file
directly making use of the existing elf-parse library in scripts/.
This changes kallsyms such that its input is no longer the output from nm,
but rather an ELF file.
However, if the input file is empty, it outputs an empty table, which
retains the same behaviour on first pass that the build system expects.
System.map is byte-identical to nm | mksysmap for GNU nm and llvm-nm on
two x86 configurations each, and for llvm-nm on arm64, arm, s390 and
loongarch defconfigs, so are the kallsyms tables of every pass.
Relinking vmlinux, link steps included:
before after
allmodconfig clang 9.1s 7.9s
allmodconfig gcc 7.8s 7.6s
defconfig clang 3.7s 3.0s
defconfig gcc 3.5s 3.4s
Whole build, 128-thread Threadripper 9980X, best of N runs:
before after delta
-------------------------------
x86 defconfig, touch mm/vma.c, gcc 9.1s 8.6s -0.43s (-5%)
x86 defconfig, touch mm/vma.c, clang 9.0s 8.0s -1.1s (-12%)
x86 defconfig, clean, gcc 29.5s 28.9s -0.64s (-2%)
x86 defconfig, clean, clang 31.2s 29.8s -1.4s (-5%)
x86 allmodconfig, touch mm/vma.c, gcc 35.8s 35.0s -0.77s (-2%)
x86 allmodconfig, touch mm/vma.c, clang 35.8s 33.7s -2.0s (-6%)
Assisted-by: LLM
Signed-off-by: Lorenzo Stoakes (ARM) <ljs@kernel.org>
Link: https://patch.msgid.link/20260923-build-speedup-v4-8-73128809a4a4@kernel.org
Signed-off-by: Nathan Chancellor <nathan@kernel.org>
73 lines
2.6 KiB
Makefile
73 lines
2.6 KiB
Makefile
# SPDX-License-Identifier: GPL-2.0
|
|
###
|
|
# scripts contains sources for various helper programs used throughout
|
|
# the kernel for the build process.
|
|
|
|
hostprogs-always-y += kallsyms
|
|
hostprogs-always-$(BUILD_C_RECORDMCOUNT) += recordmcount
|
|
hostprogs-always-$(CONFIG_BUILDTIME_TABLE_SORT) += sorttable
|
|
hostprogs-always-$(CONFIG_ASN1) += asn1_compiler
|
|
hostprogs-always-$(CONFIG_MODULE_SIG_FORMAT) += sign-file
|
|
hostprogs-always-$(CONFIG_SYSTEM_EXTRA_CERTIFICATE) += insert-sys-cert
|
|
hostprogs-always-$(CONFIG_RUST_KERNEL_DOCTESTS) += rustdoc_test_builder
|
|
hostprogs-always-$(CONFIG_RUST_KERNEL_DOCTESTS) += rustdoc_test_gen
|
|
hostprogs-always-$(CONFIG_TRACEPOINTS) += tracepoint-update
|
|
|
|
kallsyms-objs := kallsyms.o kallsyms-sysmap.o elf-parse.o
|
|
sorttable-objs := sorttable.o elf-parse.o
|
|
tracepoint-update-objs := tracepoint-update.o elf-parse.o
|
|
|
|
ifneq ($(or $(CONFIG_X86_64),$(CONFIG_X86_32)),)
|
|
always-$(CONFIG_RUST) += target.json
|
|
filechk_rust_target = $< < include/config/auto.conf
|
|
|
|
$(obj)/target.json: scripts/generate_rust_target include/config/auto.conf FORCE
|
|
$(call filechk,rust_target)
|
|
endif
|
|
|
|
hostprogs += generate_rust_target
|
|
generate_rust_target-rust := y
|
|
rustdoc_test_builder-rust := y
|
|
rustdoc_test_gen-rust := y
|
|
|
|
HOSTCFLAGS_tracepoint-update.o = -I$(srctree)/tools/include
|
|
HOSTCFLAGS_kallsyms.o = -I$(srctree)/tools/include
|
|
HOSTCFLAGS_kallsyms-sysmap.o = -I$(srctree)/tools/include
|
|
HOSTCFLAGS_elf-parse.o = -I$(srctree)/tools/include
|
|
HOSTCFLAGS_sorttable.o = -I$(srctree)/tools/include
|
|
HOSTLDLIBS_sorttable = -lpthread
|
|
HOSTCFLAGS_asn1_compiler.o = -I$(srctree)/include
|
|
HOSTCFLAGS_sign-file.o = $(shell $(HOSTPKG_CONFIG) --cflags libcrypto 2> /dev/null)
|
|
HOSTCFLAGS_sign-file.o += -I$(srctree)/tools/include/uapi/
|
|
HOSTLDLIBS_sign-file = $(shell $(HOSTPKG_CONFIG) --libs libcrypto 2> /dev/null || echo -lcrypto)
|
|
|
|
ifdef CONFIG_UNWINDER_ORC
|
|
ifeq ($(ARCH),x86_64)
|
|
SRCARCH := x86
|
|
endif
|
|
ifeq ($(ARCH),loongarch)
|
|
SRCARCH := loongarch
|
|
endif
|
|
HOSTCFLAGS_sorttable.o += -I$(srctree)/tools/arch/$(SRCARCH)/include
|
|
HOSTCFLAGS_sorttable.o += -DUNWINDER_ORC_ENABLED
|
|
endif
|
|
|
|
ifdef CONFIG_BUILDTIME_MCOUNT_SORT
|
|
HOSTCFLAGS_sorttable.o += -DMCOUNT_SORT_ENABLED
|
|
endif
|
|
|
|
# The following programs are only built on demand
|
|
hostprogs += unifdef gen_packed_field_checks
|
|
|
|
# The module linker script is preprocessed on demand
|
|
targets += module.lds
|
|
|
|
subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
|
|
subdir-$(CONFIG_GENKSYMS) += genksyms
|
|
subdir-$(CONFIG_GENDWARFKSYMS) += gendwarfksyms
|
|
subdir-$(CONFIG_SECURITY_SELINUX) += selinux
|
|
subdir-$(CONFIG_SECURITY_IPE) += ipe
|
|
|
|
# Let clean descend into subdirs
|
|
subdir- += basic dtc gdb kconfig mod
|