• Quentin Monnet's avatar
    bpf, preload: Fix build when $(O) points to a relative path · 150a2732
    Quentin Monnet authored
    Building the kernel with CONFIG_BPF_PRELOAD, and by providing a relative
    path for the output directory, may fail with the following error:
    
      $ make O=build bindeb-pkg
      ...
      /.../linux/tools/scripts/Makefile.include:5: *** O=build does not exist.  Stop.
      make[7]: *** [/.../linux/kernel/bpf/preload/Makefile:9: kernel/bpf/preload/libbpf.a] Error 2
      make[6]: *** [/.../linux/scripts/Makefile.build:500: kernel/bpf/preload] Error 2
      make[5]: *** [/.../linux/scripts/Makefile.build:500: kernel/bpf] Error 2
      make[4]: *** [/.../linux/Makefile:1799: kernel] Error 2
      make[4]: *** Waiting for unfinished jobs....
    
    In the case above, for the "bindeb-pkg" target, the error is produced by
    the "dummy" check in Makefile.include, called from libbpf's Makefile.
    This check changes directory to $(PWD) before checking for the existence
    of $(O). But at this step we have $(PWD) pointing to "/.../linux/build",
    and $(O) pointing to "build". So the Makefile.include tries in fact to
    assert the existence of a directory named "/.../linux/build/build",
    which does not exist.
    
    Note that the error does not occur for all make targets and
    architectures combinations. This was observed on x86 for "bindeb-pkg",
    or for a regular build for UML [0].
    
    Here are some details. The root Makefile recursively calls itself once,
    after changing directory to $(O). The content for the variable $(PWD) is
    preserved across recursive calls to make, so it is unchanged at this
    step. For "bindeb-pkg", $(PWD) is eventually updated because the target
    writes a new Makefile (as debian/rules) and calls it indirectly through
    dpkg-buildpackage. This script does not preserve $(PWD), which is reset
    to the current working directory when the target in debian/rules is
    called.
    
    Although not investigated, it seems likely that something similar causes
    UML to change its value for $(PWD).
    
    Non-trivial fixes could be to remove the use of $(PWD) from the "dummy"
    check, or to make sure that $(PWD) and $(O) are preserved or updated to
    always play well and form a valid $(PWD)/$(O) path across the different
    targets and architectures. Instead, we take a simpler approach and just
    update $(O) when calling libbpf's Makefile, so it points to an absolute
    path which should always resolve for the "dummy" check run (through
    includes) by that Makefile.
    
    David Gow previously posted a slightly different version of this patch
    as a RFC [0], two months ago or so.
    
      [0] https://lore.kernel.org/bpf/20201119085022.3606135-1-davidgow@google.com/t/#u
    
    Fixes: d71fa5c9 ("bpf: Add kernel module with user mode driver that populates bpffs.")
    Reported-by: default avatarDavid Gow <davidgow@google.com>
    Signed-off-by: default avatarQuentin Monnet <quentin@isovalent.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Cc: Brendan Higgins <brendanhiggins@google.com>
    Cc: Masahiro Yamada <masahiroy@kernel.org>
    Link: https://lore.kernel.org/bpf/20210126161320.24561-1-quentin@isovalent.com
    150a2732
Makefile 1014 Bytes