* [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.