On Sun, Jul 25, 2021 at 7:18 AM Hengqi Chen <hengqi.chen@xxxxxxxxx> wrote: > > Kernel functions referenced by .BTF_ids may changed from global to static > and get inlined and thus disappears from BTF. This causes kernel build > failure when resolve_btfids do id patch for symbols in .BTF_ids in vmlinux. > Update resolve_btfids to emit warning messages and patch zero id for missing > symbols instead of aborting kernel build process. > > Signed-off-by: Hengqi Chen <hengqi.chen@xxxxxxxxx> > --- > tools/bpf/resolve_btfids/main.c | 13 +++++++------ > 1 file changed, 7 insertions(+), 6 deletions(-) > > diff --git a/tools/bpf/resolve_btfids/main.c b/tools/bpf/resolve_btfids/main.c > index 3ad9301b0f00..3ea19e33250d 100644 > --- a/tools/bpf/resolve_btfids/main.c > +++ b/tools/bpf/resolve_btfids/main.c > @@ -291,7 +291,7 @@ static int compressed_section_fix(Elf *elf, Elf_Scn *scn, GElf_Shdr *sh) > sh->sh_addralign = expected; > > if (gelf_update_shdr(scn, sh) == 0) { > - printf("FAILED cannot update section header: %s\n", > + pr_err("FAILED cannot update section header: %s\n", > elf_errmsg(-1)); > return -1; > } > @@ -317,6 +317,7 @@ static int elf_collect(struct object *obj) > > elf = elf_begin(fd, ELF_C_RDWR_MMAP, NULL); > if (!elf) { > + close(fd); > pr_err("FAILED cannot create ELF descriptor: %s\n", > elf_errmsg(-1)); > return -1; > @@ -484,7 +485,7 @@ static int symbols_resolve(struct object *obj) > err = libbpf_get_error(btf); > if (err) { > pr_err("FAILED: load BTF from %s: %s\n", > - obj->path, strerror(-err)); > + obj->btf ?: obj->path, strerror(-err)); > return -1; > } > > @@ -555,8 +556,7 @@ static int id_patch(struct object *obj, struct btf_id *id) > int i; > > if (!id->id) { > - pr_err("FAILED unresolved symbol %s\n", id->name); > - return -EINVAL; > + pr_err("WARN: unresolved symbol %s\n", id->name); we should probably give a bit more information for people to get back to us for this. For starters, maybe prefix the message with "resolve_btfids:" so that people at least can grep something relevant? > } > > for (i = 0; i < id->addr_cnt; i++) { > @@ -734,8 +734,9 @@ int main(int argc, const char **argv) > > err = 0; > out: > - if (obj.efile.elf) > + if (obj.efile.elf) { > elf_end(obj.efile.elf); > - close(obj.efile.fd); > + close(obj.efile.fd); > + } > return err; > } > -- > 2.25.1