diff options
author | Connor O'Brien <connoro@google.com> | 2022-02-15 22:51:04 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-02-15 22:51:04 +0000 |
commit | 110d6d50784d2eece50d472590fa25d5c6c2d294 (patch) | |
tree | c935017ff6c9286bb8909a3de7a95ae9b48c2700 | |
parent | 9cb702f204844f57f28002be222b906c505acb38 (diff) | |
parent | 85df24d5a16f0f22a8da65560d269471086ba5c9 (diff) | |
download | libbpf-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.cpp | 15 |
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); |