Commit 9c3681f9 authored by Sami Tolvanen's avatar Sami Tolvanen Committed by Masahiro Yamada
Browse files

kbuild: Add gendwarfksyms as an alternative to genksyms



When MODVERSIONS is enabled, allow selecting gendwarfksyms as the
implementation, but default to genksyms.

Signed-off-by: default avatarSami Tolvanen <samitolvanen@google.com>
Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
parent d7476f24
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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
+29 −6
Original line number Diff line number Diff line
@@ -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 =                                                         \
getasmexports =								\
   { echo "\#include <linux/kernel.h>" ;				\
     echo "\#include <linux/string.h>" ;				\
     echo "\#include <asm/asm-prototypes.h>" ;				\
     $(NM) $@ | sed -n 's/.* __export_symbol_\(.*\)/EXPORT_SYMBOL(\1);/p' ; } | \
     $(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 $@ $<