• Alexei Starovoitov's avatar
    libbpf: Generate loader program out of BPF ELF file. · 67234743
    Alexei Starovoitov authored
    The BPF program loading process performed by libbpf is quite complex
    and consists of the following steps:
    "open" phase:
    - parse elf file and remember relocations, sections
    - collect externs and ksyms including their btf_ids in prog's BTF
    - patch BTF datasec (since llvm couldn't do it)
    - init maps (old style map_def, BTF based, global data map, kconfig map)
    - collect relocations against progs and maps
    "load" phase:
    - probe kernel features
    - load vmlinux BTF
    - resolve externs (kconfig and ksym)
    - load program BTF
    - init struct_ops
    - create maps
    - apply CO-RE relocations
    - patch ld_imm64 insns with src_reg=PSEUDO_MAP, PSEUDO_MAP_VALUE, PSEUDO_BTF_ID
    - reposition subprograms and adjust call insns
    - sanitize and load progs
    
    During this process libbpf does sys_bpf() calls to load BTF, create maps,
    populate maps and finally load programs.
    Instead of actually doing the syscalls generate a trace of what libbpf
    would have done and represent it as the "loader program".
    The "loader program" consists of single map with:
    - union bpf_attr(s)
    - BTF bytes
    - map value bytes
    - insns bytes
    and single bpf program that passes bpf_attr(s) and data into bpf_sys_bpf() helper.
    Executing such "loader program" via bpf_prog_test_run() command will
    replay the sequence of syscalls that libbpf would have done which will result
    the same maps created and programs loaded as specified in the elf file.
    The "loader program" removes libelf and majority of libbpf dependency from
    program loading process.
    
    kconfig, typeless ksym, struct_ops and CO-RE are not supported yet.
    
    The order of relocate_data and relocate_calls had to change, so that
    bpf_gen__prog_load() can see all relocations for a given program with
    correct insn_idx-es.
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarAndrii Nakryiko <andrii@kernel.org>
    Link: https://lore.kernel.org/bpf/20210514003623.28033-15-alexei.starovoitov@gmail.com
    67234743
skel_internal.h 2.83 KB