mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] bpftool: build bpf bits with -std=gnu11
@ 2025-05-02  8:57 Holger Hoffstätte
  2025-05-02  9:26 ` Quentin Monnet
  0 siblings, 1 reply; 10+ messages in thread
From: Holger Hoffstätte @ 2025-05-02  8:57 UTC (permalink / raw)
  To: Quentin Monnet, Alexei Starovoitov, Daniel Borkmann,
	Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, Jiri Olsa, bpf, linux-kernel
  Cc: Holger Hoffstätte

A gcc-15-based bpf toolchain defaults to C23 and fails to compile various
kernel headers due to their use of a custom 'bool' type.
Explicitly using -std=gnu11 works with both clang and bpf-toolchain.

Signed-off-by: Holger Hoffstätte <holger@applied-asynchrony.com>
---
 tools/bpf/bpftool/Makefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/bpf/bpftool/Makefile b/tools/bpf/bpftool/Makefile
index 9e9a5f006..ca6c1e04b 100644
--- a/tools/bpf/bpftool/Makefile
+++ b/tools/bpf/bpftool/Makefile
@@ -227,7 +227,7 @@ $(OUTPUT)%.bpf.o: skeleton/%.bpf.c $(OUTPUT)vmlinux.h $(LIBBPF_BOOTSTRAP)
 		-I$(or $(OUTPUT),.) \
 		-I$(srctree)/tools/include/uapi/ \
 		-I$(LIBBPF_BOOTSTRAP_INCLUDE) \
-		-g -O2 -Wall -fno-stack-protector \
+		-g -O2 -Wall -fno-stack-protector -std=gnu11 \
 		--target=bpf -c $< -o $@
 	$(Q)$(LLVM_STRIP) -g $@
 
-- 
2.49.0


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] bpftool: build bpf bits with -std=gnu11
  2025-05-02  8:57 [PATCH] bpftool: build bpf bits with -std=gnu11 Holger Hoffstätte
@ 2025-05-02  9:26 ` Quentin Monnet
  2025-05-02  9:53   ` Holger Hoffstätte
  0 siblings, 1 reply; 10+ messages in thread
From: Quentin Monnet @ 2025-05-02  9:26 UTC (permalink / raw)
  To: Holger Hoffstätte, Alexei Starovoitov, Daniel Borkmann,
	Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, Jiri Olsa, bpf, linux-kernel

On 02/05/2025 09:57, Holger Hoffstätte wrote:
> A gcc-15-based bpf toolchain defaults to C23 and fails to compile various
> kernel headers due to their use of a custom 'bool' type.
> Explicitly using -std=gnu11 works with both clang and bpf-toolchain.
> 
> Signed-off-by: Holger Hoffstätte <holger@applied-asynchrony.com>

Thanks! I tested that it still works with clang.

Acked-by: Quentin Monnet <qmo@kernel.org>

I didn't manage to compile with gcc, though. I tried with gcc 15.1.1 but
option '--target=bpf' is apparently unrecognised by the gcc version on
my setup.

Out of curiosity, how did you build using gcc for the skeleton? Was it
enough to run "CLANG=gcc make"? Does it pass the clang-bpf-co-re build
probe successfully?

Thanks,
Quentin

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] bpftool: build bpf bits with -std=gnu11
  2025-05-02  9:26 ` Quentin Monnet
@ 2025-05-02  9:53   ` Holger Hoffstätte
  2025-05-03  2:36     ` Alexei Starovoitov
  0 siblings, 1 reply; 10+ messages in thread
From: Holger Hoffstätte @ 2025-05-02  9:53 UTC (permalink / raw)
  To: Quentin Monnet, Alexei Starovoitov, Daniel Borkmann,
	Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, Jiri Olsa, bpf, linux-kernel

On 2025-05-02 11:26, Quentin Monnet wrote:
> On 02/05/2025 09:57, Holger Hoffstätte wrote:
>> A gcc-15-based bpf toolchain defaults to C23 and fails to compile various
>> kernel headers due to their use of a custom 'bool' type.
>> Explicitly using -std=gnu11 works with both clang and bpf-toolchain.
>>
>> Signed-off-by: Holger Hoffstätte <holger@applied-asynchrony.com>
> 
> Thanks! I tested that it still works with clang.
> 
> Acked-by: Quentin Monnet <qmo@kernel.org>

Thanks!

> I didn't manage to compile with gcc, though. I tried with gcc 15.1.1 but
> option '--target=bpf' is apparently unrecognised by the gcc version on
> my setup.
> 
> Out of curiosity, how did you build using gcc for the skeleton? Was it
> enough to run "CLANG=gcc make"? Does it pass the clang-bpf-co-re build
> probe successfully?

I'm on Gentoo where we have a gcc-14/15 based "bpf-toolchain" package,
which is just gcc configured & packaged for the bpf target.
Our bpftool package can be built with clang (default) or without, in
which case it depend on the bpf-toolchain. The idea is to gradually
allow bpf/xdp tooling to build/run without requiring clang.

The --target definition is conditional and removed when not using clang:
https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-util/bpftool/bpftool-7.5.0.ebuild?id=bf70fbf7b0dc97fbc97af579954ea81a8df36113#n94

The bug for building with the new gcc-15 based toolchain where this
patch originated is here: https://bugs.gentoo.org/955156

Hope this helps!

cheers
Holger

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] bpftool: build bpf bits with -std=gnu11
  2025-05-02  9:53   ` Holger Hoffstätte
@ 2025-05-03  2:36     ` Alexei Starovoitov
  2025-05-04 10:24       ` Holger Hoffstätte
  0 siblings, 1 reply; 10+ messages in thread
From: Alexei Starovoitov @ 2025-05-03  2:36 UTC (permalink / raw)
  To: Holger Hoffstätte
  Cc: Quentin Monnet, Alexei Starovoitov, Daniel Borkmann,
	Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, Jiri Olsa, bpf, LKML

On Fri, May 2, 2025 at 2:53 AM Holger Hoffstätte
<holger@applied-asynchrony.com> wrote:
>
> On 2025-05-02 11:26, Quentin Monnet wrote:
> > On 02/05/2025 09:57, Holger Hoffstätte wrote:
> >> A gcc-15-based bpf toolchain defaults to C23 and fails to compile various
> >> kernel headers due to their use of a custom 'bool' type.
> >> Explicitly using -std=gnu11 works with both clang and bpf-toolchain.
> >>
> >> Signed-off-by: Holger Hoffstätte <holger@applied-asynchrony.com>
> >
> > Thanks! I tested that it still works with clang.
> >
> > Acked-by: Quentin Monnet <qmo@kernel.org>
>
> Thanks!
>
> > I didn't manage to compile with gcc, though. I tried with gcc 15.1.1 but
> > option '--target=bpf' is apparently unrecognised by the gcc version on
> > my setup.
> >
> > Out of curiosity, how did you build using gcc for the skeleton? Was it
> > enough to run "CLANG=gcc make"? Does it pass the clang-bpf-co-re build
> > probe successfully?
>
> I'm on Gentoo where we have a gcc-14/15 based "bpf-toolchain" package,
> which is just gcc configured & packaged for the bpf target.
> Our bpftool package can be built with clang (default) or without, in
> which case it depend on the bpf-toolchain. The idea is to gradually
> allow bpf/xdp tooling to build/run without requiring clang.
>
> The --target definition is conditional and removed when not using clang:
> https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-util/bpftool/bpftool-7.5.0.ebuild?id=bf70fbf7b0dc97fbc97af579954ea81a8df36113#n94
>
> The bug for building with the new gcc-15 based toolchain where this
> patch originated is here: https://bugs.gentoo.org/955156

So you're fixing this build error:

bpf-unknown-none-gcc \
        -I. \
        -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/include/uapi/
\
        -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/src/bootstrap/libbpf/include
\
        -g -O2 -Wall -fno-stack-protector \
         -c skeleton/profiler.bpf.c -o profiler.bpf.o
In file included from skeleton/profiler.bpf.c:3:
./vmlinux.h:5: warning: ignoring '#pragma clang attribute' [-Wunknown-pragmas]
    5 | #pragma clang attribute push
(__attribute__((preserve_access_index)), apply_to = record)
./vmlinux.h:9845:9: error: cannot use keyword 'false' as enumeration constant
 9845 |         false = 0,
      |         ^~~~~
./vmlinux.h:9845:9: note: 'false' is a keyword with '-std=c23' onwards
./vmlinux.h:31137:15: error: 'bool' cannot be defined via 'typedef'
31137 | typedef _Bool bool;
      |               ^~~~

with -std=gnu11 flag and
ignoring an important warning ?

It's a good thing that the build broke.
-std=gnu11 will silence the error, but that warning will still be there
and the generated bpf program will be broken.
End result: partially functional bpftool,
and users will have no idea why some features of bpftool are not working.

pw-bot: cr

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] bpftool: build bpf bits with -std=gnu11
  2025-05-03  2:36     ` Alexei Starovoitov
@ 2025-05-04 10:24       ` Holger Hoffstätte
  2025-05-06 21:04         ` Andrii Nakryiko
  0 siblings, 1 reply; 10+ messages in thread
From: Holger Hoffstätte @ 2025-05-04 10:24 UTC (permalink / raw)
  To: Alexei Starovoitov
  Cc: Quentin Monnet, Alexei Starovoitov, Daniel Borkmann,
	Andrii Nakryiko, Martin KaFai Lau, Eduard Zingerman, Song Liu,
	Yonghong Song, John Fastabend, KP Singh, Stanislav Fomichev,
	Hao Luo, Jiri Olsa, bpf, LKML

On 2025-05-03 04:36, Alexei Starovoitov wrote:
> On Fri, May 2, 2025 at 2:53 AM Holger Hoffstätte
> <holger@applied-asynchrony.com> wrote:
>>
>> On 2025-05-02 11:26, Quentin Monnet wrote:
>>> On 02/05/2025 09:57, Holger Hoffstätte wrote:
>>>> A gcc-15-based bpf toolchain defaults to C23 and fails to compile various
>>>> kernel headers due to their use of a custom 'bool' type.
>>>> Explicitly using -std=gnu11 works with both clang and bpf-toolchain.
>>>>
>>>> Signed-off-by: Holger Hoffstätte <holger@applied-asynchrony.com>
>>>
>>> Thanks! I tested that it still works with clang.
>>>
>>> Acked-by: Quentin Monnet <qmo@kernel.org>
>>
>> Thanks!
>>
>>> I didn't manage to compile with gcc, though. I tried with gcc 15.1.1 but
>>> option '--target=bpf' is apparently unrecognised by the gcc version on
>>> my setup.
>>>
>>> Out of curiosity, how did you build using gcc for the skeleton? Was it
>>> enough to run "CLANG=gcc make"? Does it pass the clang-bpf-co-re build
>>> probe successfully?
>>
>> I'm on Gentoo where we have a gcc-14/15 based "bpf-toolchain" package,
>> which is just gcc configured & packaged for the bpf target.
>> Our bpftool package can be built with clang (default) or without, in
>> which case it depend on the bpf-toolchain. The idea is to gradually
>> allow bpf/xdp tooling to build/run without requiring clang.
>>
>> The --target definition is conditional and removed when not using clang:
>> https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-util/bpftool/bpftool-7.5.0.ebuild?id=bf70fbf7b0dc97fbc97af579954ea81a8df36113#n94
>>
>> The bug for building with the new gcc-15 based toolchain where this
>> patch originated is here: https://bugs.gentoo.org/955156
> 
> So you're fixing this build error:
> 
> bpf-unknown-none-gcc \
>          -I. \
>          -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/include/uapi/
> \
>          -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/src/bootstrap/libbpf/include
> \
>          -g -O2 -Wall -fno-stack-protector \
>           -c skeleton/profiler.bpf.c -o profiler.bpf.o
> In file included from skeleton/profiler.bpf.c:3:
> ./vmlinux.h:5: warning: ignoring '#pragma clang attribute' [-Wunknown-pragmas]
>      5 | #pragma clang attribute push
> (__attribute__((preserve_access_index)), apply_to = record)
> ./vmlinux.h:9845:9: error: cannot use keyword 'false' as enumeration constant
>   9845 |         false = 0,
>        |         ^~~~~
> ./vmlinux.h:9845:9: note: 'false' is a keyword with '-std=c23' onwards
> ./vmlinux.h:31137:15: error: 'bool' cannot be defined via 'typedef'
> 31137 | typedef _Bool bool;
>        |               ^~~~
> 
> with -std=gnu11 flag and

Yes, correct. This is the same as all over the kernel or the bpf tests
for handling C23. I fully understand that this particular patch is only
one piece of the puzzle.

> ignoring an important warning ?

Nobody is (or was) ignoring the warning - it was under discussion when
I posted the patch. After reaching out to Oracle to verify, we have now
added the BPF_NO_PRESERVE_ACCESS_INDEX define when building with gcc-bpf;
this resolves the warning, just like in the bpf self-tests.

You are right that such an addition to the in-kernel bpftool build is
still missing. If you have a suggestion on how best to do that via the
existing Makefile I'm all ears.

As for the remaining warnings - we are also very aware of the ongoing
upstream work to support btf_type_tag:
https://gcc.gnu.org/pipermail/gcc-patches/2025-April/682340.html.

> End result: partially functional bpftool,
> and users will have no idea why some features of bpftool are not working.

First of all this is never shipped to any users; using gcc-bpf requires
active opt-in by developers or users, and now also warns that such a setup
may result in unexpected bugs due to ongoing work in both Linux and bpftool.
Like I said before, by default everyone builds with clang and that is also
true for our distributed binaries.

If you think adding the -std=gnu11 bit is inappropriate at this time then
just ignore this patch for now. Sooner or later the bpftool build will have
to be adapted with BPF_CFLAGS (liek in the selftests) and hopefuilly an
abstracted BPF_CC so that we no longer have to pretend to be clang when
using gcc.

cheers
Holger

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] bpftool: build bpf bits with -std=gnu11
  2025-05-04 10:24       ` Holger Hoffstätte
@ 2025-05-06 21:04         ` Andrii Nakryiko
  2025-05-06 21:41           ` Ihor Solodrai
  0 siblings, 1 reply; 10+ messages in thread
From: Andrii Nakryiko @ 2025-05-06 21:04 UTC (permalink / raw)
  To: Holger Hoffstätte
  Cc: Alexei Starovoitov, Quentin Monnet, Alexei Starovoitov,
	Daniel Borkmann, Andrii Nakryiko, Martin KaFai Lau,
	Eduard Zingerman, Song Liu, Yonghong Song, John Fastabend,
	KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, bpf, LKML

On Sun, May 4, 2025 at 3:24 AM Holger Hoffstätte
<holger@applied-asynchrony.com> wrote:
>
> On 2025-05-03 04:36, Alexei Starovoitov wrote:
> > On Fri, May 2, 2025 at 2:53 AM Holger Hoffstätte
> > <holger@applied-asynchrony.com> wrote:
> >>
> >> On 2025-05-02 11:26, Quentin Monnet wrote:
> >>> On 02/05/2025 09:57, Holger Hoffstätte wrote:
> >>>> A gcc-15-based bpf toolchain defaults to C23 and fails to compile various
> >>>> kernel headers due to their use of a custom 'bool' type.
> >>>> Explicitly using -std=gnu11 works with both clang and bpf-toolchain.
> >>>>
> >>>> Signed-off-by: Holger Hoffstätte <holger@applied-asynchrony.com>
> >>>
> >>> Thanks! I tested that it still works with clang.
> >>>
> >>> Acked-by: Quentin Monnet <qmo@kernel.org>
> >>
> >> Thanks!
> >>
> >>> I didn't manage to compile with gcc, though. I tried with gcc 15.1.1 but
> >>> option '--target=bpf' is apparently unrecognised by the gcc version on
> >>> my setup.
> >>>
> >>> Out of curiosity, how did you build using gcc for the skeleton? Was it
> >>> enough to run "CLANG=gcc make"? Does it pass the clang-bpf-co-re build
> >>> probe successfully?
> >>
> >> I'm on Gentoo where we have a gcc-14/15 based "bpf-toolchain" package,
> >> which is just gcc configured & packaged for the bpf target.
> >> Our bpftool package can be built with clang (default) or without, in
> >> which case it depend on the bpf-toolchain. The idea is to gradually
> >> allow bpf/xdp tooling to build/run without requiring clang.
> >>
> >> The --target definition is conditional and removed when not using clang:
> >> https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-util/bpftool/bpftool-7.5.0.ebuild?id=bf70fbf7b0dc97fbc97af579954ea81a8df36113#n94
> >>
> >> The bug for building with the new gcc-15 based toolchain where this
> >> patch originated is here: https://bugs.gentoo.org/955156
> >
> > So you're fixing this build error:
> >
> > bpf-unknown-none-gcc \
> >          -I. \
> >          -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/include/uapi/
> > \
> >          -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/src/bootstrap/libbpf/include
> > \
> >          -g -O2 -Wall -fno-stack-protector \
> >           -c skeleton/profiler.bpf.c -o profiler.bpf.o
> > In file included from skeleton/profiler.bpf.c:3:
> > ./vmlinux.h:5: warning: ignoring '#pragma clang attribute' [-Wunknown-pragmas]
> >      5 | #pragma clang attribute push
> > (__attribute__((preserve_access_index)), apply_to = record)
> > ./vmlinux.h:9845:9: error: cannot use keyword 'false' as enumeration constant
> >   9845 |         false = 0,
> >        |         ^~~~~
> > ./vmlinux.h:9845:9: note: 'false' is a keyword with '-std=c23' onwards
> > ./vmlinux.h:31137:15: error: 'bool' cannot be defined via 'typedef'
> > 31137 | typedef _Bool bool;
> >        |               ^~~~
> >
> > with -std=gnu11 flag and
>
> Yes, correct. This is the same as all over the kernel or the bpf tests
> for handling C23. I fully understand that this particular patch is only
> one piece of the puzzle.
>

What's the best way to detect (at compile time) whether bool, false,
and true are treated as reserved keywords? To solve this properly
vmlinux.h would have to be adjusted by vmlinux.h to avoid emitting
bool/false/true *iff* compiler version/mode doesn't like that

> > ignoring an important warning ?
>
> Nobody is (or was) ignoring the warning - it was under discussion when
> I posted the patch. After reaching out to Oracle to verify, we have now
> added the BPF_NO_PRESERVE_ACCESS_INDEX define when building with gcc-bpf;
> this resolves the warning, just like in the bpf self-tests.
>
> You are right that such an addition to the in-kernel bpftool build is
> still missing. If you have a suggestion on how best to do that via the
> existing Makefile I'm all ears.
>
> As for the remaining warnings - we are also very aware of the ongoing
> upstream work to support btf_type_tag:
> https://gcc.gnu.org/pipermail/gcc-patches/2025-April/682340.html.
>
> > End result: partially functional bpftool,
> > and users will have no idea why some features of bpftool are not working.
>
> First of all this is never shipped to any users; using gcc-bpf requires
> active opt-in by developers or users, and now also warns that such a setup
> may result in unexpected bugs due to ongoing work in both Linux and bpftool.
> Like I said before, by default everyone builds with clang and that is also
> true for our distributed binaries.
>
> If you think adding the -std=gnu11 bit is inappropriate at this time then
> just ignore this patch for now. Sooner or later the bpftool build will have
> to be adapted with BPF_CFLAGS (liek in the selftests) and hopefuilly an
> abstracted BPF_CC so that we no longer have to pretend to be clang when
> using gcc.
>
> cheers
> Holger

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] bpftool: build bpf bits with -std=gnu11
  2025-05-06 21:04         ` Andrii Nakryiko
@ 2025-05-06 21:41           ` Ihor Solodrai
  2025-05-06 22:23             ` Andrii Nakryiko
  0 siblings, 1 reply; 10+ messages in thread
From: Ihor Solodrai @ 2025-05-06 21:41 UTC (permalink / raw)
  To: Andrii Nakryiko, Holger Hoffstätte
  Cc: Alexei Starovoitov, Quentin Monnet, Alexei Starovoitov,
	Daniel Borkmann, Andrii Nakryiko, Martin KaFai Lau,
	Eduard Zingerman, Song Liu, Yonghong Song, John Fastabend,
	KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa, bpf, LKML

On 2025-05-06 2:04 p.m., Andrii Nakryiko wrote:
 > On Sun, May 4, 2025 at 3:24 AM Holger Hoffstätte
 > <holger@applied-asynchrony.com> wrote:
 >>
 >> On 2025-05-03 04:36, Alexei Starovoitov wrote:
 >>> On Fri, May 2, 2025 at 2:53 AM Holger Hoffstätte
 >>> <holger@applied-asynchrony.com> wrote:
 >>>>
 >>>> On 2025-05-02 11:26, Quentin Monnet wrote:
 >>>>> On 02/05/2025 09:57, Holger Hoffstätte wrote:
 >>>>>> A gcc-15-based bpf toolchain defaults to C23 and fails to 
compile various
 >>>>>> kernel headers due to their use of a custom 'bool' type.
 >>>>>> Explicitly using -std=gnu11 works with both clang and bpf-toolchain.
 >>>>>>
 >>>>>> Signed-off-by: Holger Hoffstätte <holger@applied-asynchrony.com>
 >>>>>
 >>>>> Thanks! I tested that it still works with clang.
 >>>>>
 >>>>> Acked-by: Quentin Monnet <qmo@kernel.org>
 >>>>
 >>>> Thanks!
 >>>>
 >>>>> I didn't manage to compile with gcc, though. I tried with gcc 
15.1.1 but
 >>>>> option '--target=bpf' is apparently unrecognised by the gcc 
version on
 >>>>> my setup.
 >>>>>
 >>>>> Out of curiosity, how did you build using gcc for the skeleton? 
Was it
 >>>>> enough to run "CLANG=gcc make"? Does it pass the clang-bpf-co-re 
build
 >>>>> probe successfully?
 >>>>
 >>>> I'm on Gentoo where we have a gcc-14/15 based "bpf-toolchain" package,
 >>>> which is just gcc configured & packaged for the bpf target.
 >>>> Our bpftool package can be built with clang (default) or without, in
 >>>> which case it depend on the bpf-toolchain. The idea is to gradually
 >>>> allow bpf/xdp tooling to build/run without requiring clang.
 >>>>
 >>>> The --target definition is conditional and removed when not using 
clang:
 >>>> 
https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-util/bpftool/bpftool-7.5.0.ebuild?id=bf70fbf7b0dc97fbc97af579954ea81a8df36113#n94
 >>>>
 >>>> The bug for building with the new gcc-15 based toolchain where this
 >>>> patch originated is here: https://bugs.gentoo.org/955156
 >>>
 >>> So you're fixing this build error:
 >>>
 >>> bpf-unknown-none-gcc \
 >>>           -I. \
 >>> 
-I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/include/uapi/
 >>> \
 >>> 
-I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/src/bootstrap/libbpf/include
 >>> \
 >>>           -g -O2 -Wall -fno-stack-protector \
 >>>            -c skeleton/profiler.bpf.c -o profiler.bpf.o
 >>> In file included from skeleton/profiler.bpf.c:3:
 >>> ./vmlinux.h:5: warning: ignoring '#pragma clang attribute' 
[-Wunknown-pragmas]
 >>>       5 | #pragma clang attribute push
 >>> (__attribute__((preserve_access_index)), apply_to = record)
 >>> ./vmlinux.h:9845:9: error: cannot use keyword 'false' as 
enumeration constant
 >>>    9845 |         false = 0,
 >>>         |         ^~~~~
 >>> ./vmlinux.h:9845:9: note: 'false' is a keyword with '-std=c23' onwards
 >>> ./vmlinux.h:31137:15: error: 'bool' cannot be defined via 'typedef'
 >>> 31137 | typedef _Bool bool;
 >>>         |               ^~~~
 >>>
 >>> with -std=gnu11 flag and
 >>
 >> Yes, correct. This is the same as all over the kernel or the bpf tests
 >> for handling C23. I fully understand that this particular patch is only
 >> one piece of the puzzle.
 >>
 >
 > What's the best way to detect (at compile time) whether bool, false,
 > and true are treated as reserved keywords? To solve this properly
 > vmlinux.h would have to be adjusted by vmlinux.h to avoid emitting
 > bool/false/true *iff* compiler version/mode doesn't like that
I ran into this when adding GCC BPF to CI [1].

One can do something like:

      #if __STDC_VERSION__ < 202311L
      enum {
          false = 0,
          true = 1,
      };
      #endif

But in case of vmlinux.h this would require hacking bpftool, and so for 
selftests/bpf we decided to pass -std=gnu11 [2].

[1] 
https://lore.kernel.org/bpf/CAADnVQKNqdLW1bpvCpVV3yNizwra0cCkBnAbsNp3rTmi8WFcvQ@mail.gmail.com/
[2] 
https://lore.kernel.org/bpf/20250107235813.2964472-1-ihor.solodrai@pm.me/

 >
 >>> ignoring an important warning ?
 >>
 >> Nobody is (or was) ignoring the warning - it was under discussion when
 >> I posted the patch. After reaching out to Oracle to verify, we have now
 >> added the BPF_NO_PRESERVE_ACCESS_INDEX define when building with 
gcc-bpf;
 >> this resolves the warning, just like in the bpf self-tests.
 >>
 >> You are right that such an addition to the in-kernel bpftool build is
 >> still missing. If you have a suggestion on how best to do that via the
 >> existing Makefile I'm all ears.
 >>
 >> As for the remaining warnings - we are also very aware of the ongoing
 >> upstream work to support btf_type_tag:
 >> https://gcc.gnu.org/pipermail/gcc-patches/2025-April/682340.html.
 >>
 >>> End result: partially functional bpftool,
 >>> and users will have no idea why some features of bpftool are not 
working.
 >>
 >> First of all this is never shipped to any users; using gcc-bpf requires
 >> active opt-in by developers or users, and now also warns that such a 
setup
 >> may result in unexpected bugs due to ongoing work in both Linux and 
bpftool.
 >> Like I said before, by default everyone builds with clang and that 
is also
 >> true for our distributed binaries.
 >>
 >> If you think adding the -std=gnu11 bit is inappropriate at this time 
then
 >> just ignore this patch for now. Sooner or later the bpftool build 
will have
 >> to be adapted with BPF_CFLAGS (liek in the selftests) and hopefuilly an
 >> abstracted BPF_CC so that we no longer have to pretend to be clang when
 >> using gcc.
 >>
 >> cheers
 >> Holger

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] bpftool: build bpf bits with -std=gnu11
  2025-05-06 21:41           ` Ihor Solodrai
@ 2025-05-06 22:23             ` Andrii Nakryiko
  2025-05-06 22:34               ` Ihor Solodrai
  0 siblings, 1 reply; 10+ messages in thread
From: Andrii Nakryiko @ 2025-05-06 22:23 UTC (permalink / raw)
  To: Ihor Solodrai
  Cc: Holger Hoffstätte, Alexei Starovoitov, Quentin Monnet,
	Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
	Martin KaFai Lau, Eduard Zingerman, Song Liu, Yonghong Song,
	John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
	bpf, LKML

On Tue, May 6, 2025 at 2:41 PM Ihor Solodrai <ihor.solodrai@linux.dev> wrote:
>
> On 2025-05-06 2:04 p.m., Andrii Nakryiko wrote:
>  > On Sun, May 4, 2025 at 3:24 AM Holger Hoffstätte
>  > <holger@applied-asynchrony.com> wrote:
>  >>
>  >> On 2025-05-03 04:36, Alexei Starovoitov wrote:
>  >>> On Fri, May 2, 2025 at 2:53 AM Holger Hoffstätte
>  >>> <holger@applied-asynchrony.com> wrote:
>  >>>>
>  >>>> On 2025-05-02 11:26, Quentin Monnet wrote:
>  >>>>> On 02/05/2025 09:57, Holger Hoffstätte wrote:
>  >>>>>> A gcc-15-based bpf toolchain defaults to C23 and fails to
> compile various
>  >>>>>> kernel headers due to their use of a custom 'bool' type.
>  >>>>>> Explicitly using -std=gnu11 works with both clang and bpf-toolchain.
>  >>>>>>
>  >>>>>> Signed-off-by: Holger Hoffstätte <holger@applied-asynchrony.com>
>  >>>>>
>  >>>>> Thanks! I tested that it still works with clang.
>  >>>>>
>  >>>>> Acked-by: Quentin Monnet <qmo@kernel.org>
>  >>>>
>  >>>> Thanks!
>  >>>>
>  >>>>> I didn't manage to compile with gcc, though. I tried with gcc
> 15.1.1 but
>  >>>>> option '--target=bpf' is apparently unrecognised by the gcc
> version on
>  >>>>> my setup.
>  >>>>>
>  >>>>> Out of curiosity, how did you build using gcc for the skeleton?
> Was it
>  >>>>> enough to run "CLANG=gcc make"? Does it pass the clang-bpf-co-re
> build
>  >>>>> probe successfully?
>  >>>>
>  >>>> I'm on Gentoo where we have a gcc-14/15 based "bpf-toolchain" package,
>  >>>> which is just gcc configured & packaged for the bpf target.
>  >>>> Our bpftool package can be built with clang (default) or without, in
>  >>>> which case it depend on the bpf-toolchain. The idea is to gradually
>  >>>> allow bpf/xdp tooling to build/run without requiring clang.
>  >>>>
>  >>>> The --target definition is conditional and removed when not using
> clang:
>  >>>>
> https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-util/bpftool/bpftool-7.5.0.ebuild?id=bf70fbf7b0dc97fbc97af579954ea81a8df36113#n94
>  >>>>
>  >>>> The bug for building with the new gcc-15 based toolchain where this
>  >>>> patch originated is here: https://bugs.gentoo.org/955156
>  >>>
>  >>> So you're fixing this build error:
>  >>>
>  >>> bpf-unknown-none-gcc \
>  >>>           -I. \
>  >>>
> -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/include/uapi/
>  >>> \
>  >>>
> -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/src/bootstrap/libbpf/include
>  >>> \
>  >>>           -g -O2 -Wall -fno-stack-protector \
>  >>>            -c skeleton/profiler.bpf.c -o profiler.bpf.o
>  >>> In file included from skeleton/profiler.bpf.c:3:
>  >>> ./vmlinux.h:5: warning: ignoring '#pragma clang attribute'
> [-Wunknown-pragmas]
>  >>>       5 | #pragma clang attribute push
>  >>> (__attribute__((preserve_access_index)), apply_to = record)
>  >>> ./vmlinux.h:9845:9: error: cannot use keyword 'false' as
> enumeration constant
>  >>>    9845 |         false = 0,
>  >>>         |         ^~~~~
>  >>> ./vmlinux.h:9845:9: note: 'false' is a keyword with '-std=c23' onwards
>  >>> ./vmlinux.h:31137:15: error: 'bool' cannot be defined via 'typedef'
>  >>> 31137 | typedef _Bool bool;
>  >>>         |               ^~~~
>  >>>
>  >>> with -std=gnu11 flag and
>  >>
>  >> Yes, correct. This is the same as all over the kernel or the bpf tests
>  >> for handling C23. I fully understand that this particular patch is only
>  >> one piece of the puzzle.
>  >>
>  >
>  > What's the best way to detect (at compile time) whether bool, false,
>  > and true are treated as reserved keywords? To solve this properly
>  > vmlinux.h would have to be adjusted by vmlinux.h to avoid emitting
>  > bool/false/true *iff* compiler version/mode doesn't like that
> I ran into this when adding GCC BPF to CI [1].
>
> One can do something like:
>
>       #if __STDC_VERSION__ < 202311L
>       enum {
>           false = 0,
>           true = 1,
>       };
>       #endif
>
> But in case of vmlinux.h this would require hacking bpftool, and so for
> selftests/bpf we decided to pass -std=gnu11 [2].

We can adjust btf_dump_is_blacklisted() to ignore bool typedef
(unconditionally), and we'll need to ignore anon enum with false/true
(which is annoying), and then bpftool will unconditionally add the
above block plus typedef _Bool bool.

Would that work?

>
> [1]
> https://lore.kernel.org/bpf/CAADnVQKNqdLW1bpvCpVV3yNizwra0cCkBnAbsNp3rTmi8WFcvQ@mail.gmail.com/
> [2]
> https://lore.kernel.org/bpf/20250107235813.2964472-1-ihor.solodrai@pm.me/
>
>  >
>  >>> ignoring an important warning ?
>  >>
>  >> Nobody is (or was) ignoring the warning - it was under discussion when
>  >> I posted the patch. After reaching out to Oracle to verify, we have now
>  >> added the BPF_NO_PRESERVE_ACCESS_INDEX define when building with
> gcc-bpf;
>  >> this resolves the warning, just like in the bpf self-tests.
>  >>
>  >> You are right that such an addition to the in-kernel bpftool build is
>  >> still missing. If you have a suggestion on how best to do that via the
>  >> existing Makefile I'm all ears.
>  >>
>  >> As for the remaining warnings - we are also very aware of the ongoing
>  >> upstream work to support btf_type_tag:
>  >> https://gcc.gnu.org/pipermail/gcc-patches/2025-April/682340.html.
>  >>
>  >>> End result: partially functional bpftool,
>  >>> and users will have no idea why some features of bpftool are not
> working.
>  >>
>  >> First of all this is never shipped to any users; using gcc-bpf requires
>  >> active opt-in by developers or users, and now also warns that such a
> setup
>  >> may result in unexpected bugs due to ongoing work in both Linux and
> bpftool.
>  >> Like I said before, by default everyone builds with clang and that
> is also
>  >> true for our distributed binaries.
>  >>
>  >> If you think adding the -std=gnu11 bit is inappropriate at this time
> then
>  >> just ignore this patch for now. Sooner or later the bpftool build
> will have
>  >> to be adapted with BPF_CFLAGS (liek in the selftests) and hopefuilly an
>  >> abstracted BPF_CC so that we no longer have to pretend to be clang when
>  >> using gcc.
>  >>
>  >> cheers
>  >> Holger

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] bpftool: build bpf bits with -std=gnu11
  2025-05-06 22:23             ` Andrii Nakryiko
@ 2025-05-06 22:34               ` Ihor Solodrai
  2025-05-06 23:34                 ` Andrii Nakryiko
  0 siblings, 1 reply; 10+ messages in thread
From: Ihor Solodrai @ 2025-05-06 22:34 UTC (permalink / raw)
  To: Andrii Nakryiko
  Cc: Holger Hoffstätte, Alexei Starovoitov, Quentin Monnet,
	Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
	Martin KaFai Lau, Eduard Zingerman, Song Liu, Yonghong Song,
	John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
	bpf, LKML

On 2025-05-06 3:23 p.m., Andrii Nakryiko wrote:
> On Tue, May 6, 2025 at 2:41 PM Ihor Solodrai <ihor.solodrai@linux.dev> wrote:
>>
>> On 2025-05-06 2:04 p.m., Andrii Nakryiko wrote:
>>   > On Sun, May 4, 2025 at 3:24 AM Holger Hoffstätte
>>   > <holger@applied-asynchrony.com> wrote:
>>   >>
>>   >> On 2025-05-03 04:36, Alexei Starovoitov wrote:
>>   >>> On Fri, May 2, 2025 at 2:53 AM Holger Hoffstätte
>>   >>> <holger@applied-asynchrony.com> wrote:
>>   >>>>
>>   >>>> On 2025-05-02 11:26, Quentin Monnet wrote:
>>   >>>>> On 02/05/2025 09:57, Holger Hoffstätte wrote:
>>   >>>>>> A gcc-15-based bpf toolchain defaults to C23 and fails to
>> compile various
>>   >>>>>> kernel headers due to their use of a custom 'bool' type.
>>   >>>>>> Explicitly using -std=gnu11 works with both clang and bpf-toolchain.
>>   >>>>>>
>>   >>>>>> Signed-off-by: Holger Hoffstätte <holger@applied-asynchrony.com>
>>   >>>>>
>>   >>>>> Thanks! I tested that it still works with clang.
>>   >>>>>
>>   >>>>> Acked-by: Quentin Monnet <qmo@kernel.org>
>>   >>>>
>>   >>>> Thanks!
>>   >>>>
>>   >>>>> I didn't manage to compile with gcc, though. I tried with gcc
>> 15.1.1 but
>>   >>>>> option '--target=bpf' is apparently unrecognised by the gcc
>> version on
>>   >>>>> my setup.
>>   >>>>>
>>   >>>>> Out of curiosity, how did you build using gcc for the skeleton?
>> Was it
>>   >>>>> enough to run "CLANG=gcc make"? Does it pass the clang-bpf-co-re
>> build
>>   >>>>> probe successfully?
>>   >>>>
>>   >>>> I'm on Gentoo where we have a gcc-14/15 based "bpf-toolchain" package,
>>   >>>> which is just gcc configured & packaged for the bpf target.
>>   >>>> Our bpftool package can be built with clang (default) or without, in
>>   >>>> which case it depend on the bpf-toolchain. The idea is to gradually
>>   >>>> allow bpf/xdp tooling to build/run without requiring clang.
>>   >>>>
>>   >>>> The --target definition is conditional and removed when not using
>> clang:
>>   >>>>
>> https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-util/bpftool/bpftool-7.5.0.ebuild?id=bf70fbf7b0dc97fbc97af579954ea81a8df36113#n94
>>   >>>>
>>   >>>> The bug for building with the new gcc-15 based toolchain where this
>>   >>>> patch originated is here: https://bugs.gentoo.org/955156
>>   >>>
>>   >>> So you're fixing this build error:
>>   >>>
>>   >>> bpf-unknown-none-gcc \
>>   >>>           -I. \
>>   >>>
>> -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/include/uapi/
>>   >>> \
>>   >>>
>> -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/src/bootstrap/libbpf/include
>>   >>> \
>>   >>>           -g -O2 -Wall -fno-stack-protector \
>>   >>>            -c skeleton/profiler.bpf.c -o profiler.bpf.o
>>   >>> In file included from skeleton/profiler.bpf.c:3:
>>   >>> ./vmlinux.h:5: warning: ignoring '#pragma clang attribute'
>> [-Wunknown-pragmas]
>>   >>>       5 | #pragma clang attribute push
>>   >>> (__attribute__((preserve_access_index)), apply_to = record)
>>   >>> ./vmlinux.h:9845:9: error: cannot use keyword 'false' as
>> enumeration constant
>>   >>>    9845 |         false = 0,
>>   >>>         |         ^~~~~
>>   >>> ./vmlinux.h:9845:9: note: 'false' is a keyword with '-std=c23' onwards
>>   >>> ./vmlinux.h:31137:15: error: 'bool' cannot be defined via 'typedef'
>>   >>> 31137 | typedef _Bool bool;
>>   >>>         |               ^~~~
>>   >>>
>>   >>> with -std=gnu11 flag and
>>   >>
>>   >> Yes, correct. This is the same as all over the kernel or the bpf tests
>>   >> for handling C23. I fully understand that this particular patch is only
>>   >> one piece of the puzzle.
>>   >>
>>   >
>>   > What's the best way to detect (at compile time) whether bool, false,
>>   > and true are treated as reserved keywords? To solve this properly
>>   > vmlinux.h would have to be adjusted by vmlinux.h to avoid emitting
>>   > bool/false/true *iff* compiler version/mode doesn't like that
>>
>> I ran into this when adding GCC BPF to CI [1].
>>
>> One can do something like:
>>
>>        #if __STDC_VERSION__ < 202311L
>>        enum {
>>            false = 0,
>>            true = 1,
>>        };
>>        #endif
>>
>> But in case of vmlinux.h this would require hacking bpftool, and so for
>> selftests/bpf we decided to pass -std=gnu11 [2].
> 
> We can adjust btf_dump_is_blacklisted() to ignore bool typedef
> (unconditionally), and we'll need to ignore anon enum with false/true
> (which is annoying), and then bpftool will unconditionally add the
> above block plus typedef _Bool bool.
> 
> Would that work?

I think yes, but then the question is why do all this work in bpftool 
instead of passing -std=gnu11 to the compiler? Especially given that 
kernel is built with such flags:

$ grep -r --include="[Mm]akefile" 'std=gnu'

     arch/arm64/kernel/vdso32/Makefile:               -std=gnu11
     arch/loongarch/vdso/Makefile:   -std=gnu11 -O2 -g 
-fno-strict-aliasing -fno-common -fno-builtin \
     arch/s390/Makefile:KBUILD_CFLAGS_DECOMPRESSOR := $(CLANG_FLAGS) 
-m64 -O2 -mpacked-stack -std=gnu11
     arch/s390/purgatory/Makefile:KBUILD_CFLAGS := -std=gnu11 
-fno-strict-aliasing -Wall -Wstrict-prototypes
     arch/x86/Makefile:REALMODE_CFLAGS       := -std=gnu11 -m16 -g -Os 
-DDISABLE_BRANCH_PROFILING -D__DISABLE_EXPORTS \
     arch/x86/boot/compressed/Makefile:KBUILD_CFLAGS += -std=gnu11
     drivers/firmware/efi/libstub/Makefile:cflags-$(CONFIG_X86) 
     += -m$(BITS) -D__KERNEL__ -std=gnu11 \
     tools/build/feature/Makefile:   $(BUILDXX) -std=gnu++11
     tools/build/feature/Makefile:   $(BUILDXX) -std=gnu++17 
                     \
     tools/build/feature/Makefile:   $(BUILDXX) -std=gnu++17 
                     \
     tools/build/feature/Makefile:   $(BUILDXX) -std=gnu++17 
                     \
     tools/lib/api/Makefile:CFLAGS += -ggdb3 -Wall -Wextra -std=gnu99 
-U_FORTIFY_SOURCE -fPIC
     tools/lib/bpf/Makefile:override CFLAGS += -std=gnu89
     tools/lib/subcmd/Makefile:CFLAGS := -ggdb3 -Wall -Wextra -std=gnu99 
-fPIC
     tools/lib/symbol/Makefile:CFLAGS += -ggdb3 -Wall -Wextra -std=gnu11 
-U_FORTIFY_SOURCE -fPIC
     tools/net/ynl/generated/Makefile:CFLAGS += -std=gnu11 -O2 -W -Wall 
-Wextra -Wno-unused-parameter -Wshadow \
     tools/net/ynl/lib/Makefile:CFLAGS += -std=gnu11 -O2 -W -Wall 
-Wextra -Wno-unused-parameter -Wshadow
     tools/net/ynl/samples/Makefile:CFLAGS += -std=gnu11 -O2 -W -Wall 
-Wextra -Wno-unused-parameter -Wshadow \
     tools/testing/selftests/arm64/gcs/Makefile:             -std=gnu99 
-I../.. -g \
     tools/testing/selftests/arm64/mte/Makefile:CFLAGS += -std=gnu99 -I. 
-pthread
     tools/testing/selftests/arm64/signal/Makefile:CFLAGS += -std=gnu99 -I.
     tools/testing/selftests/bpf/Makefile:CFLAGS += -g $(OPT_FLAGS) 
-rdynamic -std=gnu11                             \
     tools/testing/selftests/bpf/Makefile:        -std=gnu11 
                                     \
     tools/testing/selftests/bpf/Makefile:CXXFLAGS := $(subst 
-std=gnu11,-std=gnu++11,$(CXXFLAGS))
     tools/testing/selftests/capabilities/Makefile:CFLAGS += -O2 -g 
-std=gnu99 -Wall $(KHDR_INCLUDES)
     tools/testing/selftests/clone3/Makefile:CFLAGS += -g -std=gnu99 
$(KHDR_INCLUDES)
     tools/testing/selftests/riscv/mm/Makefile:CFLAGS += -std=gnu99 -I.
     tools/testing/selftests/sync/Makefile:CFLAGS += -O2 -g -std=gnu89 
-pthread -Wall -Wextra
     tools/testing/selftests/vDSO/Makefile:CFLAGS := -std=gnu99 -O2
     tools/testing/selftests/wireguard/qemu/Makefile:        $(CC) -o $@ 
$(CFLAGS) $(LDFLAGS) -std=gnu11 $<
     tools/testing/selftests/x86/Makefile:CFLAGS := -O2 -g -std=gnu99 
-pthread -Wall $(KHDR_INCLUDES)
     Makefile:                        -O2 -fomit-frame-pointer -std=gnu11
     Makefile:KBUILD_CFLAGS += -std=gnu11

> 
>>
>> [1]
>> https://lore.kernel.org/bpf/CAADnVQKNqdLW1bpvCpVV3yNizwra0cCkBnAbsNp3rTmi8WFcvQ@mail.gmail.com/
>> [2]
>> https://lore.kernel.org/bpf/20250107235813.2964472-1-ihor.solodrai@pm.me/
>>
>>   >
>>   >>> ignoring an important warning ?
>>   >>
>>   >> Nobody is (or was) ignoring the warning - it was under discussion when
>>   >> I posted the patch. After reaching out to Oracle to verify, we have now
>>   >> added the BPF_NO_PRESERVE_ACCESS_INDEX define when building with
>> gcc-bpf;
>>   >> this resolves the warning, just like in the bpf self-tests.
>>   >>
>>   >> You are right that such an addition to the in-kernel bpftool build is
>>   >> still missing. If you have a suggestion on how best to do that via the
>>   >> existing Makefile I'm all ears.
>>   >>
>>   >> As for the remaining warnings - we are also very aware of the ongoing
>>   >> upstream work to support btf_type_tag:
>>   >> https://gcc.gnu.org/pipermail/gcc-patches/2025-April/682340.html.
>>   >>
>>   >>> End result: partially functional bpftool,
>>   >>> and users will have no idea why some features of bpftool are not
>> working.
>>   >>
>>   >> First of all this is never shipped to any users; using gcc-bpf requires
>>   >> active opt-in by developers or users, and now also warns that such a
>> setup
>>   >> may result in unexpected bugs due to ongoing work in both Linux and
>> bpftool.
>>   >> Like I said before, by default everyone builds with clang and that
>> is also
>>   >> true for our distributed binaries.
>>   >>
>>   >> If you think adding the -std=gnu11 bit is inappropriate at this time
>> then
>>   >> just ignore this patch for now. Sooner or later the bpftool build
>> will have
>>   >> to be adapted with BPF_CFLAGS (liek in the selftests) and hopefuilly an
>>   >> abstracted BPF_CC so that we no longer have to pretend to be clang when
>>   >> using gcc.
>>   >>
>>   >> cheers
>>   >> Holger


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH] bpftool: build bpf bits with -std=gnu11
  2025-05-06 22:34               ` Ihor Solodrai
@ 2025-05-06 23:34                 ` Andrii Nakryiko
  0 siblings, 0 replies; 10+ messages in thread
From: Andrii Nakryiko @ 2025-05-06 23:34 UTC (permalink / raw)
  To: Ihor Solodrai
  Cc: Holger Hoffstätte, Alexei Starovoitov, Quentin Monnet,
	Alexei Starovoitov, Daniel Borkmann, Andrii Nakryiko,
	Martin KaFai Lau, Eduard Zingerman, Song Liu, Yonghong Song,
	John Fastabend, KP Singh, Stanislav Fomichev, Hao Luo, Jiri Olsa,
	bpf, LKML

On Tue, May 6, 2025 at 3:34 PM Ihor Solodrai <ihor.solodrai@linux.dev> wrote:
>
> On 2025-05-06 3:23 p.m., Andrii Nakryiko wrote:
> > On Tue, May 6, 2025 at 2:41 PM Ihor Solodrai <ihor.solodrai@linux.dev> wrote:
> >>
> >> On 2025-05-06 2:04 p.m., Andrii Nakryiko wrote:
> >>   > On Sun, May 4, 2025 at 3:24 AM Holger Hoffstätte
> >>   > <holger@applied-asynchrony.com> wrote:
> >>   >>
> >>   >> On 2025-05-03 04:36, Alexei Starovoitov wrote:
> >>   >>> On Fri, May 2, 2025 at 2:53 AM Holger Hoffstätte
> >>   >>> <holger@applied-asynchrony.com> wrote:
> >>   >>>>
> >>   >>>> On 2025-05-02 11:26, Quentin Monnet wrote:
> >>   >>>>> On 02/05/2025 09:57, Holger Hoffstätte wrote:
> >>   >>>>>> A gcc-15-based bpf toolchain defaults to C23 and fails to
> >> compile various
> >>   >>>>>> kernel headers due to their use of a custom 'bool' type.
> >>   >>>>>> Explicitly using -std=gnu11 works with both clang and bpf-toolchain.
> >>   >>>>>>
> >>   >>>>>> Signed-off-by: Holger Hoffstätte <holger@applied-asynchrony.com>
> >>   >>>>>
> >>   >>>>> Thanks! I tested that it still works with clang.
> >>   >>>>>
> >>   >>>>> Acked-by: Quentin Monnet <qmo@kernel.org>
> >>   >>>>
> >>   >>>> Thanks!
> >>   >>>>
> >>   >>>>> I didn't manage to compile with gcc, though. I tried with gcc
> >> 15.1.1 but
> >>   >>>>> option '--target=bpf' is apparently unrecognised by the gcc
> >> version on
> >>   >>>>> my setup.
> >>   >>>>>
> >>   >>>>> Out of curiosity, how did you build using gcc for the skeleton?
> >> Was it
> >>   >>>>> enough to run "CLANG=gcc make"? Does it pass the clang-bpf-co-re
> >> build
> >>   >>>>> probe successfully?
> >>   >>>>
> >>   >>>> I'm on Gentoo where we have a gcc-14/15 based "bpf-toolchain" package,
> >>   >>>> which is just gcc configured & packaged for the bpf target.
> >>   >>>> Our bpftool package can be built with clang (default) or without, in
> >>   >>>> which case it depend on the bpf-toolchain. The idea is to gradually
> >>   >>>> allow bpf/xdp tooling to build/run without requiring clang.
> >>   >>>>
> >>   >>>> The --target definition is conditional and removed when not using
> >> clang:
> >>   >>>>
> >> https://gitweb.gentoo.org/repo/gentoo.git/tree/dev-util/bpftool/bpftool-7.5.0.ebuild?id=bf70fbf7b0dc97fbc97af579954ea81a8df36113#n94
> >>   >>>>
> >>   >>>> The bug for building with the new gcc-15 based toolchain where this
> >>   >>>> patch originated is here: https://bugs.gentoo.org/955156
> >>   >>>
> >>   >>> So you're fixing this build error:
> >>   >>>
> >>   >>> bpf-unknown-none-gcc \
> >>   >>>           -I. \
> >>   >>>
> >> -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/include/uapi/
> >>   >>> \
> >>   >>>
> >> -I/var/tmp/portage/dev-util/bpftool-7.5.0/work/bpftool-libbpf-v7.5.0-sources/src/bootstrap/libbpf/include
> >>   >>> \
> >>   >>>           -g -O2 -Wall -fno-stack-protector \
> >>   >>>            -c skeleton/profiler.bpf.c -o profiler.bpf.o
> >>   >>> In file included from skeleton/profiler.bpf.c:3:
> >>   >>> ./vmlinux.h:5: warning: ignoring '#pragma clang attribute'
> >> [-Wunknown-pragmas]
> >>   >>>       5 | #pragma clang attribute push
> >>   >>> (__attribute__((preserve_access_index)), apply_to = record)
> >>   >>> ./vmlinux.h:9845:9: error: cannot use keyword 'false' as
> >> enumeration constant
> >>   >>>    9845 |         false = 0,
> >>   >>>         |         ^~~~~
> >>   >>> ./vmlinux.h:9845:9: note: 'false' is a keyword with '-std=c23' onwards
> >>   >>> ./vmlinux.h:31137:15: error: 'bool' cannot be defined via 'typedef'
> >>   >>> 31137 | typedef _Bool bool;
> >>   >>>         |               ^~~~
> >>   >>>
> >>   >>> with -std=gnu11 flag and
> >>   >>
> >>   >> Yes, correct. This is the same as all over the kernel or the bpf tests
> >>   >> for handling C23. I fully understand that this particular patch is only
> >>   >> one piece of the puzzle.
> >>   >>
> >>   >
> >>   > What's the best way to detect (at compile time) whether bool, false,
> >>   > and true are treated as reserved keywords? To solve this properly
> >>   > vmlinux.h would have to be adjusted by vmlinux.h to avoid emitting
> >>   > bool/false/true *iff* compiler version/mode doesn't like that
> >>
> >> I ran into this when adding GCC BPF to CI [1].
> >>
> >> One can do something like:
> >>
> >>        #if __STDC_VERSION__ < 202311L
> >>        enum {
> >>            false = 0,
> >>            true = 1,
> >>        };
> >>        #endif
> >>
> >> But in case of vmlinux.h this would require hacking bpftool, and so for
> >> selftests/bpf we decided to pass -std=gnu11 [2].
> >
> > We can adjust btf_dump_is_blacklisted() to ignore bool typedef
> > (unconditionally), and we'll need to ignore anon enum with false/true
> > (which is annoying), and then bpftool will unconditionally add the
> > above block plus typedef _Bool bool.
> >
> > Would that work?
>
> I think yes, but then the question is why do all this work in bpftool
> instead of passing -std=gnu11 to the compiler? Especially given that

because -std=gnu11 is a mitigation, not a solution (at least for this
issue). The issue is that vmlinux.h (as it is right now) is not
compatible with C23 standard, which artificially limits what BPF users
can use with their .bpf.c code *just because of vmlinux.h*. Why? We
should find a solution to not depend on -std=gnu11 workarounds.

So this is not about bpftool and BPF selftests specifically, it's
about anyone using vmlinux.h.

> kernel is built with such flags:
>
> $ grep -r --include="[Mm]akefile" 'std=gnu'
>

[...]

> >
> >>
> >> [1]
> >> https://lore.kernel.org/bpf/CAADnVQKNqdLW1bpvCpVV3yNizwra0cCkBnAbsNp3rTmi8WFcvQ@mail.gmail.com/
> >> [2]
> >> https://lore.kernel.org/bpf/20250107235813.2964472-1-ihor.solodrai@pm.me/
> >>
> >>   >
> >>   >>> ignoring an important warning ?
> >>   >>
> >>   >> Nobody is (or was) ignoring the warning - it was under discussion when
> >>   >> I posted the patch. After reaching out to Oracle to verify, we have now
> >>   >> added the BPF_NO_PRESERVE_ACCESS_INDEX define when building with
> >> gcc-bpf;
> >>   >> this resolves the warning, just like in the bpf self-tests.
> >>   >>
> >>   >> You are right that such an addition to the in-kernel bpftool build is
> >>   >> still missing. If you have a suggestion on how best to do that via the
> >>   >> existing Makefile I'm all ears.
> >>   >>
> >>   >> As for the remaining warnings - we are also very aware of the ongoing
> >>   >> upstream work to support btf_type_tag:
> >>   >> https://gcc.gnu.org/pipermail/gcc-patches/2025-April/682340.html.
> >>   >>
> >>   >>> End result: partially functional bpftool,
> >>   >>> and users will have no idea why some features of bpftool are not
> >> working.
> >>   >>
> >>   >> First of all this is never shipped to any users; using gcc-bpf requires
> >>   >> active opt-in by developers or users, and now also warns that such a
> >> setup
> >>   >> may result in unexpected bugs due to ongoing work in both Linux and
> >> bpftool.
> >>   >> Like I said before, by default everyone builds with clang and that
> >> is also
> >>   >> true for our distributed binaries.
> >>   >>
> >>   >> If you think adding the -std=gnu11 bit is inappropriate at this time
> >> then
> >>   >> just ignore this patch for now. Sooner or later the bpftool build
> >> will have
> >>   >> to be adapted with BPF_CFLAGS (liek in the selftests) and hopefuilly an
> >>   >> abstracted BPF_CC so that we no longer have to pretend to be clang when
> >>   >> using gcc.
> >>   >>
> >>   >> cheers
> >>   >> Holger
>

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2025-05-06 23:34 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-05-02  8:57 [PATCH] bpftool: build bpf bits with -std=gnu11 Holger Hoffstätte
2025-05-02  9:26 ` Quentin Monnet
2025-05-02  9:53   ` Holger Hoffstätte
2025-05-03  2:36     ` Alexei Starovoitov
2025-05-04 10:24       ` Holger Hoffstätte
2025-05-06 21:04         ` Andrii Nakryiko
2025-05-06 21:41           ` Ihor Solodrai
2025-05-06 22:23             ` Andrii Nakryiko
2025-05-06 22:34               ` Ihor Solodrai
2025-05-06 23:34                 ` Andrii Nakryiko

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome