• Andrii Nakryiko's avatar
    libbpf: Allow modification of BTF and add btf__add_str API · 919d2b1d
    Andrii Nakryiko authored
    Allow internal BTF representation to switch from default read-only mode, in
    which raw BTF data is a single non-modifiable block of memory with BTF header,
    types, and strings layed out sequentially and contiguously in memory, into
    a writable representation with types and strings data split out into separate
    memory regions, that can be dynamically expanded.
    
    Such writable internal representation is transparent to users of libbpf APIs,
    but allows to append new types and strings at the end of BTF, which is
    a typical use case when generating BTF programmatically. All the basic
    guarantees of BTF types and strings layout is preserved, i.e., user can get
    `struct btf_type *` pointer and read it directly. Such btf_type pointers might
    be invalidated if BTF is modified, so some care is required in such mixed
    read/write scenarios.
    
    Switch from read-only to writable configuration happens automatically the
    first time when user attempts to modify BTF by either adding a new type or new
    string. It is still possible to get raw BTF data, which is a single piece of
    memory that can be persisted in ELF section or into a file as raw BTF. Such
    raw data memory is also still owned by BTF and will be freed either when BTF
    object is freed or if another modification to BTF happens, as any modification
    invalidates BTF raw representation.
    
    This patch adds the first two BTF manipulation APIs: btf__add_str(), which
    allows to add arbitrary strings to BTF string section, and btf__find_str()
    which allows to find existing string offset, but not add it if it's missing.
    All the added strings are automatically deduplicated. This is achieved by
    maintaining an additional string lookup index for all unique strings. Such
    index is built when BTF is switched to modifiable mode. If at that time BTF
    strings section contained duplicate strings, they are not de-duplicated. This
    is done specifically to not modify the existing content of BTF (types, their
    string offsets, etc), which can cause confusion and is especially important
    property if there is struct btf_ext associated with struct btf. By following
    this "imperfect deduplication" process, btf_ext is kept consitent and correct.
    If deduplication of strings is necessary, it can be forced by doing BTF
    deduplication, at which point all the strings will be eagerly deduplicated and
    all string offsets both in struct btf and struct btf_ext will be updated.
    Signed-off-by: default avatarAndrii Nakryiko <andriin@fb.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Link: https://lore.kernel.org/bpf/20200926011357.2366158-6-andriin@fb.com
    919d2b1d
btf.h 8.69 KB