0ae065a5d2
Avi Kivity reported a problem where the __weak
btf__load_from_kernel_by_id() in tools/perf/util/bpf-event.c was being
used and it called btf__get_from_id() in tools/lib/bpf/btf.c that in
turn called back to btf__load_from_kernel_by_id(), resulting in an
endless loop.
Fix this by adding a feature test to check if
btf__load_from_kernel_by_id() is available when building perf with
LIBBPF_DYNAMIC=1, and if not then provide the fallback to the old
btf__get_from_id(), that doesn't call back to btf__load_from_kernel_by_id()
since at that time it didn't exist at all.
Tested on Fedora 35 where we have libbpf-devel 0.4.0 with LIBBPF_DYNAMIC
where we don't have btf__load_from_kernel_by_id() and thus its feature
test fail, not defining HAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID:
$ cat /tmp/build/perf-urgent/feature/test-libbpf-btf__load_from_kernel_by_id.make.output
test-libbpf-btf__load_from_kernel_by_id.c: In function ‘main’:
test-libbpf-btf__load_from_kernel_by_id.c:6:16: error: implicit declaration of function ‘btf__load_from_kernel_by_id’ [-Werror=implicit-function-declaration]
6 | return btf__load_from_kernel_by_id(20151128, NULL);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~
cc1: all warnings being treated as errors
$
$ nm /tmp/build/perf-urgent/perf | grep btf__load_from_kernel_by_id
00000000005ba180 T btf__load_from_kernel_by_id
$
$ objdump --disassemble=btf__load_from_kernel_by_id -S /tmp/build/perf-urgent/perf
/tmp/build/perf-urgent/perf: file format elf64-x86-64
<SNIP>
00000000005ba180 <btf__load_from_kernel_by_id>:
#include "record.h"
#include "util/synthetic-events.h"
#ifndef HAVE_LIBBPF_BTF__LOAD_FROM_KERNEL_BY_ID
struct btf *btf__load_from_kernel_by_id(__u32 id)
{
5ba180: 55 push %rbp
5ba181: 48 89 e5 mov %rsp,%rbp
5ba184: 48 83 ec 10 sub $0x10,%rsp
5ba188: 64 48 8b 04 25 28 00 mov %fs:0x28,%rax
5ba18f: 00 00
5ba191: 48 89 45 f8 mov %rax,-0x8(%rbp)
5ba195: 31 c0 xor %eax,%eax
struct btf *btf;
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
int err = btf__get_from_id(id, &btf);
5ba197: 48 8d 75 f0 lea -0x10(%rbp),%rsi
5ba19b: e8 a0 57 e5 ff call 40f940 <btf__get_from_id@plt>
5ba1a0: 89 c2 mov %eax,%edx
#pragma GCC diagnostic pop
return err ? ERR_PTR(err) : btf;
5ba1a2: 48 98 cltq
5ba1a4: 85 d2 test %edx,%edx
5ba1a6: 48 0f 44 45 f0 cmove -0x10(%rbp),%rax
}
<SNIP>
Fixes:
|
||
---|---|---|
.. | ||
.gitignore | ||
Makefile | ||
test-all.c | ||
test-backtrace.c | ||
test-bionic.c | ||
test-bpf.c | ||
test-clang-bpf-co-re.c | ||
test-clang.cpp | ||
test-compile.c | ||
test-cplus-demangle.c | ||
test-cxx.cpp | ||
test-disassembler-four-args.c | ||
test-dwarf_getlocations.c | ||
test-dwarf.c | ||
test-eventfd.c | ||
test-file-handle.c | ||
test-fortify-source.c | ||
test-get_cpuid.c | ||
test-get_current_dir_name.c | ||
test-gettid.c | ||
test-glibc.c | ||
test-gtk2-infobar.c | ||
test-gtk2.c | ||
test-hello.c | ||
test-jvmti-cmlr.c | ||
test-jvmti.c | ||
test-libaio.c | ||
test-libaudit.c | ||
test-libbabeltrace.c | ||
test-libbfd-buildid.c | ||
test-libbfd.c | ||
test-libbpf-btf__load_from_kernel_by_id.c | ||
test-libbpf.c | ||
test-libcap.c | ||
test-libcrypto.c | ||
test-libdebuginfod.c | ||
test-libdw-dwarf-unwind.c | ||
test-libelf-gelf_getnote.c | ||
test-libelf-getphdrnum.c | ||
test-libelf-getshdrstrndx.c | ||
test-libelf.c | ||
test-libnuma.c | ||
test-libopencsd.c | ||
test-libperl.c | ||
test-libpfm4.c | ||
test-libpython.c | ||
test-libslang-include-subdir.c | ||
test-libslang.c | ||
test-libtraceevent.c | ||
test-libtracefs.c | ||
test-libunwind-aarch64.c | ||
test-libunwind-arm.c | ||
test-libunwind-debug-frame-aarch64.c | ||
test-libunwind-debug-frame-arm.c | ||
test-libunwind-debug-frame.c | ||
test-libunwind-x86_64.c | ||
test-libunwind-x86.c | ||
test-libunwind.c | ||
test-libzstd.c | ||
test-llvm-version.cpp | ||
test-llvm.cpp | ||
test-lzma.c | ||
test-numa_num_possible_cpus.c | ||
test-pthread-attr-setaffinity-np.c | ||
test-pthread-barrier.c | ||
test-reallocarray.c | ||
test-sched_getcpu.c | ||
test-sdt.c | ||
test-setns.c | ||
test-stackprotector-all.c | ||
test-timerfd.c | ||
test-zlib.c |