All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] libbpf: fix samples/bpf build failure due to undefined UINT32_MAX
@ 2019-04-23 20:24 Daniel T. Lee
  2019-04-23 23:26 ` Y Song
  2019-04-25 21:40 ` Daniel Borkmann
  0 siblings, 2 replies; 5+ messages in thread
From: Daniel T. Lee @ 2019-04-23 20:24 UTC (permalink / raw)
  To: Daniel Borkmann, Alexei Starovoitov; +Cc: netdev

Currently, building bpf samples will cause the following error.

    ./tools/lib/bpf/bpf.h:132:27: error: 'UINT32_MAX' undeclared here (not in a function) ..
     #define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in kernels <= 5.1 */
                               ^
    ./samples/bpf/bpf_load.h:31:25: note: in expansion of macro 'BPF_LOG_BUF_SIZE'
     extern char bpf_log_buf[BPF_LOG_BUF_SIZE];
                             ^~~~~~~~~~~~~~~~

Due to commit 4519efa6f8ea ("libbpf: fix BPF_LOG_BUF_SIZE off-by-one error")
hard-coded size of BPF_LOG_BUF_SIZE has been replaced with UINT32_MAX which is
defined in <stdint.h> header.

Even with this change, bpf selftests are running fine since these are built
with clang and it includes header(-idirafter) from clang/6.0.0/include.
(it has <stdint.h>)

    clang -I. -I./include/uapi -I../../../include/uapi -idirafter /usr/local/include -idirafter /usr/include \
    -idirafter /usr/lib/llvm-6.0/lib/clang/6.0.0/include -idirafter /usr/include/x86_64-linux-gnu \
    -Wno-compare-distinct-pointer-types -O2 -target bpf -emit-llvm -c progs/test_sysctl_prog.c -o - | \
    llc -march=bpf -mcpu=generic  -filetype=obj -o /linux/tools/testing/selftests/bpf/test_sysctl_prog.o

But bpf samples are compiled with GCC, and it only searches and includes
headers declared at the target file. As '#include <stdint.h>' hasn't been
declared in tools/lib/bpf/bpf.h, it causes build failure of bpf samples.

    gcc -Wp,-MD,./samples/bpf/.sockex3_user.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes \
    -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include -I./tools/lib/ -I./tools/testing/selftests/bpf/ \
    -I./tools/  lib/ -I./tools/include -I./tools/perf -c -o ./samples/bpf/sockex3_user.o ./samples/bpf/sockex3_user.c;

This commit add declaration of '#include <stdint.h>' to tools/lib/bpf/bpf.h
to fix this problem.

Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com>
---
 tools/lib/bpf/bpf.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
index ff2506fe6bd2..9593fec75652 100644
--- a/tools/lib/bpf/bpf.h
+++ b/tools/lib/bpf/bpf.h
@@ -26,6 +26,7 @@
 #include <linux/bpf.h>
 #include <stdbool.h>
 #include <stddef.h>
+#include <stdint.h>
 
 #ifdef __cplusplus
 extern "C" {
-- 
2.17.1


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

* Re: [PATCH] libbpf: fix samples/bpf build failure due to undefined UINT32_MAX
  2019-04-23 20:24 [PATCH] libbpf: fix samples/bpf build failure due to undefined UINT32_MAX Daniel T. Lee
@ 2019-04-23 23:26 ` Y Song
  2019-04-24  1:01   ` Daniel T. Lee
  2019-04-25 21:40 ` Daniel Borkmann
  1 sibling, 1 reply; 5+ messages in thread
From: Y Song @ 2019-04-23 23:26 UTC (permalink / raw)
  To: Daniel T. Lee; +Cc: Daniel Borkmann, Alexei Starovoitov, netdev

On Tue, Apr 23, 2019 at 1:26 PM Daniel T. Lee <danieltimlee@gmail.com> wrote:
>
> Currently, building bpf samples will cause the following error.
>
>     ./tools/lib/bpf/bpf.h:132:27: error: 'UINT32_MAX' undeclared here (not in a function) ..
>      #define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in kernels <= 5.1 */
>                                ^
>     ./samples/bpf/bpf_load.h:31:25: note: in expansion of macro 'BPF_LOG_BUF_SIZE'
>      extern char bpf_log_buf[BPF_LOG_BUF_SIZE];
>                              ^~~~~~~~~~~~~~~~
>
> Due to commit 4519efa6f8ea ("libbpf: fix BPF_LOG_BUF_SIZE off-by-one error")
> hard-coded size of BPF_LOG_BUF_SIZE has been replaced with UINT32_MAX which is
> defined in <stdint.h> header.
>
> Even with this change, bpf selftests are running fine since these are built
> with clang and it includes header(-idirafter) from clang/6.0.0/include.
> (it has <stdint.h>)
>
>     clang -I. -I./include/uapi -I../../../include/uapi -idirafter /usr/local/include -idirafter /usr/include \
>     -idirafter /usr/lib/llvm-6.0/lib/clang/6.0.0/include -idirafter /usr/include/x86_64-linux-gnu \
>     -Wno-compare-distinct-pointer-types -O2 -target bpf -emit-llvm -c progs/test_sysctl_prog.c -o - | \
>     llc -march=bpf -mcpu=generic  -filetype=obj -o /linux/tools/testing/selftests/bpf/test_sysctl_prog.o
>
> But bpf samples are compiled with GCC, and it only searches and includes
> headers declared at the target file. As '#include <stdint.h>' hasn't been
> declared in tools/lib/bpf/bpf.h, it causes build failure of bpf samples.
>
>     gcc -Wp,-MD,./samples/bpf/.sockex3_user.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes \
>     -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include -I./tools/lib/ -I./tools/testing/selftests/bpf/ \
>     -I./tools/  lib/ -I./tools/include -I./tools/perf -c -o ./samples/bpf/sockex3_user.o ./samples/bpf/sockex3_user.c;
>
> This commit add declaration of '#include <stdint.h>' to tools/lib/bpf/bpf.h
> to fix this problem.
>
> Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com>
> ---
>  tools/lib/bpf/bpf.h | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
> index ff2506fe6bd2..9593fec75652 100644
> --- a/tools/lib/bpf/bpf.h
> +++ b/tools/lib/bpf/bpf.h
> @@ -26,6 +26,7 @@
>  #include <linux/bpf.h>
>  #include <stdbool.h>
>  #include <stddef.h>
> +#include <stdint.h>

I my case, I have the following in /usr/include/linux/bpf.h:
  #include <linux/types.h>
  #include <linux/bpf_common.h>

The <linux/bpf.h> is included in tools/lib/bpf/bpf.h.

and at tools/include/linux/types.h, I got
#include <stdbool.h>
#include <stddef.h>
#include <stdint.h>

So I don't have any issues.
Could you check your system whether any of the above files
missing or mismatched during compilation process?

>
>  #ifdef __cplusplus
>  extern "C" {
> --
> 2.17.1
>

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

* Re: [PATCH] libbpf: fix samples/bpf build failure due to undefined UINT32_MAX
  2019-04-23 23:26 ` Y Song
@ 2019-04-24  1:01   ` Daniel T. Lee
  2019-04-24  6:04     ` Y Song
  0 siblings, 1 reply; 5+ messages in thread
From: Daniel T. Lee @ 2019-04-24  1:01 UTC (permalink / raw)
  To: Y Song; +Cc: Daniel Borkmann, Alexei Starovoitov, netdev

Oh, I've found what's the problem.
About the files you've mentioned, nothing seems to matter on my system.
But the problem is the order of the '-I' option matters.

    user@host:~/linux/samples/bpf $ make -n

    gcc -Wp,-MD,./samples/bpf/.sockex3_user.o.d -Wall
-Wmissing-prototypes -Wstrict-prototypes \
        -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include
-I./tools/lib/ -I./tools/testing/selftests/bpf/ \
        -I./tools/  lib/ -I./tools/include -I./tools/perf -c -o
./samples/bpf/sockex3_user.o ./samples/bpf/sockex3_user.c;
    ...
    user@host:~/linux $ gcc -Wp,-MD,./samples/bpf/.sockex3_user.o.d
-Wall -Wmissing-prototypes -Wstrict-prototypes \
        -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include
-I./tools/lib/ -I./tools/testing/selftests/bpf/ \
        -I./tools/  lib/ -I./tools/include -I./tools/perf -c -o
./samples/bpf/sockex3_user.o ./samples/bpf/sockex3_user.c;

    ./tools/lib/bpf/bpf.h:95:27: error: ‘UINT32_MAX’ undeclared here
(not in a function); ...
    #define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in
kernels <= 5.1 */
                              ^
    ./samples/bpf/bpf_load.h:31:25: note: in expansion of macro
‘BPF_LOG_BUF_SIZE’
    extern char bpf_log_buf[BPF_LOG_BUF_SIZE];
                            ^~~~~~~~~~~~~~~~

As you can see the dry make command in my system, the '-I./usr/include'
option precedes than '-I./tools/include'. And in this situation, it
gives an error.
But when I switch these two options order, it runs successfully like below.

    user@host:~/linux $ gcc -Wp,-MD,./samples/bpf/.sockex3_user.o.d
-Wall -Wmissing-prototypes -Wstrict-prototypes \
        -O2 -fomit-frame-pointer -std=gnu89 -I./tools/include
-I./tools/lib/ -I./tools/testing/selftests/bpf/ \
        -I./tools/  lib/ -I./usr/include -I./tools/perf -c -o
./samples/bpf/sockex3_user.o ./samples/bpf/sockex3_user.c;

    // command runs successfully.

Looks like when the '-I./usr/include' option precedes, it looks up for
./usr/include/linux/types.h. But when '-I./tools/include' comes up earlier,
./tools/include/linux/types.h header is used with compilation.

Since these two <linux/types.h> headers are quite different, it causes an error.
I'm not sure but perhaps the version difference of GNU Make is causing the
inconsistency of the option order. (v4.1 on my system)

I'm wondering which might be the best ways to handle this problem?
(Maybe adding a Make implicit rule for the option order?)

On Wed, Apr 24, 2019 at 8:27 AM Y Song <ys114321@gmail.com> wrote:
>
> On Tue, Apr 23, 2019 at 1:26 PM Daniel T. Lee <danieltimlee@gmail.com> wrote:
> >
> > Currently, building bpf samples will cause the following error.
> >
> >     ./tools/lib/bpf/bpf.h:132:27: error: 'UINT32_MAX' undeclared here (not in a function) ..
> >      #define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in kernels <= 5.1 */
> >                                ^
> >     ./samples/bpf/bpf_load.h:31:25: note: in expansion of macro 'BPF_LOG_BUF_SIZE'
> >      extern char bpf_log_buf[BPF_LOG_BUF_SIZE];
> >                              ^~~~~~~~~~~~~~~~
> >
> > Due to commit 4519efa6f8ea ("libbpf: fix BPF_LOG_BUF_SIZE off-by-one error")
> > hard-coded size of BPF_LOG_BUF_SIZE has been replaced with UINT32_MAX which is
> > defined in <stdint.h> header.
> >
> > Even with this change, bpf selftests are running fine since these are built
> > with clang and it includes header(-idirafter) from clang/6.0.0/include.
> > (it has <stdint.h>)
> >
> >     clang -I. -I./include/uapi -I../../../include/uapi -idirafter /usr/local/include -idirafter /usr/include \
> >     -idirafter /usr/lib/llvm-6.0/lib/clang/6.0.0/include -idirafter /usr/include/x86_64-linux-gnu \
> >     -Wno-compare-distinct-pointer-types -O2 -target bpf -emit-llvm -c progs/test_sysctl_prog.c -o - | \
> >     llc -march=bpf -mcpu=generic  -filetype=obj -o /linux/tools/testing/selftests/bpf/test_sysctl_prog.o
> >
> > But bpf samples are compiled with GCC, and it only searches and includes
> > headers declared at the target file. As '#include <stdint.h>' hasn't been
> > declared in tools/lib/bpf/bpf.h, it causes build failure of bpf samples.
> >
> >     gcc -Wp,-MD,./samples/bpf/.sockex3_user.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes \
> >     -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include -I./tools/lib/ -I./tools/testing/selftests/bpf/ \
> >     -I./tools/  lib/ -I./tools/include -I./tools/perf -c -o ./samples/bpf/sockex3_user.o ./samples/bpf/sockex3_user.c;
> >
> > This commit add declaration of '#include <stdint.h>' to tools/lib/bpf/bpf.h
> > to fix this problem.
> >
> > Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com>
> > ---
> >  tools/lib/bpf/bpf.h | 1 +
> >  1 file changed, 1 insertion(+)
> >
> > diff --git a/tools/lib/bpf/bpf.h b/tools/lib/bpf/bpf.h
> > index ff2506fe6bd2..9593fec75652 100644
> > --- a/tools/lib/bpf/bpf.h
> > +++ b/tools/lib/bpf/bpf.h
> > @@ -26,6 +26,7 @@
> >  #include <linux/bpf.h>
> >  #include <stdbool.h>
> >  #include <stddef.h>
> > +#include <stdint.h>
>
> I my case, I have the following in /usr/include/linux/bpf.h:
>   #include <linux/types.h>
>   #include <linux/bpf_common.h>
>
> The <linux/bpf.h> is included in tools/lib/bpf/bpf.h.
>
> and at tools/include/linux/types.h, I got
> #include <stdbool.h>
> #include <stddef.h>
> #include <stdint.h>
>
> So I don't have any issues.
> Could you check your system whether any of the above files
> missing or mismatched during compilation process?
>
> >
> >  #ifdef __cplusplus
> >  extern "C" {
> > --
> > 2.17.1
> >

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

* Re: [PATCH] libbpf: fix samples/bpf build failure due to undefined UINT32_MAX
  2019-04-24  1:01   ` Daniel T. Lee
@ 2019-04-24  6:04     ` Y Song
  0 siblings, 0 replies; 5+ messages in thread
From: Y Song @ 2019-04-24  6:04 UTC (permalink / raw)
  To: Daniel T. Lee; +Cc: Daniel Borkmann, Alexei Starovoitov, netdev

On Tue, Apr 23, 2019 at 6:02 PM Daniel T. Lee <danieltimlee@gmail.com> wrote:
>
> Oh, I've found what's the problem.
> About the files you've mentioned, nothing seems to matter on my system.
> But the problem is the order of the '-I' option matters.
>
>     user@host:~/linux/samples/bpf $ make -n
>
>     gcc -Wp,-MD,./samples/bpf/.sockex3_user.o.d -Wall
> -Wmissing-prototypes -Wstrict-prototypes \
>         -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include
> -I./tools/lib/ -I./tools/testing/selftests/bpf/ \
>         -I./tools/  lib/ -I./tools/include -I./tools/perf -c -o
> ./samples/bpf/sockex3_user.o ./samples/bpf/sockex3_user.c;
>     ...
>     user@host:~/linux $ gcc -Wp,-MD,./samples/bpf/.sockex3_user.o.d
> -Wall -Wmissing-prototypes -Wstrict-prototypes \
>         -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include
> -I./tools/lib/ -I./tools/testing/selftests/bpf/ \
>         -I./tools/  lib/ -I./tools/include -I./tools/perf -c -o
> ./samples/bpf/sockex3_user.o ./samples/bpf/sockex3_user.c;
>
>     ./tools/lib/bpf/bpf.h:95:27: error: ‘UINT32_MAX’ undeclared here
> (not in a function); ...
>     #define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in
> kernels <= 5.1 */
>                               ^
>     ./samples/bpf/bpf_load.h:31:25: note: in expansion of macro
> ‘BPF_LOG_BUF_SIZE’
>     extern char bpf_log_buf[BPF_LOG_BUF_SIZE];
>                             ^~~~~~~~~~~~~~~~
>
> As you can see the dry make command in my system, the '-I./usr/include'
> option precedes than '-I./tools/include'. And in this situation, it
> gives an error.
> But when I switch these two options order, it runs successfully like below.
>
>     user@host:~/linux $ gcc -Wp,-MD,./samples/bpf/.sockex3_user.o.d
> -Wall -Wmissing-prototypes -Wstrict-prototypes \
>         -O2 -fomit-frame-pointer -std=gnu89 -I./tools/include
> -I./tools/lib/ -I./tools/testing/selftests/bpf/ \
>         -I./tools/  lib/ -I./usr/include -I./tools/perf -c -o
> ./samples/bpf/sockex3_user.o ./samples/bpf/sockex3_user.c;
>
>     // command runs successfully.
>
> Looks like when the '-I./usr/include' option precedes, it looks up for
> ./usr/include/linux/types.h. But when '-I./tools/include' comes up earlier,
> ./tools/include/linux/types.h header is used with compilation.
>
> Since these two <linux/types.h> headers are quite different, it causes an error.
> I'm not sure but perhaps the version difference of GNU Make is causing the
> inconsistency of the option order. (v4.1 on my system)

I have the same issue with v3.82 make.

We could adjust the include orders in samples/bpf/Makefile
  KBUILD_HOSTCFLAGS += -I$(objtree)/usr/include
                                     │······
  KBUILD_HOSTCFLAGS += -I$(srctree)/tools/lib/
                                     │······
  KBUILD_HOSTCFLAGS += -I$(srctree)/tools/testing/selftests/bpf/
                                     │······
  KBUILD_HOSTCFLAGS += -I$(srctree)/tools/lib/
-I$(srctree)/tools/include                                   │······
  KBUILD_HOSTCFLAGS += -I$(srctree)/tools/perf
to switch $(objtree)/usr/include and $(srctree)/tools/include, but it
looks it has
some side effects on some other programs.

So your solution seems reasonable to me.

Acked-by: Yonghong Song <yhs@fb.com>

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

* Re: [PATCH] libbpf: fix samples/bpf build failure due to undefined UINT32_MAX
  2019-04-23 20:24 [PATCH] libbpf: fix samples/bpf build failure due to undefined UINT32_MAX Daniel T. Lee
  2019-04-23 23:26 ` Y Song
@ 2019-04-25 21:40 ` Daniel Borkmann
  1 sibling, 0 replies; 5+ messages in thread
From: Daniel Borkmann @ 2019-04-25 21:40 UTC (permalink / raw)
  To: Daniel T. Lee, Alexei Starovoitov; +Cc: netdev

On 04/23/2019 10:24 PM, Daniel T. Lee wrote:
> Currently, building bpf samples will cause the following error.
> 
>     ./tools/lib/bpf/bpf.h:132:27: error: 'UINT32_MAX' undeclared here (not in a function) ..
>      #define BPF_LOG_BUF_SIZE (UINT32_MAX >> 8) /* verifier maximum in kernels <= 5.1 */
>                                ^
>     ./samples/bpf/bpf_load.h:31:25: note: in expansion of macro 'BPF_LOG_BUF_SIZE'
>      extern char bpf_log_buf[BPF_LOG_BUF_SIZE];
>                              ^~~~~~~~~~~~~~~~
> 
> Due to commit 4519efa6f8ea ("libbpf: fix BPF_LOG_BUF_SIZE off-by-one error")
> hard-coded size of BPF_LOG_BUF_SIZE has been replaced with UINT32_MAX which is
> defined in <stdint.h> header.
> 
> Even with this change, bpf selftests are running fine since these are built
> with clang and it includes header(-idirafter) from clang/6.0.0/include.
> (it has <stdint.h>)
> 
>     clang -I. -I./include/uapi -I../../../include/uapi -idirafter /usr/local/include -idirafter /usr/include \
>     -idirafter /usr/lib/llvm-6.0/lib/clang/6.0.0/include -idirafter /usr/include/x86_64-linux-gnu \
>     -Wno-compare-distinct-pointer-types -O2 -target bpf -emit-llvm -c progs/test_sysctl_prog.c -o - | \
>     llc -march=bpf -mcpu=generic  -filetype=obj -o /linux/tools/testing/selftests/bpf/test_sysctl_prog.o
> 
> But bpf samples are compiled with GCC, and it only searches and includes
> headers declared at the target file. As '#include <stdint.h>' hasn't been
> declared in tools/lib/bpf/bpf.h, it causes build failure of bpf samples.
> 
>     gcc -Wp,-MD,./samples/bpf/.sockex3_user.o.d -Wall -Wmissing-prototypes -Wstrict-prototypes \
>     -O2 -fomit-frame-pointer -std=gnu89 -I./usr/include -I./tools/lib/ -I./tools/testing/selftests/bpf/ \
>     -I./tools/  lib/ -I./tools/include -I./tools/perf -c -o ./samples/bpf/sockex3_user.o ./samples/bpf/sockex3_user.c;
> 
> This commit add declaration of '#include <stdint.h>' to tools/lib/bpf/bpf.h
> to fix this problem.
> 
> Signed-off-by: Daniel T. Lee <danieltimlee@gmail.com>

Applied, thanks.

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

end of thread, other threads:[~2019-04-25 21:40 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-04-23 20:24 [PATCH] libbpf: fix samples/bpf build failure due to undefined UINT32_MAX Daniel T. Lee
2019-04-23 23:26 ` Y Song
2019-04-24  1:01   ` Daniel T. Lee
2019-04-24  6:04     ` Y Song
2019-04-25 21:40 ` Daniel Borkmann

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.