On 2/7/19 6:55 PM, Andrii Nakryiko wrote: > This patch changes struct btf_ext to retain original data in sequential > block of memory, which makes it possible to expose > btf_ext__get_raw_data() interface, that's similar to > btf__get_raw_data(), allowing users of libbpf to get access to raw > representation of .BTF.ext section. > > Signed-off-by: Andrii Nakryiko <andr...@fb.com> > --- > tools/lib/bpf/btf.c | 85 +++++++++++++++++++++------------------- > tools/lib/bpf/btf.h | 2 + > tools/lib/bpf/libbpf.map | 1 + > 3 files changed, 47 insertions(+), 41 deletions(-) > > diff --git a/tools/lib/bpf/btf.c b/tools/lib/bpf/btf.c > index 8730f6c3be9e..c87cc3d71b9f 100644 > --- a/tools/lib/bpf/btf.c > +++ b/tools/lib/bpf/btf.c > @@ -41,9 +41,8 @@ struct btf { > > struct btf_ext_info { > /* > - * info points to a deep copy of the individual info section > - * (e.g. func_info and line_info) from the .BTF.ext. > - * It does not include the __u32 rec_size. > + * info points to the individual info section (e.g. func_info and > + * line_info) from the .BTF.ext. It does not include the __u32 rec_size. > */ > void *info; > __u32 rec_size; > @@ -51,8 +50,13 @@ struct btf_ext_info { > }; > > struct btf_ext { > + union { > + struct btf_ext_header *hdr; > + void *data; > + }; > struct btf_ext_info func_info; > struct btf_ext_info line_info; > + __u32 data_size; > }; > > struct btf_ext_info_sec { > @@ -603,19 +607,13 @@ struct btf_ext_sec_copy_param { > }; > > static int btf_ext_copy_info(struct btf_ext *btf_ext, > - __u8 *data, __u32 data_size, > struct btf_ext_sec_copy_param *ext_sec)
Overall looks good. Since we do not really "copy" info any more, rather we try to "setup" info based on btf_ext. Maybe changing all function and structure names with "_copy_" to "_setup_"? > { > - const struct btf_ext_header *hdr = (struct btf_ext_header *)data; > const struct btf_ext_info_sec *sinfo; > struct btf_ext_info *ext_info; > __u32 info_left, record_size; > /* The start of the info sec (including the __u32 record_size). */ > - const void *info; > - > - /* data and data_size do not include btf_ext_header from now on */ > - data = data + hdr->hdr_len; > - data_size -= hdr->hdr_len; > + void *info; [...]