kbuild: Add gendwarfksyms as an alternative to genksyms
authorSami Tolvanen <samitolvanen@google.com>
Fri, 3 Jan 2025 20:45:39 +0000 (20:45 +0000)
committerMasahiro Yamada <masahiroy@kernel.org>
Fri, 10 Jan 2025 16:25:26 +0000 (01:25 +0900)
When MODVERSIONS is enabled, allow selecting gendwarfksyms as the
implementation, but default to genksyms.

Signed-off-by: Sami Tolvanen <samitolvanen@google.com>
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
kernel/module/Kconfig
scripts/Makefile
scripts/Makefile.build

index 4637f063d0fcbfff0e80376e14fd18b3372f85b0..d443fc504ffca0d1001f880ec496ab1f21fe979e 100644 (file)
@@ -169,6 +169,22 @@ config MODVERSIONS
          make them incompatible with the kernel you are running.  If
          unsure, say N.
 
+choice
+       prompt "Module versioning implementation"
+       depends on MODVERSIONS
+       help
+         Select the tool used to calculate symbol versions for modules.
+
+         If unsure, select GENKSYMS.
+
+config GENKSYMS
+       bool "genksyms (from source code)"
+       help
+         Calculate symbol versions from pre-processed source code using
+         genksyms.
+
+         If unsure, say Y.
+
 config GENDWARFKSYMS
        bool "gendwarfksyms (from debugging information)"
        depends on DEBUG_INFO
@@ -176,6 +192,12 @@ config GENDWARFKSYMS
        depends on !DEBUG_INFO_REDUCED && !DEBUG_INFO_SPLIT
        # Requires ELF object files.
        depends on !LTO
+       help
+         Calculate symbol versions from DWARF debugging information using
+         gendwarfksyms. Requires DEBUG_INFO to be enabled.
+
+         If unsure, say N.
+endchoice
 
 config ASM_MODVERSIONS
        bool
index d7fec46d38c0063563e7a2dca44847043c71b5f1..8533f4498885e3d830d83effbed1634f6ec67cea 100644 (file)
@@ -53,7 +53,7 @@ hostprogs += unifdef
 targets += module.lds
 
 subdir-$(CONFIG_GCC_PLUGINS) += gcc-plugins
-subdir-$(CONFIG_MODVERSIONS) += genksyms
+subdir-$(CONFIG_GENKSYMS) += genksyms
 subdir-$(CONFIG_GENDWARFKSYMS) += gendwarfksyms
 subdir-$(CONFIG_SECURITY_SELINUX) += selinux
 subdir-$(CONFIG_SECURITY_IPE) += ipe
index c16e4cf54d770fd2cf585a65dc4ad9b6a6bd6e42..81d9dacad03c78162e6859102bdd226559cde8a4 100644 (file)
@@ -107,13 +107,24 @@ cmd_cpp_i_c       = $(CPP) $(c_flags) -o $@ $<
 $(obj)/%.i: $(obj)/%.c FORCE
        $(call if_changed_dep,cpp_i_c)
 
+getexportsymbols = $(NM) $@ | sed -n 's/.* __export_symbol_\(.*\)/$(1)/p'
+
+gendwarfksyms = $(objtree)/scripts/gendwarfksyms/gendwarfksyms \
+       $(if $(KBUILD_SYMTYPES), --symtypes $(@:.o=.symtypes))  \
+       $(if $(KBUILD_GENDWARFKSYMS_STABLE), --stable)
+
 genksyms = $(objtree)/scripts/genksyms/genksyms                \
        $(if $(KBUILD_SYMTYPES), -T $(@:.o=.symtypes))  \
        $(if $(KBUILD_PRESERVE), -p)                    \
        $(addprefix -r , $(wildcard $(@:.o=.symref)))
 
 # These mirror gensymtypes_S and co below, keep them in synch.
+ifdef CONFIG_GENDWARFKSYMS
+cmd_gensymtypes_c = $(if $(skip_gendwarfksyms),,       \
+       $(call getexportsymbols,\1) | $(gendwarfksyms) $@)
+else
 cmd_gensymtypes_c = $(CPP) -D__GENKSYMS__ $(c_flags) $< | $(genksyms)
+endif # CONFIG_GENDWARFKSYMS
 
 # LLVM assembly
 # Generate .ll files from .c
@@ -286,14 +297,26 @@ $(obj)/%.rs: $(obj)/%.rs.S FORCE
 # This is convoluted. The .S file must first be preprocessed to run guards and
 # expand names, then the resulting exports must be constructed into plain
 # EXPORT_SYMBOL(symbol); to build our dummy C file, and that gets preprocessed
-# to make the genksyms input.
+# to make the genksyms input or compiled into an object for gendwarfksyms.
 #
 # These mirror gensymtypes_c and co above, keep them in synch.
-cmd_gensymtypes_S =                                                         \
-   { echo "\#include <linux/kernel.h>" ;                                    \
-     echo "\#include <asm/asm-prototypes.h>" ;                              \
-     $(NM) $@ | sed -n 's/.* __export_symbol_\(.*\)/EXPORT_SYMBOL(\1);/p' ; } | \
-    $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | $(genksyms)
+getasmexports =                                                                \
+   { echo "\#include <linux/kernel.h>" ;                               \
+     echo "\#include <linux/string.h>" ;                               \
+     echo "\#include <asm/asm-prototypes.h>" ;                         \
+     $(call getexportsymbols,EXPORT_SYMBOL(\1);) ; }
+
+ifdef CONFIG_GENDWARFKSYMS
+cmd_gensymtypes_S =                                                    \
+       $(getasmexports) |                                              \
+       $(CC) $(c_flags) -c -o $(@:.o=.gendwarfksyms.o) -xc -;          \
+       $(call getexportsymbols,\1) |                                   \
+       $(gendwarfksyms) $(@:.o=.gendwarfksyms.o)
+else
+cmd_gensymtypes_S =                                                    \
+       $(getasmexports) |                                              \
+       $(CPP) -D__GENKSYMS__ $(c_flags) -xc - | $(genksyms)
+endif # CONFIG_GENDWARFKSYMS
 
 quiet_cmd_cpp_s_S = CPP $(quiet_modtag) $@
 cmd_cpp_s_S       = $(CPP) $(a_flags) -o $@ $<