aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorConnor O'Brien <connoro@google.com>2022-02-15 22:51:04 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2022-02-15 22:51:04 +0000
commit110d6d50784d2eece50d472590fa25d5c6c2d294 (patch)
treec935017ff6c9286bb8909a3de7a95ae9b48c2700
parent9cb702f204844f57f28002be222b906c505acb38 (diff)
parent85df24d5a16f0f22a8da65560d269471086ba5c9 (diff)
downloadlibbpf-110d6d50784d2eece50d472590fa25d5c6c2d294.tar.gz
Merge "btfloader: fix BTF loading error on 5.4 kernel" am: c721cb6eca am: 85df24d5a1
Original change: https://android-review.googlesource.com/c/platform/external/libbpf/+/1973244 Change-Id: Iba91a7e3ba9fa8a1766004c8452c6639b1249108
-rw-r--r--android/btfloader.cpp15
1 files changed, 15 insertions, 0 deletions
diff --git a/android/btfloader.cpp b/android/btfloader.cpp
index 966e872..24df4d6 100644
--- a/android/btfloader.cpp
+++ b/android/btfloader.cpp
@@ -58,6 +58,21 @@ int main(int argc, char **argv) {
struct btf *btf = bpf_object__btf(obj);
if (!btf) return kERROR_BTF_NOT_FOUND;
+ ret = btf__load_into_kernel(btf);
+ if (ret) {
+ if (errno != EINVAL) return kERROR_LOAD_BTF;
+ // For BTF_KIND_FUNC, newer kernels can read the BTF_INFO_VLEN bits of
+ // struct btf_type to distinguish static vs. global vs. extern
+ // functions, but older kernels enforce that only the BTF_INFO_KIND bits
+ // can be set. Retry with non-BTF_INFO_KIND bits zeroed out to handle
+ // this case.
+ for (unsigned int i = 1; i < btf__type_cnt(btf); ++i) {
+ struct btf_type *bt = (struct btf_type *)btf__type_by_id(btf, i);
+ if (btf_is_func(bt)) {
+ bt->info = (BTF_INFO_KIND(bt->info)) << 24;
+ }
+ }
+ }
if (btf__load_into_kernel(btf)) return kERROR_LOAD_BTF;
btfFd = btf__fd(btf);