summaryrefslogtreecommitdiffstats
path: root/tools/lib/bpf/libbpf.c
diff options
context:
space:
mode:
authorAndrii Nakryiko2019-06-17 21:26:55 +0200
committerDaniel Borkmann2019-06-18 00:10:41 +0200
commit063183bf0486c7e61a2b454896bba2f7908b4ab0 (patch)
tree866c9d1246da8901607b84b20eed09849d83e0b8 /tools/lib/bpf/libbpf.c
parentlibbpf: identify maps by section index in addition to offset (diff)
downloadkernel-qcow2-linux-063183bf0486c7e61a2b454896bba2f7908b4ab0.tar.gz
kernel-qcow2-linux-063183bf0486c7e61a2b454896bba2f7908b4ab0.tar.xz
kernel-qcow2-linux-063183bf0486c7e61a2b454896bba2f7908b4ab0.zip
libbpf: split initialization and loading of BTF
Libbpf does sanitization of BTF before loading it into kernel, if kernel doesn't support some of newer BTF features. This removes some of the important information from BTF (e.g., DATASEC and VAR description), which will be used for map construction. This patch splits BTF processing into initialization step, in which BTF is initialized from ELF and all the original data is still preserved; and sanitization/loading step, which ensures that BTF is safe to load into kernel. This allows to use full BTF information to construct maps, while still loading valid BTF into older kernels. Signed-off-by: Andrii Nakryiko <andriin@fb.com> Acked-by: Song Liu <songliubraving@fb.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'tools/lib/bpf/libbpf.c')
-rw-r--r--tools/lib/bpf/libbpf.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index b1f3ab4b39b3..da942ab2f06a 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -1113,7 +1113,7 @@ static void bpf_object__sanitize_btf_ext(struct bpf_object *obj)
}
}
-static int bpf_object__load_btf(struct bpf_object *obj,
+static int bpf_object__init_btf(struct bpf_object *obj,
Elf_Data *btf_data,
Elf_Data *btf_ext_data)
{
@@ -1132,13 +1132,6 @@ static int bpf_object__load_btf(struct bpf_object *obj,
BTF_ELF_SEC, err);
goto out;
}
- bpf_object__sanitize_btf(obj);
- err = btf__load(obj->btf);
- if (err) {
- pr_warning("Error loading %s into kernel: %d.\n",
- BTF_ELF_SEC, err);
- goto out;
- }
}
if (btf_ext_data) {
if (!obj->btf) {
@@ -1154,7 +1147,6 @@ static int bpf_object__load_btf(struct bpf_object *obj,
obj->btf_ext = NULL;
goto out;
}
- bpf_object__sanitize_btf_ext(obj);
}
out:
if (err || IS_ERR(obj->btf)) {
@@ -1165,6 +1157,26 @@ out:
return 0;
}
+static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj)
+{
+ int err = 0;
+
+ if (!obj->btf)
+ return 0;
+
+ bpf_object__sanitize_btf(obj);
+ bpf_object__sanitize_btf_ext(obj);
+
+ err = btf__load(obj->btf);
+ if (err) {
+ pr_warning("Error loading %s into kernel: %d.\n",
+ BTF_ELF_SEC, err);
+ btf__free(obj->btf);
+ obj->btf = NULL;
+ }
+ return 0;
+}
+
static int bpf_object__elf_collect(struct bpf_object *obj, int flags)
{
Elf *elf = obj->efile.elf;
@@ -1296,10 +1308,12 @@ static int bpf_object__elf_collect(struct bpf_object *obj, int flags)
pr_warning("Corrupted ELF file: index of strtab invalid\n");
return -LIBBPF_ERRNO__FORMAT;
}
- err = bpf_object__load_btf(obj, btf_data, btf_ext_data);
+ err = bpf_object__init_btf(obj, btf_data, btf_ext_data);
if (!err)
err = bpf_object__init_maps(obj, flags);
if (!err)
+ err = bpf_object__sanitize_and_load_btf(obj);
+ if (!err)
err = bpf_object__init_prog_names(obj);
return err;
}