Commit 982be477 authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

perf build: Stop using __weak btf__raw_data() to handle older libbpf versions



By adding a feature test for btf__raw_data() and providing a fallback if
it isn't present in older versions of libbpf.

Committer testing:

  $ rpm -q libbpf-devel
  libbpf-devel-0.4.0-2.fc35.x86_64
  $ make -C tools/perf LIBBPF_DYNAMIC=1 O=/tmp/build/perf install-bin
  $ cat /tmp/build/perf/feature/test-libbpf-btf__raw_data.make.output
  test-libbpf-btf__raw_data.c: In function ‘main’:
  test-libbpf-btf__raw_data.c:6:9: error: implicit declaration of function ‘btf__raw_data’; did you mean ‘btf__get_raw_data’? [-Werror=implicit-function-declaration]
      6 |         btf__raw_data(NULL /* btf_ro */, NULL /* size */);
        |         ^~~~~~~~~~~~~
        |         btf__get_raw_data
  cc1: all warnings being treated as errors
  $ objdump -dS /tmp/build/perf/perf | grep '<btf__raw_data>:' -A20
  00000000005b3050 <btf__raw_data>:
  {
    5b3050:	55                   	push   %rbp
    5b3051:	48 89 e5             	mov    %rsp,%rbp
    5b3054:	48 83 ec 10          	sub    $0x10,%rsp
    5b3058:	64 48 8b 04 25 28 00 	mov    %fs:0x28,%rax
    5b305f:	00 00
    5b3061:	48 89 45 f8          	mov    %rax,-0x8(%rbp)
    5b3065:	31 c0                	xor    %eax,%eax
	  return btf__get_raw_data(btf_ro, size);
    5b3067:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
    5b306b:	64 48 2b 04 25 28 00 	sub    %fs:0x28,%rax
    5b3072:	00 00
    5b3074:	75 06                	jne    5b307c <btf__raw_data+0x2c>
  }
    5b3076:	c9                   	leave
	  return btf__get_raw_data(btf_ro, size);
    5b3077:	e9 14 99 e5 ff       	jmp    40c990 <btf__get_raw_data@plt>
    5b307c:	e8 af a7 e5 ff       	call   40d830 <__stack_chk_fail@plt>
    5b3081:	66 66 2e 0f 1f 84 00 	data16 cs nopw 0x0(%rax,%rax,1)
    5b3088:	00 00 00 00
    $

Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Tested-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Heiko Carstens <hca@linux.ibm.com>
Cc: Ian Rogers <irogers@google.com>
Cc: Ilya Leoshkevich <iii@linux.ibm.com>
Cc: Sumanth Korikkar <sumanthk@linux.ibm.com>
Cc: Sven Schnelle <svens@linux.ibm.com>
Cc: Thomas Richter <tmricht@linux.ibm.com>
Cc: Vasily Gorbik <gor@linux.ibm.com>
Link: http://lore.kernel.org/linux-perf-users/YozLKby7ITEtchC9@krava


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 739c9180
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -61,6 +61,7 @@ FILES= \
         test-libbpf-bpf_prog_load.bin          \
         test-libbpf-bpf_object__next_program.bin \
         test-libbpf-bpf_object__next_map.bin   \
         test-libbpf-btf__raw_data.bin          \
         test-get_cpuid.bin                     \
         test-sdt.bin                           \
         test-cxx.bin                           \
@@ -303,6 +304,9 @@ $(OUTPUT)test-libbpf-bpf_object__next_program.bin:
$(OUTPUT)test-libbpf-bpf_object__next_map.bin:
	$(BUILD) -lbpf

$(OUTPUT)test-libbpf-btf__raw_data.bin:
	$(BUILD) -lbpf

$(OUTPUT)test-sdt.bin:
	$(BUILD)

+8 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0
#include <bpf/btf.h>

int main(void)
{
	btf__raw_data(NULL /* btf_ro */, NULL /* size */);
	return 0;
}
+5 −0
Original line number Diff line number Diff line
@@ -585,6 +585,10 @@ ifndef NO_LIBELF
          ifeq ($(feature-libbpf-bpf_object__next_map), 1)
            CFLAGS += -DHAVE_LIBBPF_BPF_OBJECT__NEXT_MAP
          endif
          $(call feature_check,libbpf-btf__raw_data)
          ifeq ($(feature-libbpf-btf__raw_data), 1)
            CFLAGS += -DHAVE_LIBBPF_BTF__RAW_DATA
          endif
        else
          dummy := $(error Error: No libbpf devel library found, please install libbpf-devel);
        endif
@@ -593,6 +597,7 @@ ifndef NO_LIBELF
        CFLAGS += -DHAVE_LIBBPF_BPF_PROG_LOAD
        CFLAGS += -DHAVE_LIBBPF_BPF_OBJECT__NEXT_PROGRAM
        CFLAGS += -DHAVE_LIBBPF_BPF_OBJECT__NEXT_MAP
        CFLAGS += -DHAVE_LIBBPF_BTF__RAW_DATA
      endif
    endif

+3 −1
Original line number Diff line number Diff line
@@ -72,7 +72,8 @@ bpf_object__next_map(const struct bpf_object *obj, const struct bpf_map *prev)
}
#endif

const void * __weak
#ifndef HAVE_LIBBPF_BTF__RAW_DATA
const void *
btf__raw_data(const struct btf *btf_ro, __u32 *size)
{
#pragma GCC diagnostic push
@@ -80,6 +81,7 @@ btf__raw_data(const struct btf *btf_ro, __u32 *size)
	return btf__get_raw_data(btf_ro, size);
#pragma GCC diagnostic pop
}
#endif

static int snprintf_hex(char *buf, size_t size, unsigned char *data, size_t len)
{