Commit 5f347a0f authored by Ihor Solodrai's avatar Ihor Solodrai Committed by Andrii Nakryiko
Browse files

resolve_btfids: Factor out load_btf()



Increase the lifetime of parsed BTF in resolve_btfids by factoring
load_btf() routine out of symbols_resolve() and storing the base_btf
and btf pointers in the struct object.

Signed-off-by: default avatarIhor Solodrai <ihor.solodrai@linux.dev>
Signed-off-by: default avatarAndrii Nakryiko <andrii@kernel.org>
Tested-by: default avatarAlan Maguire <alan.maguire@oracle.com>
Acked-by: default avatarEduard Zingerman <eddyz87@gmail.com>
Link: https://lore.kernel.org/bpf/20251219181321.1283664-3-ihor.solodrai@linux.dev
parent c1c7d617
Loading
Loading
Loading
Loading
+34 −13
Original line number Diff line number Diff line
@@ -116,6 +116,9 @@ struct object {
	const char *btf_path;
	const char *base_btf_path;

	struct btf *btf;
	struct btf *base_btf;

	struct {
		int		 fd;
		Elf		*elf;
@@ -529,16 +532,10 @@ static int symbols_collect(struct object *obj)
	return 0;
}

static int symbols_resolve(struct object *obj)
static int load_btf(struct object *obj)
{
	int nr_typedefs = obj->nr_typedefs;
	int nr_structs  = obj->nr_structs;
	int nr_unions   = obj->nr_unions;
	int nr_funcs    = obj->nr_funcs;
	struct btf *base_btf = NULL;
	int err, type_id;
	struct btf *btf;
	__u32 nr_types;
	struct btf *base_btf = NULL, *btf = NULL;
	int err;

	if (obj->base_btf_path) {
		base_btf = btf__parse(obj->base_btf_path, NULL);
@@ -546,7 +543,7 @@ static int symbols_resolve(struct object *obj)
		if (err) {
			pr_err("FAILED: load base BTF from %s: %s\n",
			       obj->base_btf_path, strerror(-err));
			return -1;
			goto out_err;
		}
	}

@@ -555,9 +552,30 @@ static int symbols_resolve(struct object *obj)
	if (err) {
		pr_err("FAILED: load BTF from %s: %s\n",
			obj->btf_path ?: obj->path, strerror(-err));
		goto out;
		goto out_err;
	}

	obj->base_btf = base_btf;
	obj->btf = btf;

	return 0;

out_err:
	btf__free(base_btf);
	btf__free(btf);
	return err;
}

static int symbols_resolve(struct object *obj)
{
	int nr_typedefs = obj->nr_typedefs;
	int nr_structs  = obj->nr_structs;
	int nr_unions   = obj->nr_unions;
	int nr_funcs    = obj->nr_funcs;
	struct btf *btf = obj->btf;
	int err, type_id;
	__u32 nr_types;

	err = -1;
	nr_types = btf__type_cnt(btf);

@@ -615,8 +633,6 @@ static int symbols_resolve(struct object *obj)

	err = 0;
out:
	btf__free(base_btf);
	btf__free(btf);
	return err;
}

@@ -824,6 +840,9 @@ int main(int argc, const char **argv)
	if (symbols_collect(&obj))
		goto out;

	if (load_btf(&obj))
		goto out;

	if (symbols_resolve(&obj))
		goto out;

@@ -833,6 +852,8 @@ int main(int argc, const char **argv)
	if (!(fatal_warnings && warnings))
		err = 0;
out:
	btf__free(obj.base_btf);
	btf__free(obj.btf);
	if (obj.efile.elf) {
		elf_end(obj.efile.elf);
		close(obj.efile.fd);