Эх сурвалжийг харах

kbuild: preprocess module linker script

There was a request to preprocess the module linker script like we
do for the vmlinux one. (https://lkml.org/lkml/2020/8/21/512)

The difference between vmlinux.lds and module.lds is that the latter
is needed for external module builds, thus must be cleaned up by
'make mrproper' instead of 'make clean'. Also, it must be created
by 'make modules_prepare'.

You cannot put it in arch/$(SRCARCH)/kernel/, which is cleaned up by
'make clean'. I moved arch/$(SRCARCH)/kernel/module.lds to
arch/$(SRCARCH)/include/asm/module.lds.h, which is included from
scripts/module.lds.S.

scripts/module.lds is fine because 'make clean' keeps all the
build artifacts under scripts/.

You can add arch-specific sections in <asm/module.lds.h>.

Signed-off-by: Masahiro Yamada <[email protected]>
Tested-by: Jessica Yu <[email protected]>
Acked-by: Will Deacon <[email protected]>
Acked-by: Geert Uytterhoeven <[email protected]>
Acked-by: Palmer Dabbelt <[email protected]>
Reviewed-by: Kees Cook <[email protected]>
Acked-by: Jessica Yu <[email protected]>
Masahiro Yamada 4 жил өмнө
parent
commit
596b0474d3

+ 6 - 4
Makefile

@@ -505,7 +505,6 @@ KBUILD_CFLAGS_KERNEL :=
 KBUILD_AFLAGS_MODULE  := -DMODULE
 KBUILD_AFLAGS_MODULE  := -DMODULE
 KBUILD_CFLAGS_MODULE  := -DMODULE
 KBUILD_CFLAGS_MODULE  := -DMODULE
 KBUILD_LDFLAGS_MODULE :=
 KBUILD_LDFLAGS_MODULE :=
-export KBUILD_LDS_MODULE := $(srctree)/scripts/module-common.lds
 KBUILD_LDFLAGS :=
 KBUILD_LDFLAGS :=
 CLANG_FLAGS :=
 CLANG_FLAGS :=
 
 
@@ -1395,7 +1394,7 @@ endif
 # using awk while concatenating to the final file.
 # using awk while concatenating to the final file.
 
 
 PHONY += modules
 PHONY += modules
-modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_check
+modules: $(if $(KBUILD_BUILTIN),vmlinux) modules_check modules_prepare
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 
 
 PHONY += modules_check
 PHONY += modules_check
@@ -1412,6 +1411,7 @@ targets += modules.order
 # Target to prepare building external modules
 # Target to prepare building external modules
 PHONY += modules_prepare
 PHONY += modules_prepare
 modules_prepare: prepare
 modules_prepare: prepare
+	$(Q)$(MAKE) $(build)=scripts scripts/module.lds
 
 
 # Target to install modules
 # Target to install modules
 PHONY += modules_install
 PHONY += modules_install
@@ -1743,7 +1743,9 @@ help:
 	@echo  '  clean           - remove generated files in module directory only'
 	@echo  '  clean           - remove generated files in module directory only'
 	@echo  ''
 	@echo  ''
 
 
-PHONY += prepare
+# no-op for external module builds
+PHONY += prepare modules_prepare
+
 endif # KBUILD_EXTMOD
 endif # KBUILD_EXTMOD
 
 
 # Single targets
 # Single targets
@@ -1776,7 +1778,7 @@ MODORDER := .modules.tmp
 endif
 endif
 
 
 PHONY += single_modpost
 PHONY += single_modpost
-single_modpost: $(single-no-ko)
+single_modpost: $(single-no-ko) modules_prepare
 	$(Q){ $(foreach m, $(single-ko), echo $(extmod-prefix)$m;) } > $(MODORDER)
 	$(Q){ $(foreach m, $(single-ko), echo $(extmod-prefix)$m;) } > $(MODORDER)
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 	$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
 
 

+ 0 - 4
arch/arm/Makefile

@@ -16,10 +16,6 @@ LDFLAGS_vmlinux	+= --be8
 KBUILD_LDFLAGS_MODULE	+= --be8
 KBUILD_LDFLAGS_MODULE	+= --be8
 endif
 endif
 
 
-ifeq ($(CONFIG_ARM_MODULE_PLTS),y)
-KBUILD_LDS_MODULE	+= $(srctree)/arch/arm/kernel/module.lds
-endif
-
 GZFLAGS		:=-9
 GZFLAGS		:=-9
 #KBUILD_CFLAGS	+=-pipe
 #KBUILD_CFLAGS	+=-pipe
 
 

+ 2 - 0
arch/arm/kernel/module.lds → arch/arm/include/asm/module.lds.h

@@ -1,5 +1,7 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 /* SPDX-License-Identifier: GPL-2.0 */
+#ifdef CONFIG_ARM_MODULE_PLTS
 SECTIONS {
 SECTIONS {
 	.plt : { BYTE(0) }
 	.plt : { BYTE(0) }
 	.init.plt : { BYTE(0) }
 	.init.plt : { BYTE(0) }
 }
 }
+#endif

+ 0 - 4
arch/arm64/Makefile

@@ -115,10 +115,6 @@ endif
 
 
 CHECKFLAGS	+= -D__aarch64__
 CHECKFLAGS	+= -D__aarch64__
 
 
-ifeq ($(CONFIG_ARM64_MODULE_PLTS),y)
-KBUILD_LDS_MODULE	+= $(srctree)/arch/arm64/kernel/module.lds
-endif
-
 ifeq ($(CONFIG_DYNAMIC_FTRACE_WITH_REGS),y)
 ifeq ($(CONFIG_DYNAMIC_FTRACE_WITH_REGS),y)
   KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
   KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
   CC_FLAGS_FTRACE := -fpatchable-function-entry=2
   CC_FLAGS_FTRACE := -fpatchable-function-entry=2

+ 2 - 0
arch/arm64/kernel/module.lds → arch/arm64/include/asm/module.lds.h

@@ -1,5 +1,7 @@
+#ifdef CONFIG_ARM64_MODULE_PLTS
 SECTIONS {
 SECTIONS {
 	.plt (NOLOAD) : { BYTE(0) }
 	.plt (NOLOAD) : { BYTE(0) }
 	.init.plt (NOLOAD) : { BYTE(0) }
 	.init.plt (NOLOAD) : { BYTE(0) }
 	.text.ftrace_trampoline (NOLOAD) : { BYTE(0) }
 	.text.ftrace_trampoline (NOLOAD) : { BYTE(0) }
 }
 }
+#endif

+ 0 - 1
arch/ia64/Makefile

@@ -20,7 +20,6 @@ CHECKFLAGS	+= -D__ia64=1 -D__ia64__=1 -D_LP64 -D__LP64__
 
 
 OBJCOPYFLAGS	:= --strip-all
 OBJCOPYFLAGS	:= --strip-all
 LDFLAGS_vmlinux	:= -static
 LDFLAGS_vmlinux	:= -static
-KBUILD_LDS_MODULE += $(srctree)/arch/ia64/module.lds
 KBUILD_AFLAGS_KERNEL := -mconstant-gp
 KBUILD_AFLAGS_KERNEL := -mconstant-gp
 EXTRA		:=
 EXTRA		:=
 
 

+ 0 - 0
arch/ia64/module.lds → arch/ia64/include/asm/module.lds.h


+ 0 - 1
arch/m68k/Makefile

@@ -75,7 +75,6 @@ KBUILD_CPPFLAGS += -D__uClinux__
 endif
 endif
 
 
 KBUILD_LDFLAGS := -m m68kelf
 KBUILD_LDFLAGS := -m m68kelf
-KBUILD_LDS_MODULE += $(srctree)/arch/m68k/kernel/module.lds
 
 
 ifdef CONFIG_SUN3
 ifdef CONFIG_SUN3
 LDFLAGS_vmlinux = -N
 LDFLAGS_vmlinux = -N

+ 0 - 0
arch/m68k/kernel/module.lds → arch/m68k/include/asm/module.lds.h


+ 0 - 1
arch/powerpc/Makefile

@@ -65,7 +65,6 @@ UTS_MACHINE := $(subst $(space),,$(machine-y))
 ifdef CONFIG_PPC32
 ifdef CONFIG_PPC32
 KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
 KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
 else
 else
-KBUILD_LDS_MODULE += $(srctree)/arch/powerpc/kernel/module.lds
 ifeq ($(call ld-ifversion, -ge, 225000000, y),y)
 ifeq ($(call ld-ifversion, -ge, 225000000, y),y)
 # Have the linker provide sfpr if possible.
 # Have the linker provide sfpr if possible.
 # There is a corresponding test in arch/powerpc/lib/Makefile
 # There is a corresponding test in arch/powerpc/lib/Makefile

+ 0 - 0
arch/powerpc/kernel/module.lds → arch/powerpc/include/asm/module.lds.h


+ 0 - 3
arch/riscv/Makefile

@@ -53,9 +53,6 @@ endif
 ifeq ($(CONFIG_CMODEL_MEDANY),y)
 ifeq ($(CONFIG_CMODEL_MEDANY),y)
 	KBUILD_CFLAGS += -mcmodel=medany
 	KBUILD_CFLAGS += -mcmodel=medany
 endif
 endif
-ifeq ($(CONFIG_MODULE_SECTIONS),y)
-	KBUILD_LDS_MODULE += $(srctree)/arch/riscv/kernel/module.lds
-endif
 ifeq ($(CONFIG_PERF_EVENTS),y)
 ifeq ($(CONFIG_PERF_EVENTS),y)
         KBUILD_CFLAGS += -fno-omit-frame-pointer
         KBUILD_CFLAGS += -fno-omit-frame-pointer
 endif
 endif

+ 2 - 1
arch/riscv/kernel/module.lds → arch/riscv/include/asm/module.lds.h

@@ -1,8 +1,9 @@
 /* SPDX-License-Identifier: GPL-2.0 */
 /* SPDX-License-Identifier: GPL-2.0 */
 /* Copyright (C) 2017 Andes Technology Corporation */
 /* Copyright (C) 2017 Andes Technology Corporation */
-
+#ifdef CONFIG_MODULE_SECTIONS
 SECTIONS {
 SECTIONS {
 	.plt (NOLOAD) : { BYTE(0) }
 	.plt (NOLOAD) : { BYTE(0) }
 	.got (NOLOAD) : { BYTE(0) }
 	.got (NOLOAD) : { BYTE(0) }
 	.got.plt (NOLOAD) : { BYTE(0) }
 	.got.plt (NOLOAD) : { BYTE(0) }
 }
 }
+#endif

+ 1 - 0
arch/um/include/asm/Kbuild

@@ -16,6 +16,7 @@ generic-y += kdebug.h
 generic-y += mcs_spinlock.h
 generic-y += mcs_spinlock.h
 generic-y += mm-arch-hooks.h
 generic-y += mm-arch-hooks.h
 generic-y += mmiowb.h
 generic-y += mmiowb.h
+generic-y += module.lds.h
 generic-y += param.h
 generic-y += param.h
 generic-y += pci.h
 generic-y += pci.h
 generic-y += percpu.h
 generic-y += percpu.h

+ 1 - 0
include/asm-generic/Kbuild

@@ -40,6 +40,7 @@ mandatory-y += mmiowb.h
 mandatory-y += mmu.h
 mandatory-y += mmu.h
 mandatory-y += mmu_context.h
 mandatory-y += mmu_context.h
 mandatory-y += module.h
 mandatory-y += module.h
+mandatory-y += module.lds.h
 mandatory-y += msi.h
 mandatory-y += msi.h
 mandatory-y += pci.h
 mandatory-y += pci.h
 mandatory-y += percpu.h
 mandatory-y += percpu.h

+ 10 - 0
include/asm-generic/module.lds.h

@@ -0,0 +1,10 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+#ifndef __ASM_GENERIC_MODULE_LDS_H
+#define __ASM_GENERIC_MODULE_LDS_H
+
+/*
+ * <asm/module.lds.h> can specify arch-specific sections for linking modules.
+ * Empty for the asm-generic header.
+ */
+
+#endif /* __ASM_GENERIC_MODULE_LDS_H */

+ 1 - 0
scripts/.gitignore

@@ -8,3 +8,4 @@ asn1_compiler
 extract-cert
 extract-cert
 sign-file
 sign-file
 insert-sys-cert
 insert-sys-cert
+/module.lds

+ 3 - 0
scripts/Makefile

@@ -29,6 +29,9 @@ endif
 # The following programs are only built on demand
 # The following programs are only built on demand
 hostprogs += unifdef
 hostprogs += unifdef
 
 
+# The module linker script is preprocessed on demand
+targets += module.lds
+
 subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
 subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
 subdir-$(CONFIG_MODVERSIONS) += genksyms
 subdir-$(CONFIG_MODVERSIONS) += genksyms
 subdir-$(CONFIG_SECURITY_SELINUX) += selinux
 subdir-$(CONFIG_SECURITY_SELINUX) += selinux

+ 2 - 3
scripts/Makefile.modfinal

@@ -33,11 +33,10 @@ quiet_cmd_ld_ko_o = LD [M]  $@
       cmd_ld_ko_o =                                                     \
       cmd_ld_ko_o =                                                     \
 	$(LD) -r $(KBUILD_LDFLAGS)					\
 	$(LD) -r $(KBUILD_LDFLAGS)					\
 		$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE)		\
 		$(KBUILD_LDFLAGS_MODULE) $(LDFLAGS_MODULE)		\
-		$(addprefix -T , $(KBUILD_LDS_MODULE))			\
-		-o $@ $(filter %.o, $^);				\
+		-T scripts/module.lds -o $@ $(filter %.o, $^);		\
 	$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
 	$(if $(ARCH_POSTLINK), $(MAKE) -f $(ARCH_POSTLINK) $@, true)
 
 
-$(modules): %.ko: %.o %.mod.o $(KBUILD_LDS_MODULE) FORCE
+$(modules): %.ko: %.o %.mod.o scripts/module.lds FORCE
 	+$(call if_changed,ld_ko_o)
 	+$(call if_changed,ld_ko_o)
 
 
 targets += $(modules) $(modules:.ko=.mod.o)
 targets += $(modules) $(modules:.ko=.mod.o)

+ 3 - 0
scripts/module-common.lds → scripts/module.lds.S

@@ -24,3 +24,6 @@ SECTIONS {
 
 
 	__jump_table		0 : ALIGN(8) { KEEP(*(__jump_table)) }
 	__jump_table		0 : ALIGN(8) { KEEP(*(__jump_table)) }
 }
 }
+
+/* bring in arch-specific sections */
+#include <asm/module.lds.h>

+ 1 - 1
scripts/package/builddeb

@@ -55,7 +55,7 @@ deploy_kernel_headers () {
 		cd $srctree
 		cd $srctree
 		find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
 		find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
 		find include scripts -type f -o -type l
 		find include scripts -type f -o -type l
-		find arch/$SRCARCH -name module.lds -o -name Kbuild.platforms -o -name Platform
+		find arch/$SRCARCH -name Kbuild.platforms -o -name Platform
 		find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f
 		find $(find arch/$SRCARCH -name include -o -name scripts -type d) -type f
 	) > debian/hdrsrcfiles
 	) > debian/hdrsrcfiles