================
bpftool-btf
================
-------------------------------------------------------------------------------
tool for inspection of BTF data
-------------------------------------------------------------------------------

:Manual section: 8

SYNOPSIS
========

	**bpftool** [*OPTIONS*] **btf** *COMMAND*

	*OPTIONS* := { { **-j** | **--json** } [{ **-p** | **--pretty** }] }

	*COMMANDS* := { **dump** | **help** }

BTF COMMANDS
=============

|	**bpftool** **btf** { **show** | **list** } [**id** *BTF_ID*]
|	**bpftool** **btf dump** *BTF_SRC* [**format** *FORMAT*]
|	**bpftool** **btf help**
|
|	*BTF_SRC* := { **id** *BTF_ID* | **prog** *PROG* | **map** *MAP* [{**key** | **value** | **kv** | **all**}] | **file** *FILE* }
|	*FORMAT* := { **raw** | **c** }
|	*MAP* := { **id** *MAP_ID* | **pinned** *FILE* }
|	*PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* }

DESCRIPTION
===========
	**bpftool btf { show | list }** [**id** *BTF_ID*]
		  Show information about loaded BTF objects. If a BTF ID is
		  specified, show information only about given BTF object,
		  otherwise list all BTF objects currently loaded on the
		  system.

		  Since Linux 5.8 bpftool is able to discover information about
		  processes that hold open file descriptors (FDs) against BTF
		  objects. On such kernels bpftool will automatically emit this
		  information as well.

	**bpftool btf dump** *BTF_SRC*
		  Dump BTF entries from a given *BTF_SRC*.

		  When **id** is specified, BTF object with that ID will be
		  loaded and all its BTF types emitted.

		  When **map** is provided, it's expected that map has
		  associated BTF object with BTF types describing key and
		  value. It's possible to select whether to dump only BTF
		  type(s) associated with key (**key**), value (**value**),
		  both key and value (**kv**), or all BTF types present in
		  associated BTF object (**all**). If not specified, **kv**
		  is assumed.

		  When **prog** is provided, it's expected that program has
		  associated BTF object with BTF types.

		  When specifying *FILE*, an ELF file is expected, containing
		  .BTF section with well-defined BTF binary format data,
		  typically produced by clang or pahole.

		  **format** option can be used to override default (raw)
		  output format. Raw (**raw**) or C-syntax (**c**) output
		  formats are supported.

	**bpftool btf help**
		  Print short help message.

OPTIONS
=======
	.. include:: common_options.rst

EXAMPLES
========
**# bpftool btf dump id 1226**

::

  [1] PTR '(anon)' type_id=2
  [2] STRUCT 'dummy_tracepoint_args' size=16 vlen=2
          'pad' type_id=3 bits_offset=0
          'sock' type_id=4 bits_offset=64
  [3] INT 'long long unsigned int' size=8 bits_offset=0 nr_bits=64 encoding=(none)
  [4] PTR '(anon)' type_id=5
  [5] FWD 'sock' fwd_kind=union

This gives an example of default output for all supported BTF kinds.

**$ cat prog.c**

::

  struct fwd_struct;

  enum my_enum {
          VAL1 = 3,
          VAL2 = 7,
  };

  typedef struct my_struct my_struct_t;

  struct my_struct {
          const unsigned int const_int_field;
          int bitfield_field: 4;
          char arr_field[16];
          const struct fwd_struct *restrict fwd_field;
          enum my_enum enum_field;
          volatile my_struct_t *typedef_ptr_field;
  };

  union my_union {
          int a;
          struct my_struct b;
  };

  struct my_struct struct_global_var __attribute__((section("data_sec"))) = {
          .bitfield_field = 3,
          .enum_field = VAL1,
  };
  int global_var __attribute__((section("data_sec"))) = 7;

  __attribute__((noinline))
  int my_func(union my_union *arg1, int arg2)
  {
          static int static_var __attribute__((section("data_sec"))) = 123;
          static_var++;
          return static_var;
  }

**$ bpftool btf dump file prog.o**

::

  [1] PTR '(anon)' type_id=2
  [2] UNION 'my_union' size=48 vlen=2
          'a' type_id=3 bits_offset=0
          'b' type_id=4 bits_offset=0
  [3] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
  [4] STRUCT 'my_struct' size=48 vlen=6
          'const_int_field' type_id=5 bits_offset=0
          'bitfield_field' type_id=3 bits_offset=32 bitfield_size=4
          'arr_field' type_id=8 bits_offset=40
          'fwd_field' type_id=10 bits_offset=192
          'enum_field' type_id=14 bits_offset=256
          'typedef_ptr_field' type_id=15 bits_offset=320
  [5] CONST '(anon)' type_id=6
  [6] INT 'unsigned int' size=4 bits_offset=0 nr_bits=32 encoding=(none)
  [7] INT 'char' size=1 bits_offset=0 nr_bits=8 encoding=SIGNED
  [8] ARRAY '(anon)' type_id=7 index_type_id=9 nr_elems=16
  [9] INT '__ARRAY_SIZE_TYPE__' size=4 bits_offset=0 nr_bits=32 encoding=(none)
  [10] RESTRICT '(anon)' type_id=11
  [11] PTR '(anon)' type_id=12
  [12] CONST '(anon)' type_id=13
  [13] FWD 'fwd_struct' fwd_kind=union
  [14] ENUM 'my_enum' size=4 vlen=2
          'VAL1' val=3
          'VAL2' val=7
  [15] PTR '(anon)' type_id=16
  [16] VOLATILE '(anon)' type_id=17
  [17] TYPEDEF 'my_struct_t' type_id=4
  [18] FUNC_PROTO '(anon)' ret_type_id=3 vlen=2
          'arg1' type_id=1
          'arg2' type_id=3
  [19] FUNC 'my_func' type_id=18
  [20] VAR 'struct_global_var' type_id=4, linkage=global-alloc
  [21] VAR 'global_var' type_id=3, linkage=global-alloc
  [22] VAR 'my_func.static_var' type_id=3, linkage=static
  [23] DATASEC 'data_sec' size=0 vlen=3
          type_id=20 offset=0 size=48
          type_id=21 offset=0 size=4
          type_id=22 offset=52 size=4

The following commands print BTF types associated with specified map's key,
value, both key and value, and all BTF types, respectively. By default, both
key and value types will be printed.

**# bpftool btf dump map id 123 key**

::

  [39] TYPEDEF 'u32' type_id=37

**# bpftool btf dump map id 123 value**

::

  [86] PTR '(anon)' type_id=87

**# bpftool btf dump map id 123 kv**

::

  [39] TYPEDEF 'u32' type_id=37
  [86] PTR '(anon)' type_id=87

**# bpftool btf dump map id 123 all**

::

  [1] PTR '(anon)' type_id=0
  .
  .
  .
  [2866] ARRAY '(anon)' type_id=52 index_type_id=51 nr_elems=4

All the standard ways to specify map or program are supported:

**# bpftool btf dump map id 123**

**# bpftool btf dump map pinned /sys/fs/bpf/map_name**

**# bpftool btf dump prog id 456**

**# bpftool btf dump prog tag b88e0a09b1d9759d**

**# bpftool btf dump prog pinned /sys/fs/bpf/prog_name**
