• Ilya Leoshkevich's avatar
    selftests/bpf: add bpf-gcc support · 4ce150b6
    Ilya Leoshkevich authored
    Now that binutils and gcc support for BPF is upstream, make use of it in
    BPF selftests using alu32-like approach. Share as much as possible of
    CFLAGS calculation with clang.
    
    Fixes only obvious issues, leaving more complex ones for later:
    - Use gcc-provided bpf-helpers.h instead of manually defining the
      helpers, change bpf_helpers.h include guard to avoid conflict.
    - Include <linux/stddef.h> for __always_inline.
    - Add $(OUTPUT)/../usr/include to include path in order to use local
      kernel headers instead of system kernel headers when building with O=.
    
    In order to activate the bpf-gcc support, one needs to configure
    binutils and gcc with --target=bpf and make them available in $PATH. In
    particular, gcc must be installed as `bpf-gcc`, which is the default.
    
    Right now with binutils 25a2915e8dba and gcc r275589 only a handful of
    tests work:
    
    	# ./test_progs_bpf_gcc
    	# Summary: 7/39 PASSED, 1 SKIPPED, 98 FAILED
    
    The reason for those failures are as follows:
    
    - Build errors:
      - `error: too many function arguments for eBPF` for __always_inline
        functions read_str_var and read_map_var - must be inlining issue,
        and for process_l3_headers_v6, which relies on optimizing away
        function arguments.
      - `error: indirect call in function, which are not supported by eBPF`
        where there are no obvious indirect calls in the source calls, e.g.
        in __encap_ipip_none.
      - `error: field 'lock' has incomplete type` for fields of `struct
        bpf_spin_lock` type - bpf_spin_lock is re#defined by bpf-helpers.h,
        so its usage is sensitive to order of #includes.
      - `error: eBPF stack limit exceeded` in sysctl_tcp_mem.
    - Load errors:
      - Missing object files due to above build errors.
      - `libbpf: failed to create map (name: 'test_ver.bss')`.
      - `libbpf: object file doesn't contain bpf program`.
      - `libbpf: Program '.text' contains unrecognized relo data pointing to
        section 0`.
      - `libbpf: BTF is required, but is missing or corrupted` - no BTF
        support in gcc yet.
    Signed-off-by: default avatarIlya Leoshkevich <iii@linux.ibm.com>
    Cc: Jose E. Marchesi <jose.marchesi@oracle.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    4ce150b6
bpf_helpers.h 21.2 KB