• Andrii Nakryiko's avatar
    libbpf: improve handling of unresolved kfuncs · 05b6f766
    Andrii Nakryiko authored
    Currently, libbpf leaves `call #0` instruction for __weak unresolved
    kfuncs, which might lead to a confusing verifier log situations, where
    invalid `call #0` will be treated as successfully validated.
    
    We can do better. Libbpf already has an established mechanism of
    poisoning instructions that failed some form of resolution (e.g., CO-RE
    relocation and BPF map set to not be auto-created). Libbpf doesn't fail
    them outright to allow users to guard them through other means, and as
    long as BPF verifier can prove that such poisoned instructions cannot be
    ever reached, this doesn't consistute an invalid BPF program. If user
    didn't guard such code, libbpf will extract few pieces of information to
    tie such poisoned instructions back to additional information about what
    entitity wasn't resolved (e.g., BPF map name, or CO-RE relocation
    information).
    
    __weak unresolved kfuncs fit this model well, so this patch extends
    libbpf with poisioning and log fixup logic for kfunc calls.
    
    Note, this poisoning is done only for kfunc *calls*, not kfunc address
    resolution (ldimm64 instructions). The former cannot be ever valid, if
    reached, so it's safe to poison them. The latter is a valid mechanism to
    check if __weak kfunc ksym was resolved, and do necessary guarding and
    work arounds based on this result, supported in most recent kernels. As
    such, libbpf keeps such ldimm64 instructions as loading zero, never
    poisoning them.
    Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/r/20230418002148.3255690-4-andrii@kernel.orgSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    05b6f766
libbpf.c 338 KB