struct btf *btf__new(__u8 *data, __u32 size)
 {
-       __u32 log_buf_size = 0;
-       char *log_buf = NULL;
        struct btf *btf;
        int err;
 
 
        btf->fd = -1;
 
-       log_buf = malloc(BPF_LOG_BUF_SIZE);
-       if (!log_buf) {
-               err = -ENOMEM;
-               goto done;
-       }
-
-       *log_buf = 0;
-       log_buf_size = BPF_LOG_BUF_SIZE;
-
        btf->data = malloc(size);
        if (!btf->data) {
                err = -ENOMEM;
        memcpy(btf->data, data, size);
        btf->data_size = size;
 
-       btf->fd = bpf_load_btf(btf->data, btf->data_size,
-                              log_buf, log_buf_size, false);
-
-       if (btf->fd == -1) {
-               err = -errno;
-               pr_warning("Error loading BTF: %s(%d)\n", strerror(errno), errno);
-               if (log_buf && *log_buf)
-                       pr_warning("%s\n", log_buf);
-               goto done;
-       }
-
        err = btf_parse_hdr(btf);
        if (err)
                goto done;
        err = btf_parse_type_sec(btf);
 
 done:
-       free(log_buf);
-
        if (err) {
                btf__free(btf);
                return ERR_PTR(err);
        return btf;
 }
 
+int btf__load(struct btf *btf)
+{
+       __u32 log_buf_size = BPF_LOG_BUF_SIZE;
+       char *log_buf = NULL;
+       int err = 0;
+
+       if (btf->fd >= 0)
+               return -EEXIST;
+
+       log_buf = malloc(log_buf_size);
+       if (!log_buf)
+               return -ENOMEM;
+
+       *log_buf = 0;
+
+       btf->fd = bpf_load_btf(btf->data, btf->data_size,
+                              log_buf, log_buf_size, false);
+       if (btf->fd < 0) {
+               err = -errno;
+               pr_warning("Error loading BTF: %s(%d)\n", strerror(errno), errno);
+               if (*log_buf)
+                       pr_warning("%s\n", log_buf);
+               goto done;
+       }
+
+done:
+       free(log_buf);
+       return err;
+}
+
 int btf__fd(const struct btf *btf)
 {
        return btf->fd;
 
 
 LIBBPF_API void btf__free(struct btf *btf);
 LIBBPF_API struct btf *btf__new(__u8 *data, __u32 size);
+LIBBPF_API int btf__load(struct btf *btf);
 LIBBPF_API __s32 btf__find_by_name(const struct btf *btf,
                                   const char *type_name);
 LIBBPF_API __u32 btf__get_nr_types(const struct btf *btf);
 
                        obj->efile.maps_shndx = idx;
                else if (strcmp(name, BTF_ELF_SEC) == 0) {
                        obj->btf = btf__new(data->d_buf, data->d_size);
-                       if (IS_ERR(obj->btf)) {
+                       if (IS_ERR(obj->btf) || btf__load(obj->btf)) {
                                pr_warning("Error loading ELF section %s: %ld. Ignored and continue.\n",
                                           BTF_ELF_SEC, PTR_ERR(obj->btf));
                                obj->btf = NULL;