Re: [PATCH bpf-next v2 4/6] libbpf: Resolve typeless ksyms via KALLSYMS_QUERY ioctl

From: Jiri Olsa

Date: Mon Oct 26 2026 - 05:31:16 EST


On Thu, Oct 22, 2026 at 05:16:05PM -0700, Samuel Wu wrote:

SNIP

> +static int bpf_object__query_ksyms(struct bpf_object *obj)
> +{
> + struct kallsyms_query q;
> + struct extern_desc *ext;
> + int err = 0;
> + int fd;
> + int i;
> +
> + fd = open("/proc/kallsyms", O_RDONLY | O_CLOEXEC);
> + if (fd < 0)
> + return -errno;
> +
> + for (i = 0; i < obj->nr_extern; i++) {
> + ext = &obj->externs[i];
> + if (ext->type != EXT_KSYM || ext->ksym.type_id)
> + continue;
> +
> + q = (struct kallsyms_query){
> + .size = sizeof(q),
> + .query_flags = KALLSYMS_QUERY_BY_SYMBOL,
> + .sym_name_addr = ptr_to_u64(ext->name),
> + };
> +
> + err = -errno;
> + if (err == -ENOENT) {
> + err = 0;
> + continue;
> + }
> + if (err == -EADDRNOTAVAIL)
> + pr_warn("extern (ksym) '%s': resolution is ambiguous\n",
> + ext->name);
> + break;
> + }
> + ext->is_set = true;
> + ext->ksym.addr = q.sym_addr;
> + pr_debug("extern (ksym) '%s': resolved in kernel to 0x%llx\n",
> + ext->name, ext->ksym.addr);
> + }
> + close(fd);
> + return err;
> +}
> +
> +static int bpf_object__resolve_typeless_ksyms(struct bpf_object *obj)
> {
> + int err;
> +
> + err = bpf_object__query_ksyms(obj);

hi,
we could also add similar support for libbpf_available_kallsyms_parse and
probably in some other places like bpf_get_ksyms.. which makes me think it
could be useful to have KALLSYMS_QUERY support for multiple symbols

thanks,
jirka


> + /*
> + * Fall back to parsing /proc/kallsyms only if the ioctl is not
> + * accessible: not present (-ENOTTY on older kernels) or kallsyms
> + * addresses hidden from this opener (-EPERM, e.g. kptr_restrict).
> + */
> + if (err != -ENOTTY && err != -EPERM)
> + return err;
> +
> + pr_debug("KALLSYMS_QUERY unavailable (%s), falling back to /proc/kallsyms\n",
> + errstr(err));
> return libbpf_kallsyms_parse(kallsyms_cb, obj);
> }
>
> @@ -9922,7 +9996,7 @@ static int bpf_object__resolve_externs(struct bpf_object *obj,
> return -EINVAL;
> }
> if (need_kallsyms) {
> - err = bpf_object__read_kallsyms_file(obj);
> + err = bpf_object__resolve_typeless_ksyms(obj);
> if (err)
> return -EINVAL;
> }
> --
> 2.56.0.257.gf7497c7d27-goog
>