The pahole master branch recently added support for "distilled BTF" based on libbpf v1.5, but may add .BTF and .BTF.base sections with the wrong byte order (e.g. on s390x BPF CI), which then lead to kernel Oops when loaded. Fix by updating libbpf's btf__distill_base() and btf_new_empty() to retain the byte order of any source BTF objects when creating new ones. Reported-by: Song Liu <song@xxxxxxxxxx> Reported-by: Eduard Zingerman <eddyz87@xxxxxxxxx> Suggested-by: Eduard Zingerman <eddyz87@xxxxxxxxx> Link: https://lore.kernel.org/bpf/6358db36c5f68b07873a0a5be2d062b1af5ea5f8.camel@xxxxxxxxx/ Signed-off-by: Tony Ambardar <tony.ambardar@xxxxxxxxx> --- tools/lib/bpf/btf.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c index 064cfe126c09..7726b7c6d40a 100644 --- a/tools/lib/bpf/btf.c +++ b/tools/lib/bpf/btf.c @@ -996,6 +996,7 @@ static struct btf *btf_new_empty(struct btf *base_btf) btf->base_btf = base_btf; btf->start_id = btf__type_cnt(base_btf); btf->start_str_off = base_btf->hdr->str_len; + btf->swapped_endian = base_btf->swapped_endian; } /* +1 for empty string at offset 0 */ @@ -5554,6 +5555,10 @@ int btf__distill_base(const struct btf *src_btf, struct btf **new_base_btf, new_base = btf__new_empty(); if (!new_base) return libbpf_err(-ENOMEM); + err = btf__set_endianness(new_base, btf__endianness(src_btf)); + if (err < 0) + goto done; + dist.id_map = calloc(n, sizeof(*dist.id_map)); if (!dist.id_map) { err = -ENOMEM; -- 2.34.1