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 <masahiroy@kernel.org> Tested-by: Jessica Yu <jeyu@kernel.org> Acked-by: Will Deacon <will@kernel.org> Acked-by: Geert Uytterhoeven <geert@linux-m68k.org> Acked-by: Palmer Dabbelt <palmerdabbelt@google.com> Reviewed-by: Kees Cook <keescook@chromium.org> Acked-by: Jessica Yu <jeyu@kernel.org>
This commit is contained in:
parent
887af6d7c9
commit
596b0474d3
10
Makefile
10
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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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 :=
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
|
@ -8,3 +8,4 @@ asn1_compiler
|
||||||
extract-cert
|
extract-cert
|
||||||
sign-file
|
sign-file
|
||||||
insert-sys-cert
|
insert-sys-cert
|
||||||
|
/module.lds
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)) \
|
-T scripts/module.lds -o $@ $(filter %.o, $^); \
|
||||||
-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)
|
||||||
|
|
|
@ -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>
|
|
@ -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
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue