Commit 9413e764 authored by Masahiro Yamada's avatar Masahiro Yamada
Browse files

kbuild: split the second line of *.mod into *.usyms



The *.mod files have two lines; the first line lists the member objects
of the module, and the second line, if CONFIG_TRIM_UNUSED_KSYMS=y, lists
the undefined symbols.

Currently, we generate *.mod after constructing composite modules,
otherwise, we cannot compute the second line. No prerequisite is
required to print the first line.

They are orthogonal. Splitting them into separate commands will ease
further cleanups.

This commit splits the list of undefined symbols out to *.usyms files.

Previously, the list of undefined symbols ended up with a very long
line, but now it has one symbol per line.

Use sed like we did before commit 7d32358b ("kbuild: avoid split
lines in .mod files").

Signed-off-by: default avatarMasahiro Yamada <masahiroy@kernel.org>
Reviewed-by: default avatarNicolas Schier <nicolas@fjasle.eu>
parent b3591e06
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@
*.symversions
*.tab.[ch]
*.tar
*.usyms
*.xz
*.zst
Module.symvers
+1 −1
Original line number Diff line number Diff line
@@ -1848,7 +1848,7 @@ clean: $(clean-dirs)
		-o -name '*.ko.*' \
		-o -name '*.dtb' -o -name '*.dtbo' -o -name '*.dtb.S' -o -name '*.dt.yaml' \
		-o -name '*.dwo' -o -name '*.lst' \
		-o -name '*.su' -o -name '*.mod' \
		-o -name '*.su' -o -name '*.mod' -o -name '*.usyms' \
		-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
		-o -name '*.lex.c' -o -name '*.tab.[ch]' \
		-o -name '*.asn1.[ch]' \
+9 −8
Original line number Diff line number Diff line
@@ -85,7 +85,8 @@ ifdef need-builtin
targets-for-builtin += $(obj)/built-in.a
endif

targets-for-modules := $(patsubst %.o, %.mod, $(filter %.o, $(obj-m)))
targets-for-modules := $(foreach x, mod $(if $(CONFIG_TRIM_UNUSED_KSYMS), usyms), \
				$(patsubst %.o, %.$x, $(filter %.o, $(obj-m))))

ifneq ($(CONFIG_LTO_CLANG)$(CONFIG_X86_KERNEL_IBT),)
targets-for-modules += $(patsubst %.o, %.prelink.o, $(filter %.o, $(obj-m)))
@@ -256,9 +257,6 @@ endif
ifdef CONFIG_TRIM_UNUSED_KSYMS
cmd_gen_ksymdeps = \
	$(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd

# List module undefined symbols
undefined_syms = $(NM) $< | $(AWK) '$$1 == "U" { printf("%s%s", x++ ? " " : "", $$2) }';
endif

define rule_cc_o_c
@@ -305,14 +303,17 @@ $(obj)/%.prelink.o: $(obj)/%.o FORCE
	$(call if_changed,cc_prelink_modules)
endif

cmd_mod = { \
	echo $(addprefix $(obj)/, $(call real-search, $*.o, .o, -objs -y -m)); \
	$(undefined_syms) echo; \
	} > $@
cmd_mod = echo $(addprefix $(obj)/, $(call real-search, $*.o, .o, -objs -y -m)) > $@

$(obj)/%.mod: $(obj)/%$(mod-prelink-ext).o FORCE
	$(call if_changed,mod)

# List module undefined symbols
cmd_undefined_syms = $(NM) $< | sed -n 's/^  *U //p' > $@

$(obj)/%.usyms: $(obj)/%$(mod-prelink-ext).o FORCE
	$(call if_changed,undefined_syms)

quiet_cmd_cc_lst_c = MKLST   $@
      cmd_cc_lst_c = $(CC) $(c_flags) -g -c -o $*.o $< && \
		     $(CONFIG_SHELL) $(srctree)/scripts/makelst $*.o \
+1 −1
Original line number Diff line number Diff line
@@ -35,7 +35,7 @@ case "$KBUILD_VERBOSE" in
esac

# Generate a new symbol list file
$CONFIG_SHELL $srctree/scripts/gen_autoksyms.sh "$new_ksyms_file"
$CONFIG_SHELL $srctree/scripts/gen_autoksyms.sh --modorder "$new_ksyms_file"

# Extract changes between old and new list and touch corresponding
# dependency files.
+11 −7
Original line number Diff line number Diff line
@@ -2,13 +2,10 @@
# SPDX-License-Identifier: GPL-2.0-only

# Create an autoksyms.h header file from the list of all module's needed symbols
# as recorded on the second line of *.mod files and the user-provided symbol
# whitelist.
# as recorded in *.usyms files and the user-provided symbol whitelist.

set -e

output_file="$1"

# Use "make V=1" to debug this script.
case "$KBUILD_VERBOSE" in
*1*)
@@ -16,6 +13,15 @@ case "$KBUILD_VERBOSE" in
	;;
esac

read_modorder=

if [ "$1" = --modorder ]; then
	shift
	read_modorder=1
fi

output_file="$1"

needed_symbols=

# Special case for modversions (see modpost.c)
@@ -41,10 +47,8 @@ cat > "$output_file" << EOT

EOT

[ -f modules.order ] && modlist=modules.order || modlist=/dev/null

{
	sed 's/ko$/mod/' $modlist | xargs -n1 sed -n -e '2p'
	[ -n "${read_modorder}" ] && sed 's/ko$/usyms/' modules.order | xargs cat
	echo "$needed_symbols"
	[ -n "$ksym_wl" ] && cat "$ksym_wl"
} | sed -e 's/ /\n/g' | sed -n -e '/^$/!p' |
Loading