xref: /OK3568_Linux_fs/kernel/tools/bpf/bpftool/Documentation/bpftool-btf.rst (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun================
2*4882a593Smuzhiyunbpftool-btf
3*4882a593Smuzhiyun================
4*4882a593Smuzhiyun-------------------------------------------------------------------------------
5*4882a593Smuzhiyuntool for inspection of BTF data
6*4882a593Smuzhiyun-------------------------------------------------------------------------------
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun:Manual section: 8
9*4882a593Smuzhiyun
10*4882a593SmuzhiyunSYNOPSIS
11*4882a593Smuzhiyun========
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun	**bpftool** [*OPTIONS*] **btf** *COMMAND*
14*4882a593Smuzhiyun
15*4882a593Smuzhiyun	*OPTIONS* := { { **-j** | **--json** } [{ **-p** | **--pretty** }] }
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun	*COMMANDS* := { **dump** | **help** }
18*4882a593Smuzhiyun
19*4882a593SmuzhiyunBTF COMMANDS
20*4882a593Smuzhiyun=============
21*4882a593Smuzhiyun
22*4882a593Smuzhiyun|	**bpftool** **btf** { **show** | **list** } [**id** *BTF_ID*]
23*4882a593Smuzhiyun|	**bpftool** **btf dump** *BTF_SRC* [**format** *FORMAT*]
24*4882a593Smuzhiyun|	**bpftool** **btf help**
25*4882a593Smuzhiyun|
26*4882a593Smuzhiyun|	*BTF_SRC* := { **id** *BTF_ID* | **prog** *PROG* | **map** *MAP* [{**key** | **value** | **kv** | **all**}] | **file** *FILE* }
27*4882a593Smuzhiyun|	*FORMAT* := { **raw** | **c** }
28*4882a593Smuzhiyun|	*MAP* := { **id** *MAP_ID* | **pinned** *FILE* }
29*4882a593Smuzhiyun|	*PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* }
30*4882a593Smuzhiyun
31*4882a593SmuzhiyunDESCRIPTION
32*4882a593Smuzhiyun===========
33*4882a593Smuzhiyun	**bpftool btf { show | list }** [**id** *BTF_ID*]
34*4882a593Smuzhiyun		  Show information about loaded BTF objects. If a BTF ID is
35*4882a593Smuzhiyun		  specified, show information only about given BTF object,
36*4882a593Smuzhiyun		  otherwise list all BTF objects currently loaded on the
37*4882a593Smuzhiyun		  system.
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun		  Since Linux 5.8 bpftool is able to discover information about
40*4882a593Smuzhiyun		  processes that hold open file descriptors (FDs) against BTF
41*4882a593Smuzhiyun		  objects. On such kernels bpftool will automatically emit this
42*4882a593Smuzhiyun		  information as well.
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun	**bpftool btf dump** *BTF_SRC*
45*4882a593Smuzhiyun		  Dump BTF entries from a given *BTF_SRC*.
46*4882a593Smuzhiyun
47*4882a593Smuzhiyun		  When **id** is specified, BTF object with that ID will be
48*4882a593Smuzhiyun		  loaded and all its BTF types emitted.
49*4882a593Smuzhiyun
50*4882a593Smuzhiyun		  When **map** is provided, it's expected that map has
51*4882a593Smuzhiyun		  associated BTF object with BTF types describing key and
52*4882a593Smuzhiyun		  value. It's possible to select whether to dump only BTF
53*4882a593Smuzhiyun		  type(s) associated with key (**key**), value (**value**),
54*4882a593Smuzhiyun		  both key and value (**kv**), or all BTF types present in
55*4882a593Smuzhiyun		  associated BTF object (**all**). If not specified, **kv**
56*4882a593Smuzhiyun		  is assumed.
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun		  When **prog** is provided, it's expected that program has
59*4882a593Smuzhiyun		  associated BTF object with BTF types.
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun		  When specifying *FILE*, an ELF file is expected, containing
62*4882a593Smuzhiyun		  .BTF section with well-defined BTF binary format data,
63*4882a593Smuzhiyun		  typically produced by clang or pahole.
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun		  **format** option can be used to override default (raw)
66*4882a593Smuzhiyun		  output format. Raw (**raw**) or C-syntax (**c**) output
67*4882a593Smuzhiyun		  formats are supported.
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun	**bpftool btf help**
70*4882a593Smuzhiyun		  Print short help message.
71*4882a593Smuzhiyun
72*4882a593SmuzhiyunOPTIONS
73*4882a593Smuzhiyun=======
74*4882a593Smuzhiyun	.. include:: common_options.rst
75*4882a593Smuzhiyun
76*4882a593SmuzhiyunEXAMPLES
77*4882a593Smuzhiyun========
78*4882a593Smuzhiyun**# bpftool btf dump id 1226**
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun::
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun  [1] PTR '(anon)' type_id=2
83*4882a593Smuzhiyun  [2] STRUCT 'dummy_tracepoint_args' size=16 vlen=2
84*4882a593Smuzhiyun          'pad' type_id=3 bits_offset=0
85*4882a593Smuzhiyun          'sock' type_id=4 bits_offset=64
86*4882a593Smuzhiyun  [3] INT 'long long unsigned int' size=8 bits_offset=0 nr_bits=64 encoding=(none)
87*4882a593Smuzhiyun  [4] PTR '(anon)' type_id=5
88*4882a593Smuzhiyun  [5] FWD 'sock' fwd_kind=union
89*4882a593Smuzhiyun
90*4882a593SmuzhiyunThis gives an example of default output for all supported BTF kinds.
91*4882a593Smuzhiyun
92*4882a593Smuzhiyun**$ cat prog.c**
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun::
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun  struct fwd_struct;
97*4882a593Smuzhiyun
98*4882a593Smuzhiyun  enum my_enum {
99*4882a593Smuzhiyun          VAL1 = 3,
100*4882a593Smuzhiyun          VAL2 = 7,
101*4882a593Smuzhiyun  };
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun  typedef struct my_struct my_struct_t;
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun  struct my_struct {
106*4882a593Smuzhiyun          const unsigned int const_int_field;
107*4882a593Smuzhiyun          int bitfield_field: 4;
108*4882a593Smuzhiyun          char arr_field[16];
109*4882a593Smuzhiyun          const struct fwd_struct *restrict fwd_field;
110*4882a593Smuzhiyun          enum my_enum enum_field;
111*4882a593Smuzhiyun          volatile my_struct_t *typedef_ptr_field;
112*4882a593Smuzhiyun  };
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun  union my_union {
115*4882a593Smuzhiyun          int a;
116*4882a593Smuzhiyun          struct my_struct b;
117*4882a593Smuzhiyun  };
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun  struct my_struct struct_global_var __attribute__((section("data_sec"))) = {
120*4882a593Smuzhiyun          .bitfield_field = 3,
121*4882a593Smuzhiyun          .enum_field = VAL1,
122*4882a593Smuzhiyun  };
123*4882a593Smuzhiyun  int global_var __attribute__((section("data_sec"))) = 7;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun  __attribute__((noinline))
126*4882a593Smuzhiyun  int my_func(union my_union *arg1, int arg2)
127*4882a593Smuzhiyun  {
128*4882a593Smuzhiyun          static int static_var __attribute__((section("data_sec"))) = 123;
129*4882a593Smuzhiyun          static_var++;
130*4882a593Smuzhiyun          return static_var;
131*4882a593Smuzhiyun  }
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun**$ bpftool btf dump file prog.o**
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun::
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun  [1] PTR '(anon)' type_id=2
138*4882a593Smuzhiyun  [2] UNION 'my_union' size=48 vlen=2
139*4882a593Smuzhiyun          'a' type_id=3 bits_offset=0
140*4882a593Smuzhiyun          'b' type_id=4 bits_offset=0
141*4882a593Smuzhiyun  [3] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
142*4882a593Smuzhiyun  [4] STRUCT 'my_struct' size=48 vlen=6
143*4882a593Smuzhiyun          'const_int_field' type_id=5 bits_offset=0
144*4882a593Smuzhiyun          'bitfield_field' type_id=3 bits_offset=32 bitfield_size=4
145*4882a593Smuzhiyun          'arr_field' type_id=8 bits_offset=40
146*4882a593Smuzhiyun          'fwd_field' type_id=10 bits_offset=192
147*4882a593Smuzhiyun          'enum_field' type_id=14 bits_offset=256
148*4882a593Smuzhiyun          'typedef_ptr_field' type_id=15 bits_offset=320
149*4882a593Smuzhiyun  [5] CONST '(anon)' type_id=6
150*4882a593Smuzhiyun  [6] INT 'unsigned int' size=4 bits_offset=0 nr_bits=32 encoding=(none)
151*4882a593Smuzhiyun  [7] INT 'char' size=1 bits_offset=0 nr_bits=8 encoding=SIGNED
152*4882a593Smuzhiyun  [8] ARRAY '(anon)' type_id=7 index_type_id=9 nr_elems=16
153*4882a593Smuzhiyun  [9] INT '__ARRAY_SIZE_TYPE__' size=4 bits_offset=0 nr_bits=32 encoding=(none)
154*4882a593Smuzhiyun  [10] RESTRICT '(anon)' type_id=11
155*4882a593Smuzhiyun  [11] PTR '(anon)' type_id=12
156*4882a593Smuzhiyun  [12] CONST '(anon)' type_id=13
157*4882a593Smuzhiyun  [13] FWD 'fwd_struct' fwd_kind=union
158*4882a593Smuzhiyun  [14] ENUM 'my_enum' size=4 vlen=2
159*4882a593Smuzhiyun          'VAL1' val=3
160*4882a593Smuzhiyun          'VAL2' val=7
161*4882a593Smuzhiyun  [15] PTR '(anon)' type_id=16
162*4882a593Smuzhiyun  [16] VOLATILE '(anon)' type_id=17
163*4882a593Smuzhiyun  [17] TYPEDEF 'my_struct_t' type_id=4
164*4882a593Smuzhiyun  [18] FUNC_PROTO '(anon)' ret_type_id=3 vlen=2
165*4882a593Smuzhiyun          'arg1' type_id=1
166*4882a593Smuzhiyun          'arg2' type_id=3
167*4882a593Smuzhiyun  [19] FUNC 'my_func' type_id=18
168*4882a593Smuzhiyun  [20] VAR 'struct_global_var' type_id=4, linkage=global-alloc
169*4882a593Smuzhiyun  [21] VAR 'global_var' type_id=3, linkage=global-alloc
170*4882a593Smuzhiyun  [22] VAR 'my_func.static_var' type_id=3, linkage=static
171*4882a593Smuzhiyun  [23] DATASEC 'data_sec' size=0 vlen=3
172*4882a593Smuzhiyun          type_id=20 offset=0 size=48
173*4882a593Smuzhiyun          type_id=21 offset=0 size=4
174*4882a593Smuzhiyun          type_id=22 offset=52 size=4
175*4882a593Smuzhiyun
176*4882a593SmuzhiyunThe following commands print BTF types associated with specified map's key,
177*4882a593Smuzhiyunvalue, both key and value, and all BTF types, respectively. By default, both
178*4882a593Smuzhiyunkey and value types will be printed.
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun**# bpftool btf dump map id 123 key**
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun::
183*4882a593Smuzhiyun
184*4882a593Smuzhiyun  [39] TYPEDEF 'u32' type_id=37
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun**# bpftool btf dump map id 123 value**
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun::
189*4882a593Smuzhiyun
190*4882a593Smuzhiyun  [86] PTR '(anon)' type_id=87
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun**# bpftool btf dump map id 123 kv**
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun::
195*4882a593Smuzhiyun
196*4882a593Smuzhiyun  [39] TYPEDEF 'u32' type_id=37
197*4882a593Smuzhiyun  [86] PTR '(anon)' type_id=87
198*4882a593Smuzhiyun
199*4882a593Smuzhiyun**# bpftool btf dump map id 123 all**
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun::
202*4882a593Smuzhiyun
203*4882a593Smuzhiyun  [1] PTR '(anon)' type_id=0
204*4882a593Smuzhiyun  .
205*4882a593Smuzhiyun  .
206*4882a593Smuzhiyun  .
207*4882a593Smuzhiyun  [2866] ARRAY '(anon)' type_id=52 index_type_id=51 nr_elems=4
208*4882a593Smuzhiyun
209*4882a593SmuzhiyunAll the standard ways to specify map or program are supported:
210*4882a593Smuzhiyun
211*4882a593Smuzhiyun**# bpftool btf dump map id 123**
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun**# bpftool btf dump map pinned /sys/fs/bpf/map_name**
214*4882a593Smuzhiyun
215*4882a593Smuzhiyun**# bpftool btf dump prog id 456**
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun**# bpftool btf dump prog tag b88e0a09b1d9759d**
218*4882a593Smuzhiyun
219*4882a593Smuzhiyun**# bpftool btf dump prog pinned /sys/fs/bpf/prog_name**
220