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 f18d7e6..8d0d0b6 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;
        }