mirror of
https://github.com/netdata/libbpf.git
synced 2026-04-11 02:59:07 +08:00
libbpf: Add some details for BTF parsing failures
As CONFIG_DEBUG_INFO_BTF is default off the existing "failed to find valid kernel BTF" message makes diagnosing the kernel build issue somewhat cryptic. Add a little more detail with the hope of helping users. Before: ``` libbpf: failed to find valid kernel BTF libbpf: Error loading vmlinux BTF: -3 ``` After not accessible: ``` libbpf: kernel BTF is missing at '/sys/kernel/btf/vmlinux', was CONFIG_DEBUG_INFO_BTF enabled? libbpf: failed to find valid kernel BTF libbpf: Error loading vmlinux BTF: -3 ``` After not readable: ``` libbpf: failed to read kernel BTF from (/sys/kernel/btf/vmlinux): -1 ``` Closes: https://lore.kernel.org/bpf/CAP-5=fU+DN_+Y=Y4gtELUsJxKNDDCOvJzPHvjUVaUoeFAzNnig@mail.gmail.com/ Signed-off-by: Ian Rogers <irogers@google.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20240125231840.1647951-1-irogers@google.com
This commit is contained in:
committed by
Andrii Nakryiko
parent
c57fb75864
commit
9b306ac9be
22
src/btf.c
22
src/btf.c
@@ -4932,10 +4932,9 @@ static int btf_dedup_remap_types(struct btf_dedup *d)
|
|||||||
*/
|
*/
|
||||||
struct btf *btf__load_vmlinux_btf(void)
|
struct btf *btf__load_vmlinux_btf(void)
|
||||||
{
|
{
|
||||||
|
const char *sysfs_btf_path = "/sys/kernel/btf/vmlinux";
|
||||||
|
/* fall back locations, trying to find vmlinux on disk */
|
||||||
const char *locations[] = {
|
const char *locations[] = {
|
||||||
/* try canonical vmlinux BTF through sysfs first */
|
|
||||||
"/sys/kernel/btf/vmlinux",
|
|
||||||
/* fall back to trying to find vmlinux on disk otherwise */
|
|
||||||
"/boot/vmlinux-%1$s",
|
"/boot/vmlinux-%1$s",
|
||||||
"/lib/modules/%1$s/vmlinux-%1$s",
|
"/lib/modules/%1$s/vmlinux-%1$s",
|
||||||
"/lib/modules/%1$s/build/vmlinux",
|
"/lib/modules/%1$s/build/vmlinux",
|
||||||
@@ -4949,8 +4948,23 @@ struct btf *btf__load_vmlinux_btf(void)
|
|||||||
struct btf *btf;
|
struct btf *btf;
|
||||||
int i, err;
|
int i, err;
|
||||||
|
|
||||||
uname(&buf);
|
/* is canonical sysfs location accessible? */
|
||||||
|
if (faccessat(AT_FDCWD, sysfs_btf_path, F_OK, AT_EACCESS) < 0) {
|
||||||
|
pr_warn("kernel BTF is missing at '%s', was CONFIG_DEBUG_INFO_BTF enabled?\n",
|
||||||
|
sysfs_btf_path);
|
||||||
|
} else {
|
||||||
|
btf = btf__parse(sysfs_btf_path, NULL);
|
||||||
|
if (!btf) {
|
||||||
|
err = -errno;
|
||||||
|
pr_warn("failed to read kernel BTF from '%s': %d\n", sysfs_btf_path, err);
|
||||||
|
return libbpf_err_ptr(err);
|
||||||
|
}
|
||||||
|
pr_debug("loaded kernel BTF from '%s'\n", path);
|
||||||
|
return btf;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* try fallback locations */
|
||||||
|
uname(&buf);
|
||||||
for (i = 0; i < ARRAY_SIZE(locations); i++) {
|
for (i = 0; i < ARRAY_SIZE(locations); i++) {
|
||||||
snprintf(path, PATH_MAX, locations[i], buf.release);
|
snprintf(path, PATH_MAX, locations[i], buf.release);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user