• Andrii Nakryiko's avatar
    libbpf: Implement type-based CO-RE relocations support · 3fc32f40
    Andrii Nakryiko authored
    Implement support for TYPE_EXISTS/TYPE_SIZE/TYPE_ID_LOCAL/TYPE_ID_REMOTE
    relocations. These are examples of type-based relocations, as opposed to
    field-based relocations supported already. The difference is that they are
    calculating relocation values based on the type itself, not a field within
    a struct/union.
    
    Type-based relos have slightly different semantics when matching local types
    to kernel target types, see comments in bpf_core_types_are_compat() for
    details. Their behavior on failure to find target type in kernel BTF also
    differs. Instead of "poisoning" relocatable instruction and failing load
    subsequently in kernel, they return 0 (which is rarely a valid return result,
    so user BPF code can use that to detect success/failure of the relocation and
    deal with it without extra "guarding" relocations). Also, it's always possible
    to check existence of the type in target kernel with TYPE_EXISTS relocation,
    similarly to a field-based FIELD_EXISTS.
    
    TYPE_ID_LOCAL relocation is a bit special in that it always succeeds (barring
    any libbpf/Clang bugs) and resolved to BTF ID using **local** BTF info of BPF
    program itself. Tests in subsequent patches demonstrate the usage and
    semantics of new relocations.
    Signed-off-by: default avatarAndrii Nakryiko <andriin@fb.com>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Acked-by: default avatarYonghong Song <yhs@fb.com>
    Link: https://lore.kernel.org/bpf/20200819194519.3375898-2-andriin@fb.com
    3fc32f40
libbpf.c 247 KB