lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 049/453] kbuild: avoid split lines in .mod files
    Date
    From: Masahiro Yamada <masahiroy@kernel.org>

    [ Upstream commit 7d32358be8acb119dcfe39b6cf67ec6d94bf1fe7 ]

    "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>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    scripts/Makefile.build | 12 ++++--------
    1 file changed, 4 insertions(+), 8 deletions(-)

    diff --git a/scripts/Makefile.build b/scripts/Makefile.build
    index 24a33c01bbf7c..9c689d011bced 100644
    --- a/scripts/Makefile.build
    +++ b/scripts/Makefile.build
    @@ -234,6 +234,9 @@ objtool_dep = $(objtool_obj) \
    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
    @@ -253,13 +256,6 @@ define rule_as_o_S
    $(call cmd,modversions_S)
    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
    $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE
    $(call cmd,force_checksrc)
    @@ -267,7 +263,7 @@ $(obj)/%.o: $(src)/%.c $(recordmcount_source) $(objtool_dep) FORCE

    cmd_mod = { \
    echo $(if $($*-objs)$($*-y)$($*-m), $(addprefix $(obj)/, $($*-objs) $($*-y) $($*-m)), $(@:.mod=.o)); \
    - $(cmd_undef_syms); \
    + $(undefined_syms) echo; \
    } > $@

    $(obj)/%.mod: $(obj)/%.o FORCE
    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 17:10    [W:4.044 / U:1.328 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site