int bpf_prog_load(enum bpf_prog_type prog_type,
                  const char *prog_name, const char *license,
                  const struct bpf_insn *insns, size_t insn_cnt,
-                 const struct bpf_prog_load_opts *opts)
+                 struct bpf_prog_load_opts *opts)
 {
-       const size_t attr_sz = offsetofend(union bpf_attr, fd_array);
+       const size_t attr_sz = offsetofend(union bpf_attr, log_true_size);
        void *finfo = NULL, *linfo = NULL;
        const char *func_info, *line_info;
        __u32 log_size, log_level, attach_prog_fd, attach_btf_obj_fd;
        }
 
        fd = sys_bpf_prog_load(&attr, attr_sz, attempts);
+       OPTS_SET(opts, log_true_size, attr.log_true_size);
        if (fd >= 0)
                return fd;
 
                }
 
                fd = sys_bpf_prog_load(&attr, attr_sz, attempts);
+               OPTS_SET(opts, log_true_size, attr.log_true_size);
                if (fd >= 0)
                        goto done;
        }
                attr.log_level = 1;
 
                fd = sys_bpf_prog_load(&attr, attr_sz, attempts);
+               OPTS_SET(opts, log_true_size, attr.log_true_size);
        }
 done:
        /* free() doesn't affect errno, so we don't need to restore it */
 
        __u32 log_level;
        __u32 log_size;
        char *log_buf;
+       /* output: actual total log contents size (including termintaing zero).
+        * It could be both larger than original log_size (if log was
+        * truncated), or smaller (if log buffer wasn't filled completely).
+        * If kernel doesn't support this feature, log_size is left unchanged.
+        */
+       __u32 log_true_size;
+       size_t :0;
 };
-#define bpf_prog_load_opts__last_field log_buf
+#define bpf_prog_load_opts__last_field log_true_size
 
 LIBBPF_API int bpf_prog_load(enum bpf_prog_type prog_type,
                             const char *prog_name, const char *license,
                             const struct bpf_insn *insns, size_t insn_cnt,
-                            const struct bpf_prog_load_opts *opts);
+                            struct bpf_prog_load_opts *opts);
 
 /* Flags to direct loading requirements */
 #define MAPS_RELAX_COMPAT      0x01