2020-09-08 04:32:02

by Masahiro Yamada

[permalink] [raw]
Subject: [PATCH v2] 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]>
---

Changes in v2:
- Fix the race between the two targets 'scripts' and 'asm-generic'

Makefile | 10 ++++++----
arch/arm/Makefile | 4 ----
.../{kernel/module.lds => include/asm/module.lds.h} | 2 ++
arch/arm64/Makefile | 4 ----
.../{kernel/module.lds => include/asm/module.lds.h} | 2 ++
arch/ia64/Makefile | 1 -
arch/ia64/{module.lds => include/asm/module.lds.h} | 0
arch/m68k/Makefile | 1 -
.../{kernel/module.lds => include/asm/module.lds.h} | 0
arch/powerpc/Makefile | 1 -
.../{kernel/module.lds => include/asm/module.lds.h} | 0
arch/riscv/Makefile | 3 ---
.../{kernel/module.lds => include/asm/module.lds.h} | 3 ++-
arch/um/include/asm/Kbuild | 1 +
include/asm-generic/Kbuild | 1 +
include/asm-generic/module.lds.h | 10 ++++++++++
scripts/.gitignore | 1 +
scripts/Makefile | 3 +++
scripts/Makefile.modfinal | 5 ++---
scripts/{module-common.lds => module.lds.S} | 3 +++
scripts/package/builddeb | 2 +-
21 files changed, 34 insertions(+), 23 deletions(-)
rename arch/arm/{kernel/module.lds => include/asm/module.lds.h} (72%)
rename arch/arm64/{kernel/module.lds => include/asm/module.lds.h} (76%)
rename arch/ia64/{module.lds => include/asm/module.lds.h} (100%)
rename arch/m68k/{kernel/module.lds => include/asm/module.lds.h} (100%)
rename arch/powerpc/{kernel/module.lds => include/asm/module.lds.h} (100%)
rename arch/riscv/{kernel/module.lds => include/asm/module.lds.h} (84%)
create mode 100644 include/asm-generic/module.lds.h
rename scripts/{module-common.lds => module.lds.S} (93%)

diff --git a/Makefile b/Makefile
index 37739ee53f27..97b1dae1783b 100644
--- a/Makefile
+++ b/Makefile
@@ -505,7 +505,6 @@ KBUILD_CFLAGS_KERNEL :=
KBUILD_AFLAGS_MODULE := -DMODULE
KBUILD_CFLAGS_MODULE := -DMODULE
KBUILD_LDFLAGS_MODULE :=
-export KBUILD_LDS_MODULE := $(srctree)/scripts/module-common.lds
KBUILD_LDFLAGS :=
CLANG_FLAGS :=

@@ -1395,7 +1394,7 @@ endif
# using awk while concatenating to the final file.

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

PHONY += modules_check
@@ -1412,6 +1411,7 @@ targets += modules.order
# Target to prepare building external modules
PHONY += modules_prepare
modules_prepare: prepare
+ $(Q)$(MAKE) $(build)=scripts scripts/module.lds

# Target to install modules
PHONY += modules_install
@@ -1743,7 +1743,9 @@ help:
@echo ' clean - remove generated files in module directory only'
@echo ''

-PHONY += prepare
+# no-op for external module builds
+PHONY += prepare modules_prepare
+
endif # KBUILD_EXTMOD

# Single targets
@@ -1776,7 +1778,7 @@ MODORDER := .modules.tmp
endif

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)$(MAKE) -f $(srctree)/scripts/Makefile.modpost

diff --git a/arch/arm/Makefile b/arch/arm/Makefile
index 4e877354515f..a0cb15de9677 100644
--- a/arch/arm/Makefile
+++ b/arch/arm/Makefile
@@ -16,10 +16,6 @@ LDFLAGS_vmlinux += --be8
KBUILD_LDFLAGS_MODULE += --be8
endif

-ifeq ($(CONFIG_ARM_MODULE_PLTS),y)
-KBUILD_LDS_MODULE += $(srctree)/arch/arm/kernel/module.lds
-endif
-
GZFLAGS :=-9
#KBUILD_CFLAGS +=-pipe

diff --git a/arch/arm/kernel/module.lds b/arch/arm/include/asm/module.lds.h
similarity index 72%
rename from arch/arm/kernel/module.lds
rename to arch/arm/include/asm/module.lds.h
index 79cb6af565e5..0e7cb4e314b4 100644
--- a/arch/arm/kernel/module.lds
+++ b/arch/arm/include/asm/module.lds.h
@@ -1,5 +1,7 @@
/* SPDX-License-Identifier: GPL-2.0 */
+#ifdef CONFIG_ARM_MODULE_PLTS
SECTIONS {
.plt : { BYTE(0) }
.init.plt : { BYTE(0) }
}
+#endif
diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
index b45f0124cc16..76667ad47980 100644
--- a/arch/arm64/Makefile
+++ b/arch/arm64/Makefile
@@ -115,10 +115,6 @@ endif

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)
KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
CC_FLAGS_FTRACE := -fpatchable-function-entry=2
diff --git a/arch/arm64/kernel/module.lds b/arch/arm64/include/asm/module.lds.h
similarity index 76%
rename from arch/arm64/kernel/module.lds
rename to arch/arm64/include/asm/module.lds.h
index 22e36a21c113..691f15af788e 100644
--- a/arch/arm64/kernel/module.lds
+++ b/arch/arm64/include/asm/module.lds.h
@@ -1,5 +1,7 @@
+#ifdef CONFIG_ARM64_MODULE_PLTS
SECTIONS {
.plt (NOLOAD) : { BYTE(0) }
.init.plt (NOLOAD) : { BYTE(0) }
.text.ftrace_trampoline (NOLOAD) : { BYTE(0) }
}
+#endif
diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile
index 2876a7df1b0a..703b1c4f6d12 100644
--- a/arch/ia64/Makefile
+++ b/arch/ia64/Makefile
@@ -20,7 +20,6 @@ CHECKFLAGS += -D__ia64=1 -D__ia64__=1 -D_LP64 -D__LP64__

OBJCOPYFLAGS := --strip-all
LDFLAGS_vmlinux := -static
-KBUILD_LDS_MODULE += $(srctree)/arch/ia64/module.lds
KBUILD_AFLAGS_KERNEL := -mconstant-gp
EXTRA :=

diff --git a/arch/ia64/module.lds b/arch/ia64/include/asm/module.lds.h
similarity index 100%
rename from arch/ia64/module.lds
rename to arch/ia64/include/asm/module.lds.h
diff --git a/arch/m68k/Makefile b/arch/m68k/Makefile
index 4438ffb4bbe1..ea14f2046fb4 100644
--- a/arch/m68k/Makefile
+++ b/arch/m68k/Makefile
@@ -75,7 +75,6 @@ KBUILD_CPPFLAGS += -D__uClinux__
endif

KBUILD_LDFLAGS := -m m68kelf
-KBUILD_LDS_MODULE += $(srctree)/arch/m68k/kernel/module.lds

ifdef CONFIG_SUN3
LDFLAGS_vmlinux = -N
diff --git a/arch/m68k/kernel/module.lds b/arch/m68k/include/asm/module.lds.h
similarity index 100%
rename from arch/m68k/kernel/module.lds
rename to arch/m68k/include/asm/module.lds.h
diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
index 3e8da9cf2eb9..8935658fcd06 100644
--- a/arch/powerpc/Makefile
+++ b/arch/powerpc/Makefile
@@ -65,7 +65,6 @@ UTS_MACHINE := $(subst $(space),,$(machine-y))
ifdef CONFIG_PPC32
KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
else
-KBUILD_LDS_MODULE += $(srctree)/arch/powerpc/kernel/module.lds
ifeq ($(call ld-ifversion, -ge, 225000000, y),y)
# Have the linker provide sfpr if possible.
# There is a corresponding test in arch/powerpc/lib/Makefile
diff --git a/arch/powerpc/kernel/module.lds b/arch/powerpc/include/asm/module.lds.h
similarity index 100%
rename from arch/powerpc/kernel/module.lds
rename to arch/powerpc/include/asm/module.lds.h
diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
index fb6e37db836d..8edaa8bd86d6 100644
--- a/arch/riscv/Makefile
+++ b/arch/riscv/Makefile
@@ -53,9 +53,6 @@ endif
ifeq ($(CONFIG_CMODEL_MEDANY),y)
KBUILD_CFLAGS += -mcmodel=medany
endif
-ifeq ($(CONFIG_MODULE_SECTIONS),y)
- KBUILD_LDS_MODULE += $(srctree)/arch/riscv/kernel/module.lds
-endif
ifeq ($(CONFIG_PERF_EVENTS),y)
KBUILD_CFLAGS += -fno-omit-frame-pointer
endif
diff --git a/arch/riscv/kernel/module.lds b/arch/riscv/include/asm/module.lds.h
similarity index 84%
rename from arch/riscv/kernel/module.lds
rename to arch/riscv/include/asm/module.lds.h
index 295ecfb341a2..4254ff2ff049 100644
--- a/arch/riscv/kernel/module.lds
+++ b/arch/riscv/include/asm/module.lds.h
@@ -1,8 +1,9 @@
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (C) 2017 Andes Technology Corporation */
-
+#ifdef CONFIG_MODULE_SECTIONS
SECTIONS {
.plt (NOLOAD) : { BYTE(0) }
.got (NOLOAD) : { BYTE(0) }
.got.plt (NOLOAD) : { BYTE(0) }
}
+#endif
diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild
index 8d435f8a6dec..1c63b260ecc4 100644
--- a/arch/um/include/asm/Kbuild
+++ b/arch/um/include/asm/Kbuild
@@ -16,6 +16,7 @@ generic-y += kdebug.h
generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h
generic-y += mmiowb.h
+generic-y += module.lds.h
generic-y += param.h
generic-y += pci.h
generic-y += percpu.h
diff --git a/include/asm-generic/Kbuild b/include/asm-generic/Kbuild
index 74b0612601dd..7cd4e627e00e 100644
--- a/include/asm-generic/Kbuild
+++ b/include/asm-generic/Kbuild
@@ -40,6 +40,7 @@ mandatory-y += mmiowb.h
mandatory-y += mmu.h
mandatory-y += mmu_context.h
mandatory-y += module.h
+mandatory-y += module.lds.h
mandatory-y += msi.h
mandatory-y += pci.h
mandatory-y += percpu.h
diff --git a/include/asm-generic/module.lds.h b/include/asm-generic/module.lds.h
new file mode 100644
index 000000000000..f210d5c1b78b
--- /dev/null
+++ b/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 */
diff --git a/scripts/.gitignore b/scripts/.gitignore
index 0d1c8e217cd7..a6c11316c969 100644
--- a/scripts/.gitignore
+++ b/scripts/.gitignore
@@ -8,3 +8,4 @@ asn1_compiler
extract-cert
sign-file
insert-sys-cert
+/module.lds
diff --git a/scripts/Makefile b/scripts/Makefile
index bc018e4b733e..b5418ec587fb 100644
--- a/scripts/Makefile
+++ b/scripts/Makefile
@@ -29,6 +29,9 @@ endif
# The following programs are only built on demand
hostprogs += unifdef

+# The module linker script is preprocessed on demand
+targets += module.lds
+
subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
subdir-$(CONFIG_MODVERSIONS) += genksyms
subdir-$(CONFIG_SECURITY_SELINUX) += selinux
diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal
index 411c1e600e7d..ae01baf96f4e 100644
--- a/scripts/Makefile.modfinal
+++ b/scripts/Makefile.modfinal
@@ -33,11 +33,10 @@ quiet_cmd_ld_ko_o = LD [M] $@
cmd_ld_ko_o = \
$(LD) -r $(KBUILD_LDFLAGS) \
$(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)

-$(modules): %.ko: %.o %.mod.o $(KBUILD_LDS_MODULE) FORCE
+$(modules): %.ko: %.o %.mod.o scripts/module.lds FORCE
+$(call if_changed,ld_ko_o)

targets += $(modules) $(modules:.ko=.mod.o)
diff --git a/scripts/module-common.lds b/scripts/module.lds.S
similarity index 93%
rename from scripts/module-common.lds
rename to scripts/module.lds.S
index d61b9e8678e8..69b9b71a6a47 100644
--- a/scripts/module-common.lds
+++ b/scripts/module.lds.S
@@ -24,3 +24,6 @@ SECTIONS {

__jump_table 0 : ALIGN(8) { KEEP(*(__jump_table)) }
}
+
+/* bring in arch-specific sections */
+#include <asm/module.lds.h>
diff --git a/scripts/package/builddeb b/scripts/package/builddeb
index 6df3c9f8b2da..44f212e37935 100755
--- a/scripts/package/builddeb
+++ b/scripts/package/builddeb
@@ -55,7 +55,7 @@ deploy_kernel_headers () {
cd $srctree
find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
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
) > debian/hdrsrcfiles

--
2.25.1


2020-09-08 07:04:13

by Geert Uytterhoeven

[permalink] [raw]
Subject: Re: [PATCH v2] kbuild: preprocess module linker script

On Tue, Sep 8, 2020 at 6:29 AM Masahiro Yamada <[email protected]> wrote:
> 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]>

> arch/m68k/Makefile | 1 -
> .../{kernel/module.lds => include/asm/module.lds.h} | 0

Acked-by: Geert Uytterhoeven <[email protected]>

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- [email protected]

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds

2020-09-09 04:28:17

by Palmer Dabbelt

[permalink] [raw]
Subject: Re: [PATCH v2] kbuild: preprocess module linker script

On Mon, 07 Sep 2020 21:27:08 PDT (-0700), [email protected] wrote:
> 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>.

for the arch/riscv stuff

Acked-by: Palmer Dabbelt <[email protected]>

Thanks!

> Signed-off-by: Masahiro Yamada <[email protected]>
> Tested-by: Jessica Yu <[email protected]>
> Acked-by: Will Deacon <[email protected]>
> ---
>
> Changes in v2:
> - Fix the race between the two targets 'scripts' and 'asm-generic'
>
> Makefile | 10 ++++++----
> arch/arm/Makefile | 4 ----
> .../{kernel/module.lds => include/asm/module.lds.h} | 2 ++
> arch/arm64/Makefile | 4 ----
> .../{kernel/module.lds => include/asm/module.lds.h} | 2 ++
> arch/ia64/Makefile | 1 -
> arch/ia64/{module.lds => include/asm/module.lds.h} | 0
> arch/m68k/Makefile | 1 -
> .../{kernel/module.lds => include/asm/module.lds.h} | 0
> arch/powerpc/Makefile | 1 -
> .../{kernel/module.lds => include/asm/module.lds.h} | 0
> arch/riscv/Makefile | 3 ---
> .../{kernel/module.lds => include/asm/module.lds.h} | 3 ++-
> arch/um/include/asm/Kbuild | 1 +
> include/asm-generic/Kbuild | 1 +
> include/asm-generic/module.lds.h | 10 ++++++++++
> scripts/.gitignore | 1 +
> scripts/Makefile | 3 +++
> scripts/Makefile.modfinal | 5 ++---
> scripts/{module-common.lds => module.lds.S} | 3 +++
> scripts/package/builddeb | 2 +-
> 21 files changed, 34 insertions(+), 23 deletions(-)
> rename arch/arm/{kernel/module.lds => include/asm/module.lds.h} (72%)
> rename arch/arm64/{kernel/module.lds => include/asm/module.lds.h} (76%)
> rename arch/ia64/{module.lds => include/asm/module.lds.h} (100%)
> rename arch/m68k/{kernel/module.lds => include/asm/module.lds.h} (100%)
> rename arch/powerpc/{kernel/module.lds => include/asm/module.lds.h} (100%)
> rename arch/riscv/{kernel/module.lds => include/asm/module.lds.h} (84%)
> create mode 100644 include/asm-generic/module.lds.h
> rename scripts/{module-common.lds => module.lds.S} (93%)
>
> diff --git a/Makefile b/Makefile
> index 37739ee53f27..97b1dae1783b 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -505,7 +505,6 @@ KBUILD_CFLAGS_KERNEL :=
> KBUILD_AFLAGS_MODULE := -DMODULE
> KBUILD_CFLAGS_MODULE := -DMODULE
> KBUILD_LDFLAGS_MODULE :=
> -export KBUILD_LDS_MODULE := $(srctree)/scripts/module-common.lds
> KBUILD_LDFLAGS :=
> CLANG_FLAGS :=
>
> @@ -1395,7 +1394,7 @@ endif
> # using awk while concatenating to the final file.
>
> 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
>
> PHONY += modules_check
> @@ -1412,6 +1411,7 @@ targets += modules.order
> # Target to prepare building external modules
> PHONY += modules_prepare
> modules_prepare: prepare
> + $(Q)$(MAKE) $(build)=scripts scripts/module.lds
>
> # Target to install modules
> PHONY += modules_install
> @@ -1743,7 +1743,9 @@ help:
> @echo ' clean - remove generated files in module directory only'
> @echo ''
>
> -PHONY += prepare
> +# no-op for external module builds
> +PHONY += prepare modules_prepare
> +
> endif # KBUILD_EXTMOD
>
> # Single targets
> @@ -1776,7 +1778,7 @@ MODORDER := .modules.tmp
> endif
>
> 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)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
>
> diff --git a/arch/arm/Makefile b/arch/arm/Makefile
> index 4e877354515f..a0cb15de9677 100644
> --- a/arch/arm/Makefile
> +++ b/arch/arm/Makefile
> @@ -16,10 +16,6 @@ LDFLAGS_vmlinux += --be8
> KBUILD_LDFLAGS_MODULE += --be8
> endif
>
> -ifeq ($(CONFIG_ARM_MODULE_PLTS),y)
> -KBUILD_LDS_MODULE += $(srctree)/arch/arm/kernel/module.lds
> -endif
> -
> GZFLAGS :=-9
> #KBUILD_CFLAGS +=-pipe
>
> diff --git a/arch/arm/kernel/module.lds b/arch/arm/include/asm/module.lds.h
> similarity index 72%
> rename from arch/arm/kernel/module.lds
> rename to arch/arm/include/asm/module.lds.h
> index 79cb6af565e5..0e7cb4e314b4 100644
> --- a/arch/arm/kernel/module.lds
> +++ b/arch/arm/include/asm/module.lds.h
> @@ -1,5 +1,7 @@
> /* SPDX-License-Identifier: GPL-2.0 */
> +#ifdef CONFIG_ARM_MODULE_PLTS
> SECTIONS {
> .plt : { BYTE(0) }
> .init.plt : { BYTE(0) }
> }
> +#endif
> diff --git a/arch/arm64/Makefile b/arch/arm64/Makefile
> index b45f0124cc16..76667ad47980 100644
> --- a/arch/arm64/Makefile
> +++ b/arch/arm64/Makefile
> @@ -115,10 +115,6 @@ endif
>
> 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)
> KBUILD_CPPFLAGS += -DCC_USING_PATCHABLE_FUNCTION_ENTRY
> CC_FLAGS_FTRACE := -fpatchable-function-entry=2
> diff --git a/arch/arm64/kernel/module.lds b/arch/arm64/include/asm/module.lds.h
> similarity index 76%
> rename from arch/arm64/kernel/module.lds
> rename to arch/arm64/include/asm/module.lds.h
> index 22e36a21c113..691f15af788e 100644
> --- a/arch/arm64/kernel/module.lds
> +++ b/arch/arm64/include/asm/module.lds.h
> @@ -1,5 +1,7 @@
> +#ifdef CONFIG_ARM64_MODULE_PLTS
> SECTIONS {
> .plt (NOLOAD) : { BYTE(0) }
> .init.plt (NOLOAD) : { BYTE(0) }
> .text.ftrace_trampoline (NOLOAD) : { BYTE(0) }
> }
> +#endif
> diff --git a/arch/ia64/Makefile b/arch/ia64/Makefile
> index 2876a7df1b0a..703b1c4f6d12 100644
> --- a/arch/ia64/Makefile
> +++ b/arch/ia64/Makefile
> @@ -20,7 +20,6 @@ CHECKFLAGS += -D__ia64=1 -D__ia64__=1 -D_LP64 -D__LP64__
>
> OBJCOPYFLAGS := --strip-all
> LDFLAGS_vmlinux := -static
> -KBUILD_LDS_MODULE += $(srctree)/arch/ia64/module.lds
> KBUILD_AFLAGS_KERNEL := -mconstant-gp
> EXTRA :=
>
> diff --git a/arch/ia64/module.lds b/arch/ia64/include/asm/module.lds.h
> similarity index 100%
> rename from arch/ia64/module.lds
> rename to arch/ia64/include/asm/module.lds.h
> diff --git a/arch/m68k/Makefile b/arch/m68k/Makefile
> index 4438ffb4bbe1..ea14f2046fb4 100644
> --- a/arch/m68k/Makefile
> +++ b/arch/m68k/Makefile
> @@ -75,7 +75,6 @@ KBUILD_CPPFLAGS += -D__uClinux__
> endif
>
> KBUILD_LDFLAGS := -m m68kelf
> -KBUILD_LDS_MODULE += $(srctree)/arch/m68k/kernel/module.lds
>
> ifdef CONFIG_SUN3
> LDFLAGS_vmlinux = -N
> diff --git a/arch/m68k/kernel/module.lds b/arch/m68k/include/asm/module.lds.h
> similarity index 100%
> rename from arch/m68k/kernel/module.lds
> rename to arch/m68k/include/asm/module.lds.h
> diff --git a/arch/powerpc/Makefile b/arch/powerpc/Makefile
> index 3e8da9cf2eb9..8935658fcd06 100644
> --- a/arch/powerpc/Makefile
> +++ b/arch/powerpc/Makefile
> @@ -65,7 +65,6 @@ UTS_MACHINE := $(subst $(space),,$(machine-y))
> ifdef CONFIG_PPC32
> KBUILD_LDFLAGS_MODULE += arch/powerpc/lib/crtsavres.o
> else
> -KBUILD_LDS_MODULE += $(srctree)/arch/powerpc/kernel/module.lds
> ifeq ($(call ld-ifversion, -ge, 225000000, y),y)
> # Have the linker provide sfpr if possible.
> # There is a corresponding test in arch/powerpc/lib/Makefile
> diff --git a/arch/powerpc/kernel/module.lds b/arch/powerpc/include/asm/module.lds.h
> similarity index 100%
> rename from arch/powerpc/kernel/module.lds
> rename to arch/powerpc/include/asm/module.lds.h
> diff --git a/arch/riscv/Makefile b/arch/riscv/Makefile
> index fb6e37db836d..8edaa8bd86d6 100644
> --- a/arch/riscv/Makefile
> +++ b/arch/riscv/Makefile
> @@ -53,9 +53,6 @@ endif
> ifeq ($(CONFIG_CMODEL_MEDANY),y)
> KBUILD_CFLAGS += -mcmodel=medany
> endif
> -ifeq ($(CONFIG_MODULE_SECTIONS),y)
> - KBUILD_LDS_MODULE += $(srctree)/arch/riscv/kernel/module.lds
> -endif
> ifeq ($(CONFIG_PERF_EVENTS),y)
> KBUILD_CFLAGS += -fno-omit-frame-pointer
> endif
> diff --git a/arch/riscv/kernel/module.lds b/arch/riscv/include/asm/module.lds.h
> similarity index 84%
> rename from arch/riscv/kernel/module.lds
> rename to arch/riscv/include/asm/module.lds.h
> index 295ecfb341a2..4254ff2ff049 100644
> --- a/arch/riscv/kernel/module.lds
> +++ b/arch/riscv/include/asm/module.lds.h
> @@ -1,8 +1,9 @@
> /* SPDX-License-Identifier: GPL-2.0 */
> /* Copyright (C) 2017 Andes Technology Corporation */
> -
> +#ifdef CONFIG_MODULE_SECTIONS
> SECTIONS {
> .plt (NOLOAD) : { BYTE(0) }
> .got (NOLOAD) : { BYTE(0) }
> .got.plt (NOLOAD) : { BYTE(0) }
> }
> +#endif
> diff --git a/arch/um/include/asm/Kbuild b/arch/um/include/asm/Kbuild
> index 8d435f8a6dec..1c63b260ecc4 100644
> --- a/arch/um/include/asm/Kbuild
> +++ b/arch/um/include/asm/Kbuild
> @@ -16,6 +16,7 @@ generic-y += kdebug.h
> generic-y += mcs_spinlock.h
> generic-y += mm-arch-hooks.h
> generic-y += mmiowb.h
> +generic-y += module.lds.h
> generic-y += param.h
> generic-y += pci.h
> generic-y += percpu.h
> diff --git a/include/asm-generic/Kbuild b/include/asm-generic/Kbuild
> index 74b0612601dd..7cd4e627e00e 100644
> --- a/include/asm-generic/Kbuild
> +++ b/include/asm-generic/Kbuild
> @@ -40,6 +40,7 @@ mandatory-y += mmiowb.h
> mandatory-y += mmu.h
> mandatory-y += mmu_context.h
> mandatory-y += module.h
> +mandatory-y += module.lds.h
> mandatory-y += msi.h
> mandatory-y += pci.h
> mandatory-y += percpu.h
> diff --git a/include/asm-generic/module.lds.h b/include/asm-generic/module.lds.h
> new file mode 100644
> index 000000000000..f210d5c1b78b
> --- /dev/null
> +++ b/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 */
> diff --git a/scripts/.gitignore b/scripts/.gitignore
> index 0d1c8e217cd7..a6c11316c969 100644
> --- a/scripts/.gitignore
> +++ b/scripts/.gitignore
> @@ -8,3 +8,4 @@ asn1_compiler
> extract-cert
> sign-file
> insert-sys-cert
> +/module.lds
> diff --git a/scripts/Makefile b/scripts/Makefile
> index bc018e4b733e..b5418ec587fb 100644
> --- a/scripts/Makefile
> +++ b/scripts/Makefile
> @@ -29,6 +29,9 @@ endif
> # The following programs are only built on demand
> hostprogs += unifdef
>
> +# The module linker script is preprocessed on demand
> +targets += module.lds
> +
> subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
> subdir-$(CONFIG_MODVERSIONS) += genksyms
> subdir-$(CONFIG_SECURITY_SELINUX) += selinux
> diff --git a/scripts/Makefile.modfinal b/scripts/Makefile.modfinal
> index 411c1e600e7d..ae01baf96f4e 100644
> --- a/scripts/Makefile.modfinal
> +++ b/scripts/Makefile.modfinal
> @@ -33,11 +33,10 @@ quiet_cmd_ld_ko_o = LD [M] $@
> cmd_ld_ko_o = \
> $(LD) -r $(KBUILD_LDFLAGS) \
> $(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)
>
> -$(modules): %.ko: %.o %.mod.o $(KBUILD_LDS_MODULE) FORCE
> +$(modules): %.ko: %.o %.mod.o scripts/module.lds FORCE
> +$(call if_changed,ld_ko_o)
>
> targets += $(modules) $(modules:.ko=.mod.o)
> diff --git a/scripts/module-common.lds b/scripts/module.lds.S
> similarity index 93%
> rename from scripts/module-common.lds
> rename to scripts/module.lds.S
> index d61b9e8678e8..69b9b71a6a47 100644
> --- a/scripts/module-common.lds
> +++ b/scripts/module.lds.S
> @@ -24,3 +24,6 @@ SECTIONS {
>
> __jump_table 0 : ALIGN(8) { KEEP(*(__jump_table)) }
> }
> +
> +/* bring in arch-specific sections */
> +#include <asm/module.lds.h>
> diff --git a/scripts/package/builddeb b/scripts/package/builddeb
> index 6df3c9f8b2da..44f212e37935 100755
> --- a/scripts/package/builddeb
> +++ b/scripts/package/builddeb
> @@ -55,7 +55,7 @@ deploy_kernel_headers () {
> cd $srctree
> find . arch/$SRCARCH -maxdepth 1 -name Makefile\*
> 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
> ) > debian/hdrsrcfiles

2020-09-19 10:27:47

by Jessica Yu

[permalink] [raw]
Subject: Re: [PATCH v2] kbuild: preprocess module linker script

+++ Masahiro Yamada [08/09/20 13:27 +0900]:
>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: Jessica Yu <[email protected]>

Thanks for working on this!