On Sat, Mar 9, 2024 at 6:05 PM Ian Rogers irogers@google.com wrote:
libbpf depends upon linux/err.h which has a linux/compiler.h dependency. In the kernel includes, as opposed to the tools version, linux/compiler.h includes linux/compiler_attributes.h which defines __printf. As the libbpf.c __printf definition isn't guarded by an ifndef, this leads to a duplicate definition compilation error when trying to update the tools/include/linux/compiler.h. Fix this by adding the missing ifndef.
Signed-off-by: Ian Rogers irogers@google.com
tools/lib/bpf/libbpf.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c index afd09571c482..2152360b4b18 100644 --- a/tools/lib/bpf/libbpf.c +++ b/tools/lib/bpf/libbpf.c @@ -66,7 +66,9 @@ */ #pragma GCC diagnostic ignored "-Wformat-nonliteral"
-#define __printf(a, b) __attribute__((format(printf, a, b))) +#ifndef __printf +# define __printf(a, b) __attribute__((format(printf, a, b)))
styling nit: don't add spaces between # and define, please
overall LGTM
Acked-by: Andrii Nakryiko andrii@kernel.org
Two questions, though.
1. It seems like just dropping #define __printf in libbpf.c compiles fine (I checked both building libbpf directly, and BPF selftest, and perf, and bpftool directly, all of them built fine). So we can probably just drop this. I'll need to add __printf on Github, but that's fine.
2. Logistics. Which tree should this patch go through? Can I land it in bpf-next or it's too much inconvenience for you?
+#endif
static struct bpf_map *bpf_object__add_map(struct bpf_object *obj); static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog); -- 2.44.0.278.ge034bb2e1d-goog