Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools/resolve_btfids: Emit warnings and patch zero id for missing symbols

Kernel functions referenced by .BTF_ids may be changed from global to static
and get inlined or get renamed/removed, 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.

Suggested-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Hengqi Chen <hengqi.chen@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Acked-by: Yonghong Song <yhs@fb.com>
Link: https://lore.kernel.org/bpf/20210727132532.2473636-2-hengqi.chen@gmail.com

authored by

Hengqi Chen and committed by
Andrii Nakryiko
5aad0368 33b57e0c

+7 -6
+7 -6
tools/bpf/resolve_btfids/main.c
··· 291 291 sh->sh_addralign = expected; 292 292 293 293 if (gelf_update_shdr(scn, sh) == 0) { 294 - printf("FAILED cannot update section header: %s\n", 294 + pr_err("FAILED cannot update section header: %s\n", 295 295 elf_errmsg(-1)); 296 296 return -1; 297 297 } ··· 317 317 318 318 elf = elf_begin(fd, ELF_C_RDWR_MMAP, NULL); 319 319 if (!elf) { 320 + close(fd); 320 321 pr_err("FAILED cannot create ELF descriptor: %s\n", 321 322 elf_errmsg(-1)); 322 323 return -1; ··· 485 484 err = libbpf_get_error(btf); 486 485 if (err) { 487 486 pr_err("FAILED: load BTF from %s: %s\n", 488 - obj->path, strerror(-err)); 487 + obj->btf ?: obj->path, strerror(-err)); 489 488 return -1; 490 489 } 491 490 ··· 556 555 int i; 557 556 558 557 if (!id->id) { 559 - pr_err("FAILED unresolved symbol %s\n", id->name); 560 - return -EINVAL; 558 + pr_err("WARN: resolve_btfids: unresolved symbol %s\n", id->name); 561 559 } 562 560 563 561 for (i = 0; i < id->addr_cnt; i++) { ··· 734 734 735 735 err = 0; 736 736 out: 737 - if (obj.efile.elf) 737 + if (obj.efile.elf) { 738 738 elf_end(obj.efile.elf); 739 - close(obj.efile.fd); 739 + close(obj.efile.fd); 740 + } 740 741 return err; 741 742 }