On Wed, May 31, 2023 at 1:21 PM Alan Maguire <alan.maguire@xxxxxxxxxx> wrote: > > Provide a way to dump BTF header and metadata info via > bpftool; for example > > $ bpftool btf dump file vmliux format meta > BTF: data size 4963656 > Header: magic 0xeb9f, version 1, flags 0x0, hdr_len 32 > Types: len 2927556, offset 0 > Strings: len 2035881, offset 2927556 > Metadata header found: len 184, offset 4963440, flags 0x1 > Description: 'generated by dwarves v1.25' > CRC 0x6da2a930 ; base CRC 0x0 > Kind metadata for 20 kinds: > BTF_KIND_UNKN[ 0] flags 0x0 info_sz 0 elem_sz 0 > BTF_KIND_INT[ 1] flags 0x0 info_sz 4 elem_sz 0 > BTF_KIND_PTR[ 2] flags 0x0 info_sz 0 elem_sz 0 > BTF_KIND_ARRAY[ 3] flags 0x0 info_sz 12 elem_sz 0 > BTF_KIND_STRUCT[ 4] flags 0x0 info_sz 0 elem_sz 12 > BTF_KIND_UNION[ 5] flags 0x0 info_sz 0 elem_sz 12 > BTF_KIND_ENUM[ 6] flags 0x0 info_sz 0 elem_sz 8 > BTF_KIND_FWD[ 7] flags 0x0 info_sz 0 elem_sz 0 > BTF_KIND_TYPEDEF[ 8] flags 0x0 info_sz 0 elem_sz 0 > BTF_KIND_VOLATILE[ 9] flags 0x0 info_sz 0 elem_sz 0 > BTF_KIND_CONST[10] flags 0x0 info_sz 0 elem_sz 0 > BTF_KIND_RESTRICT[11] flags 0x0 info_sz 0 elem_sz 0 > BTF_KIND_FUNC[12] flags 0x0 info_sz 0 elem_sz 0 > BTF_KIND_FUNC_PROTO[13] flags 0x0 info_sz 0 elem_sz 8 > BTF_KIND_VAR[14] flags 0x0 info_sz 4 elem_sz 0 > BTF_KIND_DATASEC[15] flags 0x0 info_sz 0 elem_sz 12 > BTF_KIND_FLOAT[16] flags 0x0 info_sz 0 elem_sz 0 > BTF_KIND_DECL_TAG[17] flags 0x1 info_sz 4 elem_sz 0 > BTF_KIND_TYPE_TAG[18] flags 0x1 info_sz 0 elem_sz 0 > BTF_KIND_ENUM64[19] flags 0x0 info_sz 0 elem_sz 12 nit: looks very weird to be right aligned for the "BTF_KIND_xxx" column, let's align it left here? Also, btfdump ([0]) emits stats on per-kind basis, and I found it quite useful on multiple occasions, do you think it would be worthwhile to add that to bpftool as well. It looks like this in btfdump's case: BTF types ======================================= Total 2293996 bytes (90517 types) FuncProto: 731420 bytes (21455 types) Struct: 625944 bytes (7575 types) Func: 480876 bytes (40073 types) Enum: 137652 bytes (1721 types) Ptr: 132180 bytes (11015 types) Array: 67440 bytes (2810 types) Union: 57744 bytes (1348 types) Const: 28140 bytes (2345 types) Typedef: 20964 bytes (1747 types) Var: 5024 bytes (314 types) Datasec: 3780 bytes (1 types) Enum64: 1500 bytes (7 types) Fwd: 828 bytes (69 types) Int: 240 bytes (15 types) Volatile: 228 bytes (19 types) Restrict: 24 bytes (2 types) Float: 12 bytes (1 types) [0] https://github.com/anakryiko/btfdump > > Signed-off-by: Alan Maguire <alan.maguire@xxxxxxxxxx> > --- > tools/bpf/bpftool/btf.c | 46 +++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 46 insertions(+) > > diff --git a/tools/bpf/bpftool/btf.c b/tools/bpf/bpftool/btf.c > index 91fcb75babe3..da4257e00ba8 100644 > --- a/tools/bpf/bpftool/btf.c > +++ b/tools/bpf/bpftool/btf.c > @@ -504,6 +504,47 @@ static int dump_btf_c(const struct btf *btf, > return err; > } > [...]