aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lib/bpf/libbpf.c
diff options
context:
space:
mode:
authorAndrii Nakryiko <andriin@fb.com>2019-06-17 15:26:55 -0400
committerDaniel Borkmann <daniel@iogearbox.net>2019-06-17 18:10:41 -0400
commit063183bf0486c7e61a2b454896bba2f7908b4ab0 (patch)
tree866c9d1246da8901607b84b20eed09849d83e0b8 /tools/lib/bpf/libbpf.c
parentdb48814bd2833ee231f48bd2030082369b88f9ef (diff)
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)
1113 } 1113 }
1114} 1114}
1115 1115
1116static int bpf_object__load_btf(struct bpf_object *obj, 1116static int bpf_object__init_btf(struct bpf_object *obj,
1117 Elf_Data *btf_data, 1117 Elf_Data *btf_data,
1118 Elf_Data *btf_ext_data) 1118 Elf_Data *btf_ext_data)
1119{ 1119{
@@ -1132,13 +1132,6 @@ static int bpf_object__load_btf(struct bpf_object *obj,
1132 BTF_ELF_SEC, err); 1132 BTF_ELF_SEC, err);
1133 goto out; 1133 goto out;
1134 } 1134 }
1135 bpf_object__sanitize_btf(obj);
1136 err = btf__load(obj->btf);
1137 if (err) {
1138 pr_warning("Error loading %s into kernel: %d.\n",
1139 BTF_ELF_SEC, err);
1140 goto out;
1141 }
1142 } 1135 }
1143 if (btf_ext_data) { 1136 if (btf_ext_data) {
1144 if (!obj->btf) { 1137 if (!obj->btf) {
@@ -1154,7 +1147,6 @@ static int bpf_object__load_btf(struct bpf_object *obj,
1154 obj->btf_ext = NULL; 1147 obj->btf_ext = NULL;
1155 goto out; 1148 goto out;
1156 } 1149 }
1157 bpf_object__sanitize_btf_ext(obj);
1158 } 1150 }
1159out: 1151out:
1160 if (err || IS_ERR(obj->btf)) { 1152 if (err || IS_ERR(obj->btf)) {
@@ -1165,6 +1157,26 @@ out:
1165 return 0; 1157 return 0;
1166} 1158}
1167 1159
1160static int bpf_object__sanitize_and_load_btf(struct bpf_object *obj)
1161{
1162 int err = 0;
1163
1164 if (!obj->btf)
1165 return 0;
1166
1167 bpf_object__sanitize_btf(obj);
1168 bpf_object__sanitize_btf_ext(obj);
1169
1170 err = btf__load(obj->btf);
1171 if (err) {
1172 pr_warning("Error loading %s into kernel: %d.\n",
1173 BTF_ELF_SEC, err);
1174 btf__free(obj->btf);
1175 obj->btf = NULL;
1176 }
1177 return 0;
1178}
1179
1168static int bpf_object__elf_collect(struct bpf_object *obj, int flags) 1180static int bpf_object__elf_collect(struct bpf_object *obj, int flags)
1169{ 1181{
1170 Elf *elf = obj->efile.elf; 1182 Elf *elf = obj->efile.elf;
@@ -1296,10 +1308,12 @@ static int bpf_object__elf_collect(struct bpf_object *obj, int flags)
1296 pr_warning("Corrupted ELF file: index of strtab invalid\n"); 1308 pr_warning("Corrupted ELF file: index of strtab invalid\n");
1297 return -LIBBPF_ERRNO__FORMAT; 1309 return -LIBBPF_ERRNO__FORMAT;
1298 } 1310 }
1299 err = bpf_object__load_btf(obj, btf_data, btf_ext_data); 1311 err = bpf_object__init_btf(obj, btf_data, btf_ext_data);
1300 if (!err) 1312 if (!err)
1301 err = bpf_object__init_maps(obj, flags); 1313 err = bpf_object__init_maps(obj, flags);
1302 if (!err) 1314 if (!err)
1315 err = bpf_object__sanitize_and_load_btf(obj);
1316 if (!err)
1303 err = bpf_object__init_prog_names(obj); 1317 err = bpf_object__init_prog_names(obj);
1304 return err; 1318 return err;
1305} 1319}