• Andrii Nakryiko's avatar
    libbpf: Add BTF writing APIs · 4a3b33f8
    Andrii Nakryiko authored
    Add APIs for appending new BTF types at the end of BTF object.
    
    Each BTF kind has either one API of the form btf__add_<kind>(). For types
    that have variable amount of additional items (struct/union, enum, func_proto,
    datasec), additional API is provided to emit each such item. E.g., for
    emitting a struct, one would use the following sequence of API calls:
    
    btf__add_struct(...);
    btf__add_field(...);
    ...
    btf__add_field(...);
    
    Each btf__add_field() will ensure that the last BTF type is of STRUCT or
    UNION kind and will automatically increment that type's vlen field.
    
    All the strings are provided as C strings (const char *), not a string offset.
    This significantly improves usability of BTF writer APIs. All such strings
    will be automatically appended to string section or existing string will be
    re-used, if such string was already added previously.
    
    Each API attempts to do all the reasonable validations, like enforcing
    non-empty names for entities with required names, proper value bounds, various
    bit offset restrictions, etc.
    
    Type ID validation is minimal because it's possible to emit a type that refers
    to type that will be emitted later, so libbpf has no way to enforce such
    cases. User must be careful to properly emit all the necessary types and
    specify type IDs that will be valid in the finally generated BTF.
    
    Each of btf__add_<kind>() APIs return new type ID on success or negative
    value on error. APIs like btf__add_field() that emit additional items
    return zero on success and negative value on error.
    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/20200929020533.711288-2-andriin@fb.com
    4a3b33f8
btf.c 109 KB