• Andrii Nakryiko's avatar
    libbpf: Implement basic split BTF support · ba451366
    Andrii Nakryiko authored
    Support split BTF operation, in which one BTF (base BTF) provides basic set of
    types and strings, while another one (split BTF) builds on top of base's types
    and strings and adds its own new types and strings. From API standpoint, the
    fact that the split BTF is built on top of the base BTF is transparent.
    
    Type numeration is transparent. If the base BTF had last type ID #N, then all
    types in the split BTF start at type ID N+1. Any type in split BTF can
    reference base BTF types, but not vice versa. Programmatically construction of
    a split BTF on top of a base BTF is supported: one can create an empty split
    BTF with btf__new_empty_split() and pass base BTF as an input, or pass raw
    binary data to btf__new_split(), or use btf__parse_xxx_split() variants to get
    initial set of split types/strings from the ELF file with .BTF section.
    
    String offsets are similarly transparent and are a logical continuation of
    base BTF's strings. When building BTF programmatically and adding a new string
    (explicitly with btf__add_str() or implicitly through appending new
    types/members), string-to-be-added would first be looked up from the base
    BTF's string section and re-used if it's there. If not, it will be looked up
    and/or added to the split BTF string section. Similarly to type IDs, types in
    split BTF can refer to strings from base BTF absolutely transparently (but not
    vice versa, of course, because base BTF doesn't "know" about existence of
    split BTF).
    
    Internal type index is slightly adjusted to be zero-indexed, ignoring a fake
    [0] VOID type. This allows to handle split/base BTF type lookups transparently
    by using btf->start_id type ID offset, which is always 1 for base/non-split
    BTF and equals btf__get_nr_types(base_btf) + 1 for the split BTF.
    
    BTF deduplication is not yet supported for split BTF and support for it will
    be added in separate patch.
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarSong Liu <songliubraving@fb.com>
    Link: https://lore.kernel.org/bpf/20201105043402.2530976-5-andrii@kernel.org
    ba451366
btf.c 115 KB