Re: [PATCH v5 bpf-next 00/15] samples: bpf: improve/fix cross-compilation

Ilias Apalodimas
2019-10-11T12:07:24Z

On Fri, Oct 11, 2019 at 03:27:53AM +0300, Ivan Khoronzhuk wrote:
> This series contains mainly fixes/improvements for cross-compilation
> but not only, tested for arm, arm64, and intended for any arch.
> Also verified on native build (not cross compilation) for x86_64
> and arm, arm64.
>
> Initial RFC link:
> https://lkml.org/lkml/2019/8/29/1665
>
> Prev. version:
> https://lkml.org/lkml/2019/10/9/1045
>
> Besides the patches given here, the RFC also contains couple patches
> related to llvm clang
> arm: include: asm: swab: mask rev16 instruction for clang
> arm: include: asm: unified: mask .syntax unified for clang
> They are necessarily to verify arm 32 build.
>
> Also, couple more fixes were added but are not merged in bpf-next yet,
> they can be needed for verification/configuration steps, if not in
> your tree the fixes can be taken here:
> https://www.spinics.net/lists/netdev/msg601716.html
> https://www.spinics.net/lists/netdev/msg601714.html
> https://www.spinics.net/lists/linux-kbuild/msg23468.html
>
> Now, to build samples, SAMPLE_BPF should be enabled in config.
>
> The change touches not only cross-compilation and can have impact on
> other archs and build environments, so might be good idea to verify
> it in order to add appropriate changes, some warn options could be
> tuned also.
>
> All is tested on x86-64 with clang installed (has to be built containing
> targets for arm, arm64..., see llc --version, usually it's present already)
>
> Instructions to test native on x86_64
> =================================================
> Native build on x86_64 is done in usual way and shouldn't have difference
> except HOSTCC is now printed as CC wile building the samples.
>
> Instructions to test cross compilation on arm64
> =================================================
> #Toolchain used for test:
> gcc version 8.3.0
> (GNU Toolchain for the A-profile Architecture 8.3-2019.03 (arm-rel-8.36))
>
> # Get some arm64 FS, containing at least libelf
> I've used sdk for TI am65x got here:
> http://downloads.ti.com/processor-sdk-linux/esd/AM65X/latest/exports/\
> ti-processor-sdk-linux-am65xx-evm-06.00.00.07-Linux-x86-Install.bin
>
> # Install this binary to some dir, say "sdk".
> # Configure kernel (use defconfig as no matter), but clean everything
> # before.
> make ARCH=arm64 -C tools/ clean
> make ARCH=arm64 -C samples/bpf clean
> make ARCH=arm64 clean
> make ARCH=arm64 defconfig
>
> # Enable SAMPLE_BPF and it's dependencies in config
>
> # The kernel version used in sdk doesn't correspond to checked one,
> # but for this verification only headers need to be syched,
> # so install them (can be enabled in config):
> make ARCH=arm64 headers_install
>
> # or on SDK if need keep them in sync (not necessarily to verify):
>
> make ARCH=arm64 INSTALL_HDR_PATH=/../sdk/\
> ti-processor-sdk-linux-am65xx-evm-06.00.00.07/linux-devkit/sysroots/\
> aarch64-linux/usr headers_install
>
> # Build samples
> make samples/bpf/ ARCH=arm64 CROSS_COMPILE="aarch64-linux-gnu-"\
> SYSROOT="/../sdk/ti-processor-sdk-linux-am65xx-evm-06.00.00.07/\
> linux-devkit/sysroots/aarch64-linux"
>
> Instructions to test cross compilation on arm
> =================================================
> #Toolchains used for test:
> arm-linux-gnueabihf-gcc (Linaro GCC 7.2-2017.11) 7.2.1 20171011
> or
> arm-linux-gnueabihf-gcc
> (GNU Toolchain for the A-profile Architecture 8.3-2019.03 \
> (arm-rel-8.36)) 8.3.0
>
> # Get some FS, I've used sdk for TI am52xx got here:
> http://downloads.ti.com/processor-sdk-linux/esd/AM57X/05_03_00_07/exports/\
> ti-processor-sdk-linux-am57xx-evm-05.03.00.07-Linux-x86-Install.bin
>
> # Install this binary to some dir, say "sdk".
> # Configure kernel, but clean everything before.
> make ARCH=arm -C tools/ clean
> make ARCH=arm -C samples/bpf clean
> make ARCH=arm clean
> make ARCH=arm omap2plus_defconfig
>
> # The kernel version used in sdk doesn't correspond to checked one, but
> # headers only should be synched,
> # so install them (can be enabled in config):
>
> make ARCH=arm headers_install
>
> # or on SDK if need keep them in sync (not necessarily):
>
> make ARCH=arm INSTALL_HDR_PATH=/../sdk/\
> ti-processor-sdk-linux-am57xx-evm-05.03.00.07/linux-devkit/sysroots/\
> armv7ahf-neon-linux-gnueabi/usr headers_install
>
> # Build samples
> make samples/bpf/ ARCH=arm CROSS_COMPILE="arm-linux-gnueabihf-"\
> SYSROOT="/../sdk/ti-processor-sdk-linux-am57xx-evm-05.03\
> .00.07/linux-devkit/sysroots/armv7ahf-neon-linux-gnueabi"
>
>
> Based on bpf-next/master
>
> v5..v4:
> - any changes, only missed SOBs are added
>
> v4..v3:
> - renamed CLANG_EXTRA_CFLAGS on BPF_EXTRA_CFLAGS
> - used filter for ARCH_ARM_SELECTOR
> - omit "-fomit-frame-pointer" and use same flags for native and "cross"
> - used sample/bpf prefixes
> - use C instead of C++ compiler for test_libbpf target
>
> v3..v2:
> - renamed makefile.progs to makeifle.target, as more appropriate
> - left only __LINUX_ARM_ARCH__ for D options for arm
> - for host build - left options from KBUILD_HOST for compatibility reasons
> - split patch adding c/cxx/ld flags to libbpf by modules
> - moved readme change to separate patch
> - added patch setting options for cross-compile
> - fixed issue with option error for syscall_nrs.S,
> avoiding overlap for ccflags-y.
>
> v2..v1:
> - restructured patches order
> - split "samples: bpf: Makefile: base progs build on Makefile.progs"
> to make change more readable. It added couple nice extra patches.
> - removed redundant patch:
> "samples: bpf: Makefile: remove target for native build"
> - added fix:
> "samples: bpf: makefile: fix cookie_uid_helper_example obj build"
> - limited -D option filter only for arm
> - improved comments
> - added couple instructions to verify cross compilation for arm and
> arm64 arches based on TI am57xx and am65xx sdks.
> - corrected include a little order
>
> Ivan Khoronzhuk (15):
> samples/bpf: fix HDR_PROBE "echo"
> samples/bpf: fix cookie_uid_helper_example obj build
> samples/bpf: use --target from cross-compile
> samples/bpf: use own EXTRA_CFLAGS for clang commands
> samples/bpf: use __LINUX_ARM_ARCH__ selector for arm
> samples/bpf: drop unnecessarily inclusion for bpf_load
> samples/bpf: add makefile.target for separate CC target build
> samples/bpf: base target programs rules on Makefile.target
> samples/bpf: use own flags but not HOSTCFLAGS
> samples/bpf: use target CC environment for HDR_PROBE
> libbpf: don't use cxx to test_libpf target
> libbpf: add C/LDFLAGS to libbpf.so and test_libpf targets
> samples/bpf: provide C/LDFLAGS to libbpf
> samples/bpf: add sysroot support
> samples/bpf: add preparation steps and sysroot info to readme
>
> samples/bpf/Makefile | 164 ++++++++++--------
> samples/bpf/Makefile.target | 75 ++++++++
> samples/bpf/README.rst | 41 ++++-
> tools/lib/bpf/Makefile | 23 +--
> .../bpf/{test_libbpf.cpp => test_libbpf.c} | 14 +-
> 5 files changed, 218 insertions(+), 99 deletions(-)
> create mode 100644 samples/bpf/Makefile.target
> rename tools/lib/bpf/{test_libbpf.cpp => test_libbpf.c} (61%)
>
> --
> 2.17.1
>

For native compilation on x86_64 and aarch64

Tested-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>