mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
kbuild: avoid split lines in .mod files
"xargs echo" is not a safe way to remove line breaks because the input may exceed the command line limit and xargs may break it up into multiple invocations of echo. This should never happen because scripts/gen_autoksyms.sh expects all undefined symbols are placed in the second line of .mod files. One possible way is to replace "xargs echo" with "sed ':x;N;$!bx;s/\n/ /g'" or something, but I rewrote the code by using awk because it is more readable. This issue was reported by Sami Tolvanen; in his Clang LTO patch set, $(multi-used-m) is no longer an ELF object, but a thin archive that contains LLVM bitcode files. llvm-nm prints out symbols for each archive member separately, which results a lot of dupications, in some places, beyond the system-defined limit. This problem must be fixed irrespective of LTO, and we must ensure zero possibility of having this issue. Link: https://lkml.org/lkml/2020/12/1/1658 Reported-by: Sami Tolvanen <samitolvanen@google.com> Signed-off-by: Masahiro Yamada <masahiroy@kernel.org> Reviewed-by: Sami Tolvanen <samitolvanen@google.com>
This commit is contained in:
parent
d5750cd3c5
commit
7d32358be8
@ -252,6 +252,9 @@ objtool_dep = $(objtool_obj) \
|
|||||||
ifdef CONFIG_TRIM_UNUSED_KSYMS
|
ifdef CONFIG_TRIM_UNUSED_KSYMS
|
||||||
cmd_gen_ksymdeps = \
|
cmd_gen_ksymdeps = \
|
||||||
$(CONFIG_SHELL) $(srctree)/scripts/gen_ksymdeps.sh $@ >> $(dot-target).cmd
|
$(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
|
endif
|
||||||
|
|
||||||
define rule_cc_o_c
|
define rule_cc_o_c
|
||||||
@ -271,13 +274,6 @@ define rule_as_o_S
|
|||||||
$(call cmd,modversions_S)
|
$(call cmd,modversions_S)
|
||||||
endef
|
endef
|
||||||
|
|
||||||
# List module undefined symbols (or empty line if not enabled)
|
|
||||||
ifdef CONFIG_TRIM_UNUSED_KSYMS
|
|
||||||
cmd_undef_syms = $(NM) $< | sed -n 's/^ *U //p' | xargs echo
|
|
||||||
else
|
|
||||||
cmd_undef_syms = echo
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Built-in and composite module parts
|
# Built-in and composite module parts
|
||||||
$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
|
$(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
|
||||||
$(call if_changed_rule,cc_o_c)
|
$(call if_changed_rule,cc_o_c)
|
||||||
@ -285,7 +281,7 @@ $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
|
|||||||
|
|
||||||
cmd_mod = { \
|
cmd_mod = { \
|
||||||
echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \
|
echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \
|
||||||
$(cmd_undef_syms); \
|
$(undefined_syms) echo; \
|
||||||
} > $@
|
} > $@
|
||||||
|
|
||||||
$(obj)/%.mod: $(obj)/%.o FORCE
|
$(obj)/%.mod: $(obj)/%.o FORCE
|
||||||
|
Loading…
Reference in New Issue
Block a user