libbpf/btf: Fix string handling to support multi-split BTF
authorAlan Maguire <alan.maguire@oracle.com>
Mon, 19 May 2025 16:59:34 +0000 (17:59 +0100)
committerAndrii Nakryiko <andrii@kernel.org>
Tue, 20 May 2025 23:22:30 +0000 (16:22 -0700)
libbpf handling of split BTF has been written largely with the
assumption that multiple splits are possible, i.e. split BTF on top of
split BTF on top of base BTF.  One area where this does not quite work
is string handling in split BTF; the start string offset should be the
base BTF string section length + the base BTF string offset.  This
worked in the past because for a single split BTF with base the start
string offset was always 0.

Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20250519165935.261614-2-alan.maguire@oracle.com
tools/lib/bpf/btf.c

index f18d7e6a453cd9e5c384487659df04f7efafdf5a..8d0d0b645a75e122dda4fa7130f04c2794d48424 100644 (file)
@@ -996,7 +996,7 @@ static struct btf *btf_new_empty(struct btf *base_btf)
        if (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->start_str_off = base_btf->hdr->str_len + base_btf->start_str_off;
                btf->swapped_endian = base_btf->swapped_endian;
        }