Errors compiling BPF programs from Linux selftests/bpf with GCC
Ihor Solodrai
ihor.solodrai@pm.me
Mon Dec 30 20:59:15 GMT 2024
On Monday, December 30th, 2024 at 12:36 PM, Sam James <sam@gentoo.org> wrote:
>
>
> Andrew Pinski via Gcc gcc@gcc.gnu.org writes:
>
> > On Mon, Dec 30, 2024 at 12:11 PM Ihor Solodrai via Gcc gcc@gcc.gnu.org wrote:
> >
> > > 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].
> >
> > These are simple, the selftests/bpf programs need to compile with
> > -std=gnu17 or -std=gnu11 since GCC has changed the default to C23
> > which defines false and bool as keywords now and can't be redeclared
> > like before.
>
>
> Yes, the kernel has various issues like this:
> https://lore.kernel.org/linux-kbuild/20241119044724.GA2246422@thelio-3990X/.
>
> Unfortunately, not all the Makefiles correctly declare that they need
> gnu11.
>
> Clang will hit issues like this too when they change default to gnu23.
Andrew, Sam, thank you for a swift response.
vmlinux.h is generated code, so for the booleans perhaps it's more
appropriate to generate a condition, for example:
#if __STDC_VERSION__ < 202311L
enum {
false = 0,
true = 1,
};
#endif
Any drawbacks to this?
Also if vmlinux was built with GCC C23 then I assume DWARF wouldn't
contain the debug info for the enum, hence it wouldn't be present in
vmlinux.h.
I don't think downgrading the standard for a relatively new backend
makes sense, especially in the context of CI testing.
>
> > [...]
More information about the Gcc
mailing list