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 7d32358be8
("kbuild: avoid split
lines in .mod files").
Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
This commit is contained in:
parent
b3591e0619
commit
9413e76405
1
.gitignore
vendored
1
.gitignore
vendored
@ -45,6 +45,7 @@
|
||||
*.symversions
|
||||
*.tab.[ch]
|
||||
*.tar
|
||||
*.usyms
|
||||
*.xz
|
||||
*.zst
|
||||
Module.symvers
|
||||
|
2
Makefile
2
Makefile
@ -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]' \
|
||||
|
@ -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 \
|
||||
|
@ -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.
|
||||
|
@ -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' |
|
||||
|
@ -387,7 +387,7 @@ out_file:
|
||||
/* Calc and record src checksum. */
|
||||
void get_src_version(const char *modname, char sum[], unsigned sumlen)
|
||||
{
|
||||
char *buf, *pos, *firstline;
|
||||
char *buf;
|
||||
struct md4_ctx md;
|
||||
char *fname;
|
||||
char filelist[PATH_MAX + 1];
|
||||
@ -397,15 +397,8 @@ void get_src_version(const char *modname, char sum[], unsigned sumlen)
|
||||
|
||||
buf = read_text_file(filelist);
|
||||
|
||||
pos = buf;
|
||||
firstline = get_line(&pos);
|
||||
if (!firstline) {
|
||||
warn("bad ending versions file for %s\n", modname);
|
||||
goto free;
|
||||
}
|
||||
|
||||
md4_init(&md);
|
||||
while ((fname = strsep(&firstline, " "))) {
|
||||
while ((fname = strsep(&buf, " \n"))) {
|
||||
if (!*fname)
|
||||
continue;
|
||||
if (!(is_static_library(fname)) &&
|
||||
|
Loading…
Reference in New Issue
Block a user