Skip to content

Commit

Permalink
kbuild: split the second line of *.mod into *.usyms
Browse files Browse the repository at this point in the history
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 7d32358 ("kbuild: avoid split
lines in .mod files").

Signed-off-by: Masahiro Yamada <masahiroy@kernel.org>
Reviewed-by: Nicolas Schier <nicolas@fjasle.eu>
  • Loading branch information
masahir0y committed May 7, 2022
1 parent b3591e0 commit 9413e76
Show file tree
Hide file tree
Showing 6 changed files with 25 additions and 26 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
*.symversions
*.tab.[ch]
*.tar
*.usyms
*.xz
*.zst
Module.symvers
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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]' \
Expand Down
17 changes: 9 additions & 8 deletions scripts/Makefile.build
Original file line number Diff line number Diff line change
Expand Up @@ -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)))
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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 \
Expand Down
2 changes: 1 addition & 1 deletion scripts/adjust_autoksyms.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
18 changes: 11 additions & 7 deletions scripts/gen_autoksyms.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,20 +2,26 @@
# 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*)
set -x
;;
esac

read_modorder=

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

output_file="$1"

needed_symbols=

# Special case for modversions (see modpost.c)
Expand All @@ -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' |
Expand Down
11 changes: 2 additions & 9 deletions scripts/mod/sumversion.c
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,7 @@ static int parse_source_files(const char *objfile, struct md4_ctx *md)
/* 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];
Expand All @@ -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)) &&
Expand Down

0 comments on commit 9413e76

Please sign in to comment.