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