Hello everyone.

I picked up the work adding GCC BPF backend to BPF CI pipeline [1],
originally done by Cupertino Miranda [2].

I encountered issues compiling BPF objects for selftests/bpf with
recent GCC 15 snapshots. An additional test runner binary is supposed
to be generated by tools/testing/selftests/bpf/Makefile if BPF_GCC is
set to a directory with GCC binaries for BPF backend. The runner
binary depends on BPF binaries, which are produced by GCC.

The first issue is compilation errors on vmlinux.h:

    In file included from progs/linked_maps1.c:4:
    /ci/workspace/tools/testing/selftests/bpf/tools/include/vmlinux.h:8483:9: 
error: expected identifier before ‘false’
     8483 |         false = 0,
          |         ^~~~~

A snippet from vmlinux.h:

    enum {
        false = 0,
        true = 1,
    };

And:

    /ci/workspace/tools/testing/selftests/bpf/tools/include/vmlinux.h:23539:15: 
error: two or more data types in declaration specifiers
    23539 | typedef _Bool bool;
          |               ^~~~

Full log at [3], and also at [4].

You can easily reproduce the errors with a dummy program:

    #include "vmlinux.h"

    int main() {
        return 0;
    }

The vmlinux.h is generated from BTF, produced by pahole v1.28 from
DWARF data contained in the vmlinux binary. The vmlinux binary I used
in these experiments is v6.12 (adc218676eef) compiled with gcc 13.3.0
(default Ubuntu installation).

You can download the specific vmlinux.h I tried using a link below [5].

I bisected recent GCC snapshots and determined that the errors related
to the bool declarations started happening on GCC 15-20241117.

Older versions compile the dummy program without errors, however on
attempt to build the selftests there is a different issue: conflicting
int64 definitions (full log at [6]).

    In file included from /usr/include/x86_64-linux-gnu/sys/types.h:155,
                     from /usr/include/x86_64-linux-gnu/bits/socket.h:29,
                     from /usr/include/x86_64-linux-gnu/sys/socket.h:33,
                     from /usr/include/linux/if.h:28,
                     from /usr/include/linux/icmp.h:23,
                     from progs/test_cls_redirect_dynptr.c:10:
    /usr/include/x86_64-linux-gnu/bits/stdint-intn.h:27:19: error: conflicting 
types for ‘int64_t’; have ‘__int64_t’ {aka ‘long long int’}
       27 | typedef __int64_t int64_t;
          |                   ^~~~~~~
    In file included from progs/test_cls_redirect_dynptr.c:6:
    
/ci/workspace/bpfgcc.20240922/lib/gcc/bpf-unknown-none/15.0.0/include/stdint.h:43:24:
 note: previous declaration of ‘int64_t’ with type ‘int64_t’ {aka ‘long int’}
       43 | typedef __INT64_TYPE__ int64_t;
          |                        ^~~~~~~

This is on a typical ubuntu:noble system:

    $ dpkg -s libc6 | grep Version
    Version: 2.39-0ubuntu8.3

I got this with snapshots 15-20241110 and 15-20240922 (the oldest I
tested). This problem may or may not be present in the most recent
versions, I can't tell for sure.

GCC team, please investigate and let me know if you're aware of
workarounds or if there is a specific GCC version that you know is
capable of building BPF programs in selftests/bpf.

If you suspect something might be wrong with the includes for BPF
programs, or GCC snapshot build etc, please also let me know. I mostly
relied on Cupertino scripts when setting that up, and assumed the
selftests/bpf/Makefile is handling BPF_GCC correctly.

Thank you, and happy holidays!

[1] https://github.com/libbpf/ci/pull/164
[2] https://github.com/libbpf/ci/pull/144
[3] https://gist.github.com/theihor/98883c4266b3489cee69e5d5aa532e79
[4] https://github.com/libbpf/ci/actions/runs/12522053128/job/34929897322
[5] https://gist.github.com/theihor/785bb250dd1cce3612e70b5f6d258401
[6] https://gist.github.com/theihor/a8aa7201b30ac6b48df77bb1ea3ec0b2


Reply via email to