On Tue, Nov 23, 2021 at 10:02 PM Alexei Starovoitov <alexei.starovoitov@xxxxxxxxx> wrote: > > From: Alexei Starovoitov <ast@xxxxxxxxxx> > > Without lskel the CO-RE relocations are processed by libbpf before any other > work is done. Instead, when lskel is needed, remember relocation as RELO_CORE > kind. Then when loader prog is generated for a given bpf program pass CO-RE > relos of that program to gen loader via bpf_gen__record_relo_core(). The gen > loader will remember them as-is and pass it later as-is into the kernel. > > The normal libbpf flow is to process CO-RE early before call relos happen. In > case of gen_loader the core relos have to be added to other relos to be copied > together when bpf static function is appended in different places to other main > bpf progs. During the copy the append_subprog_relos() will adjust insn_idx for > normal relos and for RELO_CORE kind too. When that is done each struct > reloc_desc has good relos for specific main prog. > > Signed-off-by: Alexei Starovoitov <ast@xxxxxxxxxx> > --- > tools/lib/bpf/bpf_gen_internal.h | 3 + > tools/lib/bpf/gen_loader.c | 41 +++++++++++- > tools/lib/bpf/libbpf.c | 108 ++++++++++++++++++++++--------- > 3 files changed, 119 insertions(+), 33 deletions(-) > LGTM, minor styling nit, please address if/when resubmitting. Acked-by: Andrii Nakryiko <andrii@xxxxxxxxxx> [...] > @@ -6600,6 +6638,16 @@ static int bpf_program__record_externs(struct bpf_program *prog) > ext->is_weak, false, BTF_KIND_FUNC, > relo->insn_idx); > break; > + case RELO_CORE: { > + struct bpf_core_relo cr = { > + .insn_off = relo->insn_idx * 8, > + .type_id = relo->core_relo->type_id, > + .access_str_off = relo->core_relo->access_str_off, > + .kind = relo->core_relo->kind, > + }; nit: empty line between variable and statements > + bpf_gen__record_relo_core(obj->gen_loader, &cr); > + break; > + } > default: > continue; > } > @@ -6639,7 +6687,7 @@ static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog > prog->name, prog->instances.nr); > } > if (obj->gen_loader) > - bpf_program__record_externs(prog); > + bpf_program_record_relos(prog); > err = bpf_object_load_prog_instance(obj, prog, > prog->insns, prog->insns_cnt, > license, kern_ver, &fd); > -- > 2.30.2 >