From patchwork Tue Mar 9 15:17:34 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 12125793 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id CD079C4332E for ; Tue, 9 Mar 2021 15:19:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 7F09265285 for ; Tue, 9 Mar 2021 15:19:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231844AbhCIPSy (ORCPT ); Tue, 9 Mar 2021 10:18:54 -0500 Received: from conuserg-09.nifty.com ([210.131.2.76]:31186 "EHLO conuserg-09.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231975AbhCIPS1 (ORCPT ); Tue, 9 Mar 2021 10:18:27 -0500 Received: from localhost.localdomain (133-32-232-101.west.xps.vectant.ne.jp [133.32.232.101]) (authenticated) by conuserg-09.nifty.com with ESMTP id 129FHiTd030658; Wed, 10 Mar 2021 00:17:45 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-09.nifty.com 129FHiTd030658 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1615303066; bh=aiZL314cCgH6pTtZI6W6PU8ZHJmV18CncdIR5eQC6Fg=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=sra+heZ7kORAq5P/K68lyyqZQjtoJfrhauSin9UyhFdvCwa+Uv+t+axs0pFsLm5b8 bGh6VqJWglTUDo8HgAm9AMN35eaiJPZmszccabI85+EkaolmClebLvyp6iyzk0H04b JZmGNVBXzibKH7jPIXFuupNDA8tnAu44RbGZVw+83cRKNwR5cEn7m6vH6vBTvyuAWQ h7pv8AQXjKYKzRQu6JP0O40PQTnmvGc2Xba8MUdrR0PiQD3bs4L5R5ktP9XLTS5CL0 BTHP0VaZP+2/MBfOmaoIgPJovzKqwumhLP7V00BoUPQgDMiMeEd+p7IuDsXVxfafHL DKU9LJGq/aHTA== X-Nifty-SrcIP: [133.32.232.101] From: Masahiro Yamada To: linux-kbuild@vger.kernel.org Cc: Christoph Hellwig , Linus Torvalds , Jessica Yu , Nicolas Pitre , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, Masahiro Yamada Subject: [PATCH v2 1/4] export.h: make __ksymtab_strings per-symbol section Date: Wed, 10 Mar 2021 00:17:34 +0900 Message-Id: <20210309151737.345722-2-masahiroy@kernel.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210309151737.345722-1-masahiroy@kernel.org> References: <20210309151737.345722-1-masahiroy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org The export symbol tables are placed on own sections (__ksymtab*+) and sorted by SORT (an alias of SORT_BY_NAME) because the module subsystem uses the binary search for symbol resolution. We did not have a good reason to do so for __ksymtab_strings, but now I have. To make CONFIG_TRIM_UNUSED_KSYMS work in one-pass, the linker needs to trim unused strings of symbols and namespaces. To allow per-symbol keep/drop choice, __ksymtab_strings must be placed on own sections. This keeps the string unification introduced by commit ce2b617ce8cb ("export.h: reduce __ksymtab_strings string duplication by using "MS" section flags"). For example, the empty namespaces share the same address. $ nm -n vmlinux [ snip ] ffffffff8233b6aa r __kstrtabns_IO_APIC_get_PCI_irq_vector ffffffff8233b6aa r __kstrtabns_I_BDEV ffffffff8233b6aa r __kstrtabns_LZ4_decompress_fast ffffffff8233b6aa r __kstrtabns_LZ4_decompress_fast_continue ffffffff8233b6aa r __kstrtabns_LZ4_decompress_fast_usingDict ... I confirmed no size change in vmlinux. Signed-off-by: Masahiro Yamada --- (no changes since v1) include/asm-generic/export.h | 2 +- include/asm-generic/vmlinux.lds.h | 2 +- include/linux/export.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/asm-generic/export.h b/include/asm-generic/export.h index 07a36a874dca..e847f1fde367 100644 --- a/include/asm-generic/export.h +++ b/include/asm-generic/export.h @@ -39,7 +39,7 @@ __ksymtab_\name: __put \val, __kstrtab_\name .previous - .section __ksymtab_strings,"aMS",%progbits,1 + .section __ksymtab_strings+\name,"aMS",%progbits,1 __kstrtab_\name: .asciz "\name" .previous diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 0331d5d49551..6ce6dcabdccf 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -513,7 +513,7 @@ \ /* Kernel symbol table: strings */ \ __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ - *(__ksymtab_strings) \ + *(__ksymtab_strings+*) \ } \ \ /* __*init sections */ \ diff --git a/include/linux/export.h b/include/linux/export.h index 6271a5d9c988..01e6ab19b226 100644 --- a/include/linux/export.h +++ b/include/linux/export.h @@ -99,7 +99,7 @@ struct kernel_symbol { extern const char __kstrtab_##sym[]; \ extern const char __kstrtabns_##sym[]; \ __CRC_SYMBOL(sym, sec); \ - asm(" .section \"__ksymtab_strings\",\"aMS\",%progbits,1 \n" \ + asm(" .section \"__ksymtab_strings+" #sym "\",\"aMS\",%progbits,1\n" \ "__kstrtab_" #sym ": \n" \ " .asciz \"" #sym "\" \n" \ "__kstrtabns_" #sym ": \n" \ From patchwork Tue Mar 9 15:17:35 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 12125789 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E6E49C433DB for ; Tue, 9 Mar 2021 15:19:27 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A418461581 for ; Tue, 9 Mar 2021 15:19:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231571AbhCIPSx (ORCPT ); Tue, 9 Mar 2021 10:18:53 -0500 Received: from conuserg-09.nifty.com ([210.131.2.76]:31189 "EHLO conuserg-09.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231970AbhCIPS1 (ORCPT ); Tue, 9 Mar 2021 10:18:27 -0500 Received: from localhost.localdomain (133-32-232-101.west.xps.vectant.ne.jp [133.32.232.101]) (authenticated) by conuserg-09.nifty.com with ESMTP id 129FHiTe030658; Wed, 10 Mar 2021 00:17:46 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-09.nifty.com 129FHiTe030658 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1615303067; bh=t1rH5CQV4/w2W/P91RtzZaEcWAJILvh5olFvUiyIaB8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=BCk+KmW23Gh7ruHIKtv3ocufi5qFN6fn39v5JP2L4fffRoB7BOMIKwWQfUZZmnezf uY+igHElwuITCS3W8lTk8Q62y6Lok77xib98JOG2toC21FB29ILb8LHhhJ+X1GihZg qSPa5+LoQ85Q0ZSREc54Yn6zf89pQM+cv4zkICynyoOepcc+dXESBnf/9fNLUSJOXx 8l83byF/3fpKYmZt2bnlGn4HguP8cJqALkk2R0E70wMnQ/i7rP5PR3qNLS5QvcSqhi tKc5XAXwkpv6iEpEvR3ZPqrj2UTvQ8nX7OLTP7++3DJdIxNdmF66zqRduUQsfNBZSr OPgmbRZtXS78A== X-Nifty-SrcIP: [133.32.232.101] From: Masahiro Yamada To: linux-kbuild@vger.kernel.org Cc: Christoph Hellwig , Linus Torvalds , Jessica Yu , Nicolas Pitre , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, Masahiro Yamada Subject: [PATCH v2 2/4] kbuild: separate out vmlinux.lds generation Date: Wed, 10 Mar 2021 00:17:35 +0900 Message-Id: <20210309151737.345722-3-masahiroy@kernel.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210309151737.345722-1-masahiroy@kernel.org> References: <20210309151737.345722-1-masahiroy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org 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 --- (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(-) diff --git a/Makefile b/Makefile index 31dcdb3d61fa..89862b9f45d7 100644 --- a/Makefile +++ b/Makefile @@ -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))" diff --git a/arch/alpha/kernel/Makefile b/arch/alpha/kernel/Makefile index 5a74581bf0ee..6e2baaebdee3 100644 --- a/arch/alpha/kernel/Makefile +++ b/arch/alpha/kernel/Makefile @@ -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 diff --git a/arch/arc/kernel/Makefile b/arch/arc/kernel/Makefile index 8c4fc4b54c14..0a06c018f0cd 100644 --- a/arch/arc/kernel/Makefile +++ b/arch/arc/kernel/Makefile @@ -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 diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile index ae295a3bcfef..7483916c034d 100644 --- a/arch/arm/kernel/Makefile +++ b/arch/arm/kernel/Makefile @@ -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 diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index ed65576ce710..32e530c22cba 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -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)\"" diff --git a/arch/csky/kernel/Makefile b/arch/csky/kernel/Makefile index 6c0f36010ed0..06acc85a2640 100644 --- a/arch/csky/kernel/Makefile +++ b/arch/csky/kernel/Makefile @@ -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 diff --git a/arch/h8300/kernel/Makefile b/arch/h8300/kernel/Makefile index 307aa51576dd..7ef912ee576f 100644 --- a/arch/h8300/kernel/Makefile +++ b/arch/h8300/kernel/Makefile @@ -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 \ diff --git a/arch/hexagon/kernel/Makefile b/arch/hexagon/kernel/Makefile index fae3dce32fde..9765301d2672 100644 --- a/arch/hexagon/kernel/Makefile +++ b/arch/hexagon/kernel/Makefile @@ -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 diff --git a/arch/ia64/kernel/Makefile b/arch/ia64/kernel/Makefile index 78717819131c..02575e838e7a 100644 --- a/arch/ia64/kernel/Makefile +++ b/arch/ia64/kernel/Makefile @@ -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 \ diff --git a/arch/m68k/kernel/Makefile b/arch/m68k/kernel/Makefile index dbac7f8743fc..b054f4198e63 100644 --- a/arch/m68k/kernel/Makefile +++ b/arch/m68k/kernel/Makefile @@ -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 diff --git a/arch/microblaze/kernel/Makefile b/arch/microblaze/kernel/Makefile index 15a20eb814ce..cdf98cbfcce9 100644 --- a/arch/microblaze/kernel/Makefile +++ b/arch/microblaze/kernel/Makefile @@ -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 \ diff --git a/arch/mips/kernel/Makefile b/arch/mips/kernel/Makefile index b4a57f1de772..f2e82faa06c4 100644 --- a/arch/mips/kernel/Makefile +++ b/arch/mips/kernel/Makefile @@ -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 \ diff --git a/arch/nds32/kernel/Makefile b/arch/nds32/kernel/Makefile index 394df3f6442c..ec061f18f00f 100644 --- a/arch/nds32/kernel/Makefile +++ b/arch/nds32/kernel/Makefile @@ -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 diff --git a/arch/nios2/kernel/Makefile b/arch/nios2/kernel/Makefile index 0b645e1e3158..1ec4be68462e 100644 --- a/arch/nios2/kernel/Makefile +++ b/arch/nios2/kernel/Makefile @@ -4,7 +4,7 @@ # extra-y += head.o -extra-y += vmlinux.lds +targets += vmlinux.lds obj-y += cpuinfo.o obj-y += entry.o diff --git a/arch/openrisc/kernel/Makefile b/arch/openrisc/kernel/Makefile index 2d172e79f58d..6be5c65ea3e9 100644 --- a/arch/openrisc/kernel/Makefile +++ b/arch/openrisc/kernel/Makefile @@ -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 \ diff --git a/arch/parisc/kernel/Makefile b/arch/parisc/kernel/Makefile index 068d90950d93..31e5109251aa 100644 --- a/arch/parisc/kernel/Makefile +++ b/arch/parisc/kernel/Makefile @@ -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 \ diff --git a/arch/powerpc/kernel/Makefile b/arch/powerpc/kernel/Makefile index 6084fa499aa3..c7576957f05a 100644 --- a/arch/powerpc/kernel/Makefile +++ b/arch/powerpc/kernel/Makefile @@ -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 diff --git a/arch/riscv/kernel/Makefile b/arch/riscv/kernel/Makefile index 3dc0abde988a..c74c495d4f56 100644 --- a/arch/riscv/kernel/Makefile +++ b/arch/riscv/kernel/Makefile @@ -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 diff --git a/arch/s390/kernel/Makefile b/arch/s390/kernel/Makefile index c97818a382f3..15d3ee771f22 100644 --- a/arch/s390/kernel/Makefile +++ b/arch/s390/kernel/Makefile @@ -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) diff --git a/arch/sh/kernel/Makefile b/arch/sh/kernel/Makefile index aa0fbc9202b1..e8384889f5f0 100644 --- a/arch/sh/kernel/Makefile +++ b/arch/sh/kernel/Makefile @@ -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 diff --git a/arch/sparc/kernel/Makefile b/arch/sparc/kernel/Makefile index d3a0e072ebe8..685669edb9f8 100644 --- a/arch/sparc/kernel/Makefile +++ b/arch/sparc/kernel/Makefile @@ -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 diff --git a/arch/um/kernel/Makefile b/arch/um/kernel/Makefile index 5aa882011e04..76eea4cc00f0 100644 --- a/arch/um/kernel/Makefile +++ b/arch/um/kernel/Makefile @@ -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 \ diff --git a/arch/x86/kernel/Makefile b/arch/x86/kernel/Makefile index 2ddf08351f0b..7d6fce044f97 100644 --- a/arch/x86/kernel/Makefile +++ b/arch/x86/kernel/Makefile @@ -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) diff --git a/arch/xtensa/kernel/Makefile b/arch/xtensa/kernel/Makefile index d4082c6a121b..79be7bfdf989 100644 --- a/arch/xtensa/kernel/Makefile +++ b/arch/xtensa/kernel/Makefile @@ -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 \ diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 1b6094a13034..7df96bfe694e 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -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 # =========================================================================== From patchwork Tue Mar 9 15:17:36 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 12125795 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 10D0BC43331 for ; Tue, 9 Mar 2021 15:19:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id D66D1652B6 for ; Tue, 9 Mar 2021 15:19:28 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231338AbhCIPSy (ORCPT ); Tue, 9 Mar 2021 10:18:54 -0500 Received: from conuserg-09.nifty.com ([210.131.2.76]:31505 "EHLO conuserg-09.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232009AbhCIPSs (ORCPT ); Tue, 9 Mar 2021 10:18:48 -0500 Received: from localhost.localdomain (133-32-232-101.west.xps.vectant.ne.jp [133.32.232.101]) (authenticated) by conuserg-09.nifty.com with ESMTP id 129FHiTf030658; Wed, 10 Mar 2021 00:17:47 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-09.nifty.com 129FHiTf030658 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1615303067; bh=REIckjyLxpZ8tXAYyGdiAhFqONKT/V3zE/ei2oQzpJM=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Kmrn9/WNzfcSGTgniONbuXlmXCSs+rv388XnQ1GaG7o21x8ZzLSt8QRdjWlfr1YTi FtM5lPlpFt2IGq3BG/6RKHDQtMWYkhbRd55pMtVn3pLrSoJkNoN/ry0cGgrf7yHm1U uwYguRCxHAS/QNnK++C9v8v5tywEqqyQSk3hbb4NFBA2ErnOPqq6GylTC58oyM6GE4 aukUuq+/pFqtH0pi6ke/yE079qjpJrge6li0+tvvfaP0SKhSzkqxTfxDM5Sh8sJGns NXz+9giY1cGiEUPMRdoZz2ns17ZCxvCFFYeSIN+Qc2UkJIC+0IqH0G085LME2NGkKh ggqQtJfa/Jtyw== X-Nifty-SrcIP: [133.32.232.101] From: Masahiro Yamada To: linux-kbuild@vger.kernel.org Cc: Christoph Hellwig , Linus Torvalds , Jessica Yu , Nicolas Pitre , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, Masahiro Yamada Subject: [PATCH v2 3/4] kbuild: re-implement CONFIG_TRIM_UNUSED_KSYMS to make it work in one-pass Date: Wed, 10 Mar 2021 00:17:36 +0900 Message-Id: <20210309151737.345722-4-masahiroy@kernel.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210309151737.345722-1-masahiroy@kernel.org> References: <20210309151737.345722-1-masahiroy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org Commit a555bdd0c58c ("Kbuild: enable TRIM_UNUSED_KSYMS again, with some guarding") re-enabled this feature, but Linus is still unhappy about the build time. The reason of the slowness is the recursion - this basically works in two loops. In the first loop, Kbuild builds the entire tree based on the temporary autoksyms.h, which contains macro defines to control whether their corresponding EXPORT_SYMBOL() is enabled or not, and also gathers all symbols required by modules. After the tree traverse, Kbuild updates autoksyms.h and triggers the second loop to rebuild source files whose EXPORT_SYMBOL() needs flipping. This commit re-implements CONFIG_TRIM_UNUSED_KSYMS to make it work in one pass. In the new design, unneeded EXPORT_SYMBOL() instances are trimmed by the linker instead of the preprocessor. After the tree traverse, a linker script snippet is generated. It feeds the list of necessary sections to vmlinus.lds.S and modules.lds.S. The other sections fall into /DISCARD/. Signed-off-by: Masahiro Yamada Acked-by: Nicolas Pitre Reported-by: kernel test robot --- Changes in v2: - Fix build errors - Add LC_ALL=C so the script will not be affected by the user's locale Makefile | 30 +++----- arch/arm64/kvm/hyp/nvhe/hyp.lds.S | 1 + arch/powerpc/kernel/vdso32/vdso32.lds.S | 1 + arch/powerpc/kernel/vdso64/vdso64.lds.S | 1 + arch/s390/purgatory/purgatory.lds.S | 1 + include/asm-generic/export.h | 23 ------ include/asm-generic/vmlinux.lds.h | 13 ++-- include/linux/export.h | 54 +++----------- include/linux/ksyms.lds.h | 22 ++++++ scripts/Makefile.build | 5 -- scripts/Makefile.lib | 1 + scripts/adjust_autoksyms.sh | 73 ------------------- .../{gen_autoksyms.sh => gen-keep-ksyms.sh} | 43 ++++++++--- scripts/gen_ksymdeps.sh | 25 ------- scripts/module.lds.S | 23 +++--- 15 files changed, 105 insertions(+), 211 deletions(-) create mode 100644 include/linux/ksyms.lds.h delete mode 100755 scripts/adjust_autoksyms.sh rename scripts/{gen_autoksyms.sh => gen-keep-ksyms.sh} (66%) delete mode 100755 scripts/gen_ksymdeps.sh diff --git a/Makefile b/Makefile index 89862b9f45d7..25a5c0c3fb7d 100644 --- a/Makefile +++ b/Makefile @@ -1162,29 +1162,23 @@ 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) +targets := -# Recurse until adjust_autoksyms.sh is satisfied -PHONY += autoksyms_recursive ifdef CONFIG_TRIM_UNUSED_KSYMS # For the kernel to actually contain only the needed exported symbols, # we have to build modules as well to determine what those symbols are. # (this can be evaluated only once include/config/auto.conf has been included) KBUILD_MODULES := 1 -autoksyms_recursive: descend modules.order - $(Q)$(CONFIG_SHELL) $(srctree)/scripts/adjust_autoksyms.sh \ - "$(MAKE) -f $(srctree)/Makefile vmlinux" -endif - -autoksyms_h := $(if $(CONFIG_TRIM_UNUSED_KSYMS), include/generated/autoksyms.h) +quiet_cmd_gen_used_ksyms = GEN $@ + cmd_gen_used_ksyms = $(CONFIG_SHELL) $(srctree)/scripts/gen-keep-ksyms.sh $< > $@ -quiet_cmd_autoksyms_h = GEN $@ - cmd_autoksyms_h = mkdir -p $(dir $@); \ - $(CONFIG_SHELL) $(srctree)/scripts/gen_autoksyms.sh $@ +include/generated/keep-ksyms.h: modules.order FORCE + $(call if_changed,gen_used_ksyms) +targets += include/generated/keep-ksyms.h -$(autoksyms_h): - $(call cmd,autoksyms_h) +$(KBUILD_LDS) modules_prepare: include/generated/keep-ksyms.h +endif $(KBUILD_LDS): prepare FORCE $(Q)$(MAKE) $(build)=$(patsubst %/,%,$(dir $@)) $@ @@ -1196,11 +1190,11 @@ 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 $(KBUILD_LDS) \ +vmlinux: scripts/link-vmlinux.sh $(KBUILD_LDS) \ $(KBUILD_VMLINUX_OBJS) $(KBUILD_VMLINUX_LIBS) FORCE +$(call if_changed,link-vmlinux) -targets := vmlinux +targets += vmlinux # The actual objects are generated when descending, # make sure no implicit rule kicks in @@ -1229,7 +1223,7 @@ scripts: scripts_basic scripts_dtc PHONY += prepare archprepare archprepare: outputmakefile archheaders archscripts scripts include/config/kernel.release \ - asm-generic $(version_h) $(autoksyms_h) include/generated/utsrelease.h \ + asm-generic $(version_h) include/generated/utsrelease.h \ include/generated/autoconf.h prepare0: archprepare @@ -1515,7 +1509,7 @@ endif # CONFIG_MODULES # make distclean Remove editor backup files, patch leftover files and the like # Directories & files removed with 'make clean' -CLEAN_FILES += include/ksym vmlinux.symvers \ +CLEAN_FILES += vmlinux.symvers \ modules.builtin modules.builtin.modinfo modules.nsdeps \ compile_commands.json .thinlto-cache diff --git a/arch/arm64/kvm/hyp/nvhe/hyp.lds.S b/arch/arm64/kvm/hyp/nvhe/hyp.lds.S index cd119d82d8e3..0b0407317756 100644 --- a/arch/arm64/kvm/hyp/nvhe/hyp.lds.S +++ b/arch/arm64/kvm/hyp/nvhe/hyp.lds.S @@ -6,6 +6,7 @@ * Linker script used for partial linking of nVHE EL2 object files. */ +#define NO_TRIM_KSYMS #include #include #include diff --git a/arch/powerpc/kernel/vdso32/vdso32.lds.S b/arch/powerpc/kernel/vdso32/vdso32.lds.S index a4b806b0d618..5c519a1e1538 100644 --- a/arch/powerpc/kernel/vdso32/vdso32.lds.S +++ b/arch/powerpc/kernel/vdso32/vdso32.lds.S @@ -3,6 +3,7 @@ * This is the infamous ld script for the 32 bits vdso * library */ +#define NO_TRIM_KSYMS #include #include #include diff --git a/arch/powerpc/kernel/vdso64/vdso64.lds.S b/arch/powerpc/kernel/vdso64/vdso64.lds.S index 2f3c359cacd3..cab126eff255 100644 --- a/arch/powerpc/kernel/vdso64/vdso64.lds.S +++ b/arch/powerpc/kernel/vdso64/vdso64.lds.S @@ -3,6 +3,7 @@ * This is the infamous ld script for the 64 bits vdso * library */ +#define NO_TRIM_KSYMS #include #include #include diff --git a/arch/s390/purgatory/purgatory.lds.S b/arch/s390/purgatory/purgatory.lds.S index 482eb4fbcef1..09c2d1544081 100644 --- a/arch/s390/purgatory/purgatory.lds.S +++ b/arch/s390/purgatory/purgatory.lds.S @@ -1,5 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0 */ +#define NO_TRIM_KSYMS #include OUTPUT_FORMAT("elf64-s390", "elf64-s390", "elf64-s390") diff --git a/include/asm-generic/export.h b/include/asm-generic/export.h index e847f1fde367..b9be5b1dd7e6 100644 --- a/include/asm-generic/export.h +++ b/include/asm-generic/export.h @@ -57,30 +57,7 @@ __kstrtab_\name: #endif .endm -#if defined(CONFIG_TRIM_UNUSED_KSYMS) - -#include -#include - -.macro __ksym_marker sym - .section ".discard.ksym","a" -__ksym_marker_\sym: - .previous -.endm - -#define __EXPORT_SYMBOL(sym, val, sec) \ - __ksym_marker sym; \ - __cond_export_sym(sym, val, sec, __is_defined(__KSYM_##sym)) -#define __cond_export_sym(sym, val, sec, conf) \ - ___cond_export_sym(sym, val, sec, conf) -#define ___cond_export_sym(sym, val, sec, enabled) \ - __cond_export_sym_##enabled(sym, val, sec) -#define __cond_export_sym_1(sym, val, sec) ___EXPORT_SYMBOL sym, val, sec -#define __cond_export_sym_0(sym, val, sec) /* nothing */ - -#else #define __EXPORT_SYMBOL(sym, val, sec) ___EXPORT_SYMBOL sym, val, sec -#endif #define EXPORT_SYMBOL(name) \ __EXPORT_SYMBOL(name, KSYM_FUNC(name),) diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h index 6ce6dcabdccf..a2c2eb6f70ea 100644 --- a/include/asm-generic/vmlinux.lds.h +++ b/include/asm-generic/vmlinux.lds.h @@ -50,6 +50,8 @@ * [__nosave_begin, __nosave_end] for the nosave data */ +#include + #ifndef LOAD_OFFSET #define LOAD_OFFSET 0 #endif @@ -486,34 +488,34 @@ /* Kernel symbol table: Normal symbols */ \ __ksymtab : AT(ADDR(__ksymtab) - LOAD_OFFSET) { \ __start___ksymtab = .; \ - KEEP(*(SORT(___ksymtab+*))) \ + KSYMTAB \ __stop___ksymtab = .; \ } \ \ /* Kernel symbol table: GPL-only symbols */ \ __ksymtab_gpl : AT(ADDR(__ksymtab_gpl) - LOAD_OFFSET) { \ __start___ksymtab_gpl = .; \ - KEEP(*(SORT(___ksymtab_gpl+*))) \ + KSYMTAB_GPL \ __stop___ksymtab_gpl = .; \ } \ \ /* Kernel symbol table: Normal symbols */ \ __kcrctab : AT(ADDR(__kcrctab) - LOAD_OFFSET) { \ __start___kcrctab = .; \ - KEEP(*(SORT(___kcrctab+*))) \ + KCRCTAB \ __stop___kcrctab = .; \ } \ \ /* Kernel symbol table: GPL-only symbols */ \ __kcrctab_gpl : AT(ADDR(__kcrctab_gpl) - LOAD_OFFSET) { \ __start___kcrctab_gpl = .; \ - KEEP(*(SORT(___kcrctab_gpl+*))) \ + KCRCTAB_GPL \ __stop___kcrctab_gpl = .; \ } \ \ /* Kernel symbol table: strings */ \ __ksymtab_strings : AT(ADDR(__ksymtab_strings) - LOAD_OFFSET) { \ - *(__ksymtab_strings+*) \ + KSYMTAB_STRINGS \ } \ \ /* __*init sections */ \ @@ -999,6 +1001,7 @@ /DISCARD/ : { \ EXIT_DISCARDS \ EXIT_CALL \ + KSYM_DISCARDS \ COMMON_DISCARDS \ } diff --git a/include/linux/export.h b/include/linux/export.h index 01e6ab19b226..f9cc13cd2c8c 100644 --- a/include/linux/export.h +++ b/include/linux/export.h @@ -76,9 +76,18 @@ struct kernel_symbol { }; #endif -#ifdef __GENKSYMS__ +#if !defined(CONFIG_MODULES) || defined(__DISABLE_EXPORTS) + +/* + * Allow symbol exports to be disabled completely so that C code may + * be reused in other execution contexts such as the UEFI stub or the + * decompressor. + */ +#define __EXPORT_SYMBOL(sym, sec, ns) + +#elif defined(__GENKSYMS__) -#define ___EXPORT_SYMBOL(sym, sec, ns) __GENKSYMS_EXPORT_SYMBOL(sym) +#define __EXPORT_SYMBOL(sym, sec, ns) __GENKSYMS_EXPORT_SYMBOL(sym) #else @@ -94,7 +103,7 @@ struct kernel_symbol { * section flag requires it. Use '%progbits' instead of '@progbits' since the * former apparently works on all arches according to the binutils source. */ -#define ___EXPORT_SYMBOL(sym, sec, ns) \ +#define __EXPORT_SYMBOL(sym, sec, ns) \ extern typeof(sym) sym; \ extern const char __kstrtab_##sym[]; \ extern const char __kstrtabns_##sym[]; \ @@ -107,45 +116,6 @@ struct kernel_symbol { " .previous \n"); \ __KSYMTAB_ENTRY(sym, sec) -#endif - -#if !defined(CONFIG_MODULES) || defined(__DISABLE_EXPORTS) - -/* - * Allow symbol exports to be disabled completely so that C code may - * be reused in other execution contexts such as the UEFI stub or the - * decompressor. - */ -#define __EXPORT_SYMBOL(sym, sec, ns) - -#elif defined(CONFIG_TRIM_UNUSED_KSYMS) - -#include - -/* - * For fine grained build dependencies, we want to tell the build system - * about each possible exported symbol even if they're not actually exported. - * We use a symbol pattern __ksym_marker_ that the build system filters - * from the $(NM) output (see scripts/gen_ksymdeps.sh). These symbols are - * discarded in the final link stage. - */ -#define __ksym_marker(sym) \ - static int __ksym_marker_##sym[0] __section(".discard.ksym") __used - -#define __EXPORT_SYMBOL(sym, sec, ns) \ - __ksym_marker(sym); \ - __cond_export_sym(sym, sec, ns, __is_defined(__KSYM_##sym)) -#define __cond_export_sym(sym, sec, ns, conf) \ - ___cond_export_sym(sym, sec, ns, conf) -#define ___cond_export_sym(sym, sec, ns, enabled) \ - __cond_export_sym_##enabled(sym, sec, ns) -#define __cond_export_sym_1(sym, sec, ns) ___EXPORT_SYMBOL(sym, sec, ns) -#define __cond_export_sym_0(sym, sec, ns) /* nothing */ - -#else - -#define __EXPORT_SYMBOL(sym, sec, ns) ___EXPORT_SYMBOL(sym, sec, ns) - #endif /* CONFIG_MODULES */ #ifdef DEFAULT_SYMBOL_NAMESPACE diff --git a/include/linux/ksyms.lds.h b/include/linux/ksyms.lds.h new file mode 100644 index 000000000000..fdb7a04053b0 --- /dev/null +++ b/include/linux/ksyms.lds.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef __KSYMS_LDS_H +#define __KSYMS_LDS_H + +#if defined(CONFIG_TRIM_UNUSED_KSYMS) && !defined(NO_TRIM_KSYMS) +#include + +#define KSYM_DISCARDS *(___ksymtab+*) \ + *(___ksymtab_gpl+*) \ + *(___kcrctab+*) \ + *(___kcrctab_gpl+*) \ + *(__ksymtab_strings+*) +#else +#define KSYMTAB KEEP(*(SORT(___ksymtab+*))) +#define KSYMTAB_GPL KEEP(*(SORT(___ksymtab_gpl+*))) +#define KCRCTAB KEEP(*(SORT(___kcrctab+*))) +#define KCRCTAB_GPL KEEP(*(SORT(___kcrctab_gpl+*))) +#define KSYMTAB_STRINGS *(__ksymtab_strings+*) +#define KSYM_DISCARDS +#endif + +#endif /* __KSYMS_LDS_H */ diff --git a/scripts/Makefile.build b/scripts/Makefile.build index 7df96bfe694e..71ffe1d06265 100644 --- a/scripts/Makefile.build +++ b/scripts/Makefile.build @@ -244,16 +244,12 @@ objtool_dep = $(objtool_obj) \ include/config/stack/validation.h) ifdef CONFIG_TRIM_UNUSED_KSYMS -cmd_gen_ksymdeps = \ - $(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd - # List module undefined symbols undefined_syms = $(NM) $< | $(AWK) '$$1 == "U" { printf("%s%s", x++ ? " " : "", $$2) }'; endif define rule_cc_o_c $(call cmd_and_fixdep,cc_o_c) - $(call cmd,gen_ksymdeps) $(call cmd,checksrc) $(call cmd,checkdoc) $(call cmd,objtool) @@ -263,7 +259,6 @@ endef define rule_as_o_S $(call cmd_and_fixdep,as_o_S) - $(call cmd,gen_ksymdeps) $(call cmd,objtool) $(call cmd,modversions_S) endef diff --git a/scripts/Makefile.lib b/scripts/Makefile.lib index eee59184de64..f3da140191fb 100644 --- a/scripts/Makefile.lib +++ b/scripts/Makefile.lib @@ -311,6 +311,7 @@ DTC_FLAGS += $(DTC_FLAGS_$(basetarget)) quiet_cmd_dt_S_dtb= DTB $@ cmd_dt_S_dtb= \ { \ + echo '\#define NO_TRIM_KSYMS'; \ echo '\#include '; \ echo '.section .dtb.init.rodata,"a"'; \ echo '.balign STRUCT_ALIGNMENT'; \ diff --git a/scripts/adjust_autoksyms.sh b/scripts/adjust_autoksyms.sh deleted file mode 100755 index d8f6f9c63043..000000000000 --- a/scripts/adjust_autoksyms.sh +++ /dev/null @@ -1,73 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0-only - -# Script to update include/generated/autoksyms.h and dependency files -# -# Copyright: (C) 2016 Linaro Limited -# Created by: Nicolas Pitre, January 2016 -# - -# Update the include/generated/autoksyms.h file. -# -# For each symbol being added or removed, the corresponding dependency -# file's timestamp is updated to force a rebuild of the affected source -# file. All arguments passed to this script are assumed to be a command -# to be exec'd to trigger a rebuild of those files. - -set -e - -cur_ksyms_file="include/generated/autoksyms.h" -new_ksyms_file="include/generated/autoksyms.h.tmpnew" - -info() { - if [ "$quiet" != "silent_" ]; then - printf " %-7s %s\n" "$1" "$2" - fi -} - -info "CHK" "$cur_ksyms_file" - -# Use "make V=1" to debug this script. -case "$KBUILD_VERBOSE" in -*1*) - set -x - ;; -esac - -# Generate a new symbol list file -$CONFIG_SHELL $srctree/scripts/gen_autoksyms.sh "$new_ksyms_file" - -# Extract changes between old and new list and touch corresponding -# dependency files. -changed=$( -count=0 -sort "$cur_ksyms_file" "$new_ksyms_file" | uniq -u | -sed -n 's/^#define __KSYM_\(.*\) 1/\1/p' | tr "A-Z_" "a-z/" | -while read sympath; do - if [ -z "$sympath" ]; then continue; fi - depfile="include/ksym/${sympath}.h" - mkdir -p "$(dirname "$depfile")" - touch "$depfile" - # Filesystems with coarse time precision may create timestamps - # equal to the one from a file that was very recently built and that - # needs to be rebuild. Let's guard against that by making sure our - # dep files are always newer than the first file we created here. - while [ ! "$depfile" -nt "$new_ksyms_file" ]; do - touch "$depfile" - done - echo $((count += 1)) -done | tail -1 ) -changed=${changed:-0} - -if [ $changed -gt 0 ]; then - # Replace the old list with tne new one - old=$(grep -c "^#define __KSYM_" "$cur_ksyms_file" || true) - new=$(grep -c "^#define __KSYM_" "$new_ksyms_file" || true) - info "KSYMS" "symbols: before=$old, after=$new, changed=$changed" - info "UPD" "$cur_ksyms_file" - mv -f "$new_ksyms_file" "$cur_ksyms_file" - # Then trigger a rebuild of affected source files - exec $@ -else - rm -f "$new_ksyms_file" -fi diff --git a/scripts/gen_autoksyms.sh b/scripts/gen-keep-ksyms.sh similarity index 66% rename from scripts/gen_autoksyms.sh rename to scripts/gen-keep-ksyms.sh index da320151e7c3..306e9b88aae9 100755 --- a/scripts/gen_autoksyms.sh +++ b/scripts/gen-keep-ksyms.sh @@ -1,13 +1,23 @@ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-only -# Create an autoksyms.h header file from the list of all module's needed symbols -# as recorded on the second line of *.mod files and the user-provided symbol -# whitelist. - set -e -output_file="$1" +modlist=$1 + +emit () +{ + local macro="$1" + local prefix="$2" + local syms="$3" + + echo "#define $macro \\" + for s in $syms + do + echo " KEEP(*($prefix$s)) \\" + done + echo +} # Use "make V=1" to debug this script. case "$KBUILD_VERBOSE" in @@ -51,15 +61,14 @@ fi # Generate a new ksym list file with symbols needed by the current # set of modules. -cat > "$output_file" << EOT +cat << EOF /* * Automatically generated file; DO NOT EDIT. */ -EOT - -[ -f modules.order ] && modlist=modules.order || modlist=/dev/null +EOF +syms=$( { sed 's/ko$/mod/' $modlist | xargs -n1 sed -n -e '2p' echo "$needed_symbols" @@ -68,5 +77,17 @@ EOT # Remove the dot prefix for ppc64; symbol names with a dot (.) hold entry # point addresses. sed -e 's/^\.//' | -sort -u | -sed -e 's/\(.*\)/#define __KSYM_\1 1/' >> "$output_file" +# Sorting is essential because the module subsystem uses binary search for +# symbol resolution. For CONFIG_TRIM_UNUSED_KSYMS=n, this is done by the +# linker's SORT command (an alias of SORT_BY_NAME). For CONFIG_TRIM_UNUSED=y, +# symbols are linked in the same order as this script outputs. +# Add LC_ALL=C to make it work irrespective of the build environment. +LC_ALL=C sort -u | +sed -e 's/\(.*\)/\1/' +) + +emit "KSYMTAB" "___ksymtab+" "$syms" +emit "KSYMTAB_GPL" "___ksymtab_gpl+" "$syms" +emit "KCRCTAB" "___kcrctab_gpl+" "$syms" +emit "KCRCTAB_GPL" "___kcrctab_gpl+" "$syms" +emit "KSYMTAB_STRINGS" "__ksymtab_strings+" "$syms" diff --git a/scripts/gen_ksymdeps.sh b/scripts/gen_ksymdeps.sh deleted file mode 100755 index 1324986e1362..000000000000 --- a/scripts/gen_ksymdeps.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/sh -# SPDX-License-Identifier: GPL-2.0 - -set -e - -# List of exported symbols -ksyms=$($NM $1 | sed -n 's/.*__ksym_marker_\(.*\)/\1/p' | tr A-Z a-z) - -if [ -z "$ksyms" ]; then - exit 0 -fi - -echo -echo "ksymdeps_$1 := \\" - -for s in $ksyms -do - echo $s | sed -e 's:^_*: $(wildcard include/ksym/:' \ - -e 's:__*:/:g' -e 's/$/.h) \\/' -done - -echo -echo "$1: \$(ksymdeps_$1)" -echo -echo "\$(ksymdeps_$1):" diff --git a/scripts/module.lds.S b/scripts/module.lds.S index 168cd27e6122..ab96471141f0 100644 --- a/scripts/module.lds.S +++ b/scripts/module.lds.S @@ -3,16 +3,15 @@ * Archs are free to supply their own linker scripts. ld will * combine them automatically. */ -SECTIONS { - /DISCARD/ : { - *(.discard) - *(.discard.*) - } - __ksymtab 0 : { *(SORT(___ksymtab+*)) } - __ksymtab_gpl 0 : { *(SORT(___ksymtab_gpl+*)) } - __kcrctab 0 : { *(SORT(___kcrctab+*)) } - __kcrctab_gpl 0 : { *(SORT(___kcrctab_gpl+*)) } +#include + +SECTIONS { + __ksymtab 0 : { KSYMTAB } + __ksymtab_gpl 0 : { KSYMTAB_GPL } + __kcrctab 0 : { KCRCTAB } + __kcrctab_gpl 0 : { KCRCTAB_GPL } + __ksymtab_strings 0 : { KSYMTAB_STRINGS } .init_array 0 : ALIGN(8) { *(SORT(.init_array.*)) *(.init_array) } @@ -41,6 +40,12 @@ SECTIONS { } .text : { *(.text .text.[0-9a-zA-Z_]*) } + + /DISCARD/ : { + *(.discard) + *(.discard.*) + KSYM_DISCARDS + } } /* bring in arch-specific sections */ From patchwork Tue Mar 9 15:17:37 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Masahiro Yamada X-Patchwork-Id: 12125791 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.0 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 22604C43381 for ; Tue, 9 Mar 2021 15:19:28 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id E1C5765295 for ; Tue, 9 Mar 2021 15:19:27 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231673AbhCIPSx (ORCPT ); Tue, 9 Mar 2021 10:18:53 -0500 Received: from conuserg-09.nifty.com ([210.131.2.76]:31185 "EHLO conuserg-09.nifty.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231969AbhCIPS1 (ORCPT ); Tue, 9 Mar 2021 10:18:27 -0500 Received: from localhost.localdomain (133-32-232-101.west.xps.vectant.ne.jp [133.32.232.101]) (authenticated) by conuserg-09.nifty.com with ESMTP id 129FHiTg030658; Wed, 10 Mar 2021 00:17:48 +0900 DKIM-Filter: OpenDKIM Filter v2.10.3 conuserg-09.nifty.com 129FHiTg030658 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nifty.com; s=dec2015msa; t=1615303068; bh=r71y+AUxa/wzY3HGAOw/Hv/yHZgfi9z2nUjKyYbaVPA=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=LMkdLWh09zNrqCExiZIrv2+lAjaz1szHIzNg9/P1CO9bSo+j7dkJMWRIBYTFGFeGm qHKYGyY34FJ7TRep/rJ14p5DXgyWSQC6ZSwepbsuoEmmhDbTEKNAz4yh6zIFUOu9h3 tkEB6MAkPz/OezTrodwJObCLE9qxo+/1jNKWn2UgkjhUlIh4iwLcBIzOX33cq/U2Nd ZOfKT8fGYy2SAd9YxogBXawByyIqPb3FtWXmvjToiohKCKghEA4Sj7Qae+kK+3U6d5 9QJifDrC3u4TLGOYEyAfxZMtuhHuwLdLYsKo9u0pH+WWBgWbxkTzZN2bROoXy2rhhF 74ZvJW1JbCzjA== X-Nifty-SrcIP: [133.32.232.101] From: Masahiro Yamada To: linux-kbuild@vger.kernel.org Cc: Christoph Hellwig , Linus Torvalds , Jessica Yu , Nicolas Pitre , linux-kernel@vger.kernel.org, linux-arch@vger.kernel.org, Masahiro Yamada Subject: [PATCH v2 4/4] kbuild: remove guarding from TRIM_UNUSED_KSYMS Date: Wed, 10 Mar 2021 00:17:37 +0900 Message-Id: <20210309151737.345722-5-masahiroy@kernel.org> X-Mailer: git-send-email 2.27.0 In-Reply-To: <20210309151737.345722-1-masahiroy@kernel.org> References: <20210309151737.345722-1-masahiroy@kernel.org> MIME-Version: 1.0 Precedence: bulk List-ID: X-Mailing-List: linux-kbuild@vger.kernel.org Now that the build time cost of this option is unnoticeable level, revert the following two: a555bdd0c58c ("Kbuild: enable TRIM_UNUSED_KSYMS again, with some guarding") 5cf0fd591f2e ("Kbuild: disable TRIM_UNUSED_KSYMS option") Signed-off-by: Masahiro Yamada Reported-by: kernel test robot --- Changes in v2: - New patch init/Kconfig | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/init/Kconfig b/init/Kconfig index 22946fe5ded9..0cbdc20b9322 100644 --- a/init/Kconfig +++ b/init/Kconfig @@ -2265,8 +2265,7 @@ config MODULE_ALLOW_MISSING_NAMESPACE_IMPORTS If unsure, say N. config TRIM_UNUSED_KSYMS - bool "Trim unused exported kernel symbols" if EXPERT - depends on !COMPILE_TEST + bool "Trim unused exported kernel symbols" help The kernel and some modules make many symbols available for other modules to use via EXPORT_SYMBOL() and variants. Depending