1*858ea5e5SAndroid Build Coastguard Worker.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2*858ea5e5SAndroid Build Coastguard Worker 3*858ea5e5SAndroid Build Coastguard Worker================ 4*858ea5e5SAndroid Build Coastguard Workerbpftool-btf 5*858ea5e5SAndroid Build Coastguard Worker================ 6*858ea5e5SAndroid Build Coastguard Worker------------------------------------------------------------------------------- 7*858ea5e5SAndroid Build Coastguard Workertool for inspection of BTF data 8*858ea5e5SAndroid Build Coastguard Worker------------------------------------------------------------------------------- 9*858ea5e5SAndroid Build Coastguard Worker 10*858ea5e5SAndroid Build Coastguard Worker:Manual section: 8 11*858ea5e5SAndroid Build Coastguard Worker 12*858ea5e5SAndroid Build Coastguard Worker.. include:: substitutions.rst 13*858ea5e5SAndroid Build Coastguard Worker 14*858ea5e5SAndroid Build Coastguard WorkerSYNOPSIS 15*858ea5e5SAndroid Build Coastguard Worker======== 16*858ea5e5SAndroid Build Coastguard Worker 17*858ea5e5SAndroid Build Coastguard Worker **bpftool** [*OPTIONS*] **btf** *COMMAND* 18*858ea5e5SAndroid Build Coastguard Worker 19*858ea5e5SAndroid Build Coastguard Worker *OPTIONS* := { |COMMON_OPTIONS| | { **-B** | **--base-btf** } } 20*858ea5e5SAndroid Build Coastguard Worker 21*858ea5e5SAndroid Build Coastguard Worker *COMMANDS* := { **dump** | **help** } 22*858ea5e5SAndroid Build Coastguard Worker 23*858ea5e5SAndroid Build Coastguard WorkerBTF COMMANDS 24*858ea5e5SAndroid Build Coastguard Worker============= 25*858ea5e5SAndroid Build Coastguard Worker 26*858ea5e5SAndroid Build Coastguard Worker| **bpftool** **btf** { **show** | **list** } [**id** *BTF_ID*] 27*858ea5e5SAndroid Build Coastguard Worker| **bpftool** **btf dump** *BTF_SRC* [**format** *FORMAT*] 28*858ea5e5SAndroid Build Coastguard Worker| **bpftool** **btf help** 29*858ea5e5SAndroid Build Coastguard Worker| 30*858ea5e5SAndroid Build Coastguard Worker| *BTF_SRC* := { **id** *BTF_ID* | **prog** *PROG* | **map** *MAP* [{**key** | **value** | **kv** | **all**}] | **file** *FILE* } 31*858ea5e5SAndroid Build Coastguard Worker| *FORMAT* := { **raw** | **c** } 32*858ea5e5SAndroid Build Coastguard Worker| *MAP* := { **id** *MAP_ID* | **pinned** *FILE* } 33*858ea5e5SAndroid Build Coastguard Worker| *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* } 34*858ea5e5SAndroid Build Coastguard Worker 35*858ea5e5SAndroid Build Coastguard WorkerDESCRIPTION 36*858ea5e5SAndroid Build Coastguard Worker=========== 37*858ea5e5SAndroid Build Coastguard Worker **bpftool btf { show | list }** [**id** *BTF_ID*] 38*858ea5e5SAndroid Build Coastguard Worker Show information about loaded BTF objects. If a BTF ID is 39*858ea5e5SAndroid Build Coastguard Worker specified, show information only about given BTF object, 40*858ea5e5SAndroid Build Coastguard Worker otherwise list all BTF objects currently loaded on the 41*858ea5e5SAndroid Build Coastguard Worker system. 42*858ea5e5SAndroid Build Coastguard Worker 43*858ea5e5SAndroid Build Coastguard Worker Since Linux 5.8 bpftool is able to discover information about 44*858ea5e5SAndroid Build Coastguard Worker processes that hold open file descriptors (FDs) against BTF 45*858ea5e5SAndroid Build Coastguard Worker objects. On such kernels bpftool will automatically emit this 46*858ea5e5SAndroid Build Coastguard Worker information as well. 47*858ea5e5SAndroid Build Coastguard Worker 48*858ea5e5SAndroid Build Coastguard Worker **bpftool btf dump** *BTF_SRC* 49*858ea5e5SAndroid Build Coastguard Worker Dump BTF entries from a given *BTF_SRC*. 50*858ea5e5SAndroid Build Coastguard Worker 51*858ea5e5SAndroid Build Coastguard Worker When **id** is specified, BTF object with that ID will be 52*858ea5e5SAndroid Build Coastguard Worker loaded and all its BTF types emitted. 53*858ea5e5SAndroid Build Coastguard Worker 54*858ea5e5SAndroid Build Coastguard Worker When **map** is provided, it's expected that map has 55*858ea5e5SAndroid Build Coastguard Worker associated BTF object with BTF types describing key and 56*858ea5e5SAndroid Build Coastguard Worker value. It's possible to select whether to dump only BTF 57*858ea5e5SAndroid Build Coastguard Worker type(s) associated with key (**key**), value (**value**), 58*858ea5e5SAndroid Build Coastguard Worker both key and value (**kv**), or all BTF types present in 59*858ea5e5SAndroid Build Coastguard Worker associated BTF object (**all**). If not specified, **kv** 60*858ea5e5SAndroid Build Coastguard Worker is assumed. 61*858ea5e5SAndroid Build Coastguard Worker 62*858ea5e5SAndroid Build Coastguard Worker When **prog** is provided, it's expected that program has 63*858ea5e5SAndroid Build Coastguard Worker associated BTF object with BTF types. 64*858ea5e5SAndroid Build Coastguard Worker 65*858ea5e5SAndroid Build Coastguard Worker When specifying *FILE*, an ELF file is expected, containing 66*858ea5e5SAndroid Build Coastguard Worker .BTF section with well-defined BTF binary format data, 67*858ea5e5SAndroid Build Coastguard Worker typically produced by clang or pahole. 68*858ea5e5SAndroid Build Coastguard Worker 69*858ea5e5SAndroid Build Coastguard Worker **format** option can be used to override default (raw) 70*858ea5e5SAndroid Build Coastguard Worker output format. Raw (**raw**) or C-syntax (**c**) output 71*858ea5e5SAndroid Build Coastguard Worker formats are supported. 72*858ea5e5SAndroid Build Coastguard Worker 73*858ea5e5SAndroid Build Coastguard Worker **bpftool btf help** 74*858ea5e5SAndroid Build Coastguard Worker Print short help message. 75*858ea5e5SAndroid Build Coastguard Worker 76*858ea5e5SAndroid Build Coastguard WorkerOPTIONS 77*858ea5e5SAndroid Build Coastguard Worker======= 78*858ea5e5SAndroid Build Coastguard Worker .. include:: common_options.rst 79*858ea5e5SAndroid Build Coastguard Worker 80*858ea5e5SAndroid Build Coastguard Worker -B, --base-btf *FILE* 81*858ea5e5SAndroid Build Coastguard Worker Pass a base BTF object. Base BTF objects are typically used 82*858ea5e5SAndroid Build Coastguard Worker with BTF objects for kernel modules. To avoid duplicating 83*858ea5e5SAndroid Build Coastguard Worker all kernel symbols required by modules, BTF objects for 84*858ea5e5SAndroid Build Coastguard Worker modules are "split", they are built incrementally on top of 85*858ea5e5SAndroid Build Coastguard Worker the kernel (vmlinux) BTF object. So the base BTF reference 86*858ea5e5SAndroid Build Coastguard Worker should usually point to the kernel BTF. 87*858ea5e5SAndroid Build Coastguard Worker 88*858ea5e5SAndroid Build Coastguard Worker When the main BTF object to process (for example, the 89*858ea5e5SAndroid Build Coastguard Worker module BTF to dump) is passed as a *FILE*, bpftool attempts 90*858ea5e5SAndroid Build Coastguard Worker to autodetect the path for the base object, and passing 91*858ea5e5SAndroid Build Coastguard Worker this option is optional. When the main BTF object is passed 92*858ea5e5SAndroid Build Coastguard Worker through other handles, this option becomes necessary. 93*858ea5e5SAndroid Build Coastguard Worker 94*858ea5e5SAndroid Build Coastguard WorkerEXAMPLES 95*858ea5e5SAndroid Build Coastguard Worker======== 96*858ea5e5SAndroid Build Coastguard Worker**# bpftool btf dump id 1226** 97*858ea5e5SAndroid Build Coastguard Worker 98*858ea5e5SAndroid Build Coastguard Worker:: 99*858ea5e5SAndroid Build Coastguard Worker 100*858ea5e5SAndroid Build Coastguard Worker [1] PTR '(anon)' type_id=2 101*858ea5e5SAndroid Build Coastguard Worker [2] STRUCT 'dummy_tracepoint_args' size=16 vlen=2 102*858ea5e5SAndroid Build Coastguard Worker 'pad' type_id=3 bits_offset=0 103*858ea5e5SAndroid Build Coastguard Worker 'sock' type_id=4 bits_offset=64 104*858ea5e5SAndroid Build Coastguard Worker [3] INT 'long long unsigned int' size=8 bits_offset=0 nr_bits=64 encoding=(none) 105*858ea5e5SAndroid Build Coastguard Worker [4] PTR '(anon)' type_id=5 106*858ea5e5SAndroid Build Coastguard Worker [5] FWD 'sock' fwd_kind=union 107*858ea5e5SAndroid Build Coastguard Worker 108*858ea5e5SAndroid Build Coastguard WorkerThis gives an example of default output for all supported BTF kinds. 109*858ea5e5SAndroid Build Coastguard Worker 110*858ea5e5SAndroid Build Coastguard Worker**$ cat prog.c** 111*858ea5e5SAndroid Build Coastguard Worker 112*858ea5e5SAndroid Build Coastguard Worker:: 113*858ea5e5SAndroid Build Coastguard Worker 114*858ea5e5SAndroid Build Coastguard Worker struct fwd_struct; 115*858ea5e5SAndroid Build Coastguard Worker 116*858ea5e5SAndroid Build Coastguard Worker enum my_enum { 117*858ea5e5SAndroid Build Coastguard Worker VAL1 = 3, 118*858ea5e5SAndroid Build Coastguard Worker VAL2 = 7, 119*858ea5e5SAndroid Build Coastguard Worker }; 120*858ea5e5SAndroid Build Coastguard Worker 121*858ea5e5SAndroid Build Coastguard Worker typedef struct my_struct my_struct_t; 122*858ea5e5SAndroid Build Coastguard Worker 123*858ea5e5SAndroid Build Coastguard Worker struct my_struct { 124*858ea5e5SAndroid Build Coastguard Worker const unsigned int const_int_field; 125*858ea5e5SAndroid Build Coastguard Worker int bitfield_field: 4; 126*858ea5e5SAndroid Build Coastguard Worker char arr_field[16]; 127*858ea5e5SAndroid Build Coastguard Worker const struct fwd_struct *restrict fwd_field; 128*858ea5e5SAndroid Build Coastguard Worker enum my_enum enum_field; 129*858ea5e5SAndroid Build Coastguard Worker volatile my_struct_t *typedef_ptr_field; 130*858ea5e5SAndroid Build Coastguard Worker }; 131*858ea5e5SAndroid Build Coastguard Worker 132*858ea5e5SAndroid Build Coastguard Worker union my_union { 133*858ea5e5SAndroid Build Coastguard Worker int a; 134*858ea5e5SAndroid Build Coastguard Worker struct my_struct b; 135*858ea5e5SAndroid Build Coastguard Worker }; 136*858ea5e5SAndroid Build Coastguard Worker 137*858ea5e5SAndroid Build Coastguard Worker struct my_struct struct_global_var __attribute__((section("data_sec"))) = { 138*858ea5e5SAndroid Build Coastguard Worker .bitfield_field = 3, 139*858ea5e5SAndroid Build Coastguard Worker .enum_field = VAL1, 140*858ea5e5SAndroid Build Coastguard Worker }; 141*858ea5e5SAndroid Build Coastguard Worker int global_var __attribute__((section("data_sec"))) = 7; 142*858ea5e5SAndroid Build Coastguard Worker 143*858ea5e5SAndroid Build Coastguard Worker __attribute__((noinline)) 144*858ea5e5SAndroid Build Coastguard Worker int my_func(union my_union *arg1, int arg2) 145*858ea5e5SAndroid Build Coastguard Worker { 146*858ea5e5SAndroid Build Coastguard Worker static int static_var __attribute__((section("data_sec"))) = 123; 147*858ea5e5SAndroid Build Coastguard Worker static_var++; 148*858ea5e5SAndroid Build Coastguard Worker return static_var; 149*858ea5e5SAndroid Build Coastguard Worker } 150*858ea5e5SAndroid Build Coastguard Worker 151*858ea5e5SAndroid Build Coastguard Worker**$ bpftool btf dump file prog.o** 152*858ea5e5SAndroid Build Coastguard Worker 153*858ea5e5SAndroid Build Coastguard Worker:: 154*858ea5e5SAndroid Build Coastguard Worker 155*858ea5e5SAndroid Build Coastguard Worker [1] PTR '(anon)' type_id=2 156*858ea5e5SAndroid Build Coastguard Worker [2] UNION 'my_union' size=48 vlen=2 157*858ea5e5SAndroid Build Coastguard Worker 'a' type_id=3 bits_offset=0 158*858ea5e5SAndroid Build Coastguard Worker 'b' type_id=4 bits_offset=0 159*858ea5e5SAndroid Build Coastguard Worker [3] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED 160*858ea5e5SAndroid Build Coastguard Worker [4] STRUCT 'my_struct' size=48 vlen=6 161*858ea5e5SAndroid Build Coastguard Worker 'const_int_field' type_id=5 bits_offset=0 162*858ea5e5SAndroid Build Coastguard Worker 'bitfield_field' type_id=3 bits_offset=32 bitfield_size=4 163*858ea5e5SAndroid Build Coastguard Worker 'arr_field' type_id=8 bits_offset=40 164*858ea5e5SAndroid Build Coastguard Worker 'fwd_field' type_id=10 bits_offset=192 165*858ea5e5SAndroid Build Coastguard Worker 'enum_field' type_id=14 bits_offset=256 166*858ea5e5SAndroid Build Coastguard Worker 'typedef_ptr_field' type_id=15 bits_offset=320 167*858ea5e5SAndroid Build Coastguard Worker [5] CONST '(anon)' type_id=6 168*858ea5e5SAndroid Build Coastguard Worker [6] INT 'unsigned int' size=4 bits_offset=0 nr_bits=32 encoding=(none) 169*858ea5e5SAndroid Build Coastguard Worker [7] INT 'char' size=1 bits_offset=0 nr_bits=8 encoding=SIGNED 170*858ea5e5SAndroid Build Coastguard Worker [8] ARRAY '(anon)' type_id=7 index_type_id=9 nr_elems=16 171*858ea5e5SAndroid Build Coastguard Worker [9] INT '__ARRAY_SIZE_TYPE__' size=4 bits_offset=0 nr_bits=32 encoding=(none) 172*858ea5e5SAndroid Build Coastguard Worker [10] RESTRICT '(anon)' type_id=11 173*858ea5e5SAndroid Build Coastguard Worker [11] PTR '(anon)' type_id=12 174*858ea5e5SAndroid Build Coastguard Worker [12] CONST '(anon)' type_id=13 175*858ea5e5SAndroid Build Coastguard Worker [13] FWD 'fwd_struct' fwd_kind=union 176*858ea5e5SAndroid Build Coastguard Worker [14] ENUM 'my_enum' size=4 vlen=2 177*858ea5e5SAndroid Build Coastguard Worker 'VAL1' val=3 178*858ea5e5SAndroid Build Coastguard Worker 'VAL2' val=7 179*858ea5e5SAndroid Build Coastguard Worker [15] PTR '(anon)' type_id=16 180*858ea5e5SAndroid Build Coastguard Worker [16] VOLATILE '(anon)' type_id=17 181*858ea5e5SAndroid Build Coastguard Worker [17] TYPEDEF 'my_struct_t' type_id=4 182*858ea5e5SAndroid Build Coastguard Worker [18] FUNC_PROTO '(anon)' ret_type_id=3 vlen=2 183*858ea5e5SAndroid Build Coastguard Worker 'arg1' type_id=1 184*858ea5e5SAndroid Build Coastguard Worker 'arg2' type_id=3 185*858ea5e5SAndroid Build Coastguard Worker [19] FUNC 'my_func' type_id=18 186*858ea5e5SAndroid Build Coastguard Worker [20] VAR 'struct_global_var' type_id=4, linkage=global-alloc 187*858ea5e5SAndroid Build Coastguard Worker [21] VAR 'global_var' type_id=3, linkage=global-alloc 188*858ea5e5SAndroid Build Coastguard Worker [22] VAR 'my_func.static_var' type_id=3, linkage=static 189*858ea5e5SAndroid Build Coastguard Worker [23] DATASEC 'data_sec' size=0 vlen=3 190*858ea5e5SAndroid Build Coastguard Worker type_id=20 offset=0 size=48 191*858ea5e5SAndroid Build Coastguard Worker type_id=21 offset=0 size=4 192*858ea5e5SAndroid Build Coastguard Worker type_id=22 offset=52 size=4 193*858ea5e5SAndroid Build Coastguard Worker 194*858ea5e5SAndroid Build Coastguard WorkerThe following commands print BTF types associated with specified map's key, 195*858ea5e5SAndroid Build Coastguard Workervalue, both key and value, and all BTF types, respectively. By default, both 196*858ea5e5SAndroid Build Coastguard Workerkey and value types will be printed. 197*858ea5e5SAndroid Build Coastguard Worker 198*858ea5e5SAndroid Build Coastguard Worker**# bpftool btf dump map id 123 key** 199*858ea5e5SAndroid Build Coastguard Worker 200*858ea5e5SAndroid Build Coastguard Worker:: 201*858ea5e5SAndroid Build Coastguard Worker 202*858ea5e5SAndroid Build Coastguard Worker [39] TYPEDEF 'u32' type_id=37 203*858ea5e5SAndroid Build Coastguard Worker 204*858ea5e5SAndroid Build Coastguard Worker**# bpftool btf dump map id 123 value** 205*858ea5e5SAndroid Build Coastguard Worker 206*858ea5e5SAndroid Build Coastguard Worker:: 207*858ea5e5SAndroid Build Coastguard Worker 208*858ea5e5SAndroid Build Coastguard Worker [86] PTR '(anon)' type_id=87 209*858ea5e5SAndroid Build Coastguard Worker 210*858ea5e5SAndroid Build Coastguard Worker**# bpftool btf dump map id 123 kv** 211*858ea5e5SAndroid Build Coastguard Worker 212*858ea5e5SAndroid Build Coastguard Worker:: 213*858ea5e5SAndroid Build Coastguard Worker 214*858ea5e5SAndroid Build Coastguard Worker [39] TYPEDEF 'u32' type_id=37 215*858ea5e5SAndroid Build Coastguard Worker [86] PTR '(anon)' type_id=87 216*858ea5e5SAndroid Build Coastguard Worker 217*858ea5e5SAndroid Build Coastguard Worker**# bpftool btf dump map id 123 all** 218*858ea5e5SAndroid Build Coastguard Worker 219*858ea5e5SAndroid Build Coastguard Worker:: 220*858ea5e5SAndroid Build Coastguard Worker 221*858ea5e5SAndroid Build Coastguard Worker [1] PTR '(anon)' type_id=0 222*858ea5e5SAndroid Build Coastguard Worker . 223*858ea5e5SAndroid Build Coastguard Worker . 224*858ea5e5SAndroid Build Coastguard Worker . 225*858ea5e5SAndroid Build Coastguard Worker [2866] ARRAY '(anon)' type_id=52 index_type_id=51 nr_elems=4 226*858ea5e5SAndroid Build Coastguard Worker 227*858ea5e5SAndroid Build Coastguard WorkerAll the standard ways to specify map or program are supported: 228*858ea5e5SAndroid Build Coastguard Worker 229*858ea5e5SAndroid Build Coastguard Worker**# bpftool btf dump map id 123** 230*858ea5e5SAndroid Build Coastguard Worker 231*858ea5e5SAndroid Build Coastguard Worker**# bpftool btf dump map pinned /sys/fs/bpf/map_name** 232*858ea5e5SAndroid Build Coastguard Worker 233*858ea5e5SAndroid Build Coastguard Worker**# bpftool btf dump prog id 456** 234*858ea5e5SAndroid Build Coastguard Worker 235*858ea5e5SAndroid Build Coastguard Worker**# bpftool btf dump prog tag b88e0a09b1d9759d** 236*858ea5e5SAndroid Build Coastguard Worker 237*858ea5e5SAndroid Build Coastguard Worker**# bpftool btf dump prog pinned /sys/fs/bpf/prog_name** 238*858ea5e5SAndroid Build Coastguard Worker 239*858ea5e5SAndroid Build Coastguard Worker| 240*858ea5e5SAndroid Build Coastguard Worker| **# bpftool btf dump file /sys/kernel/btf/i2c_smbus** 241*858ea5e5SAndroid Build Coastguard Worker| (or) 242*858ea5e5SAndroid Build Coastguard Worker| **# I2C_SMBUS_ID=$(bpftool btf show -p | jq '.[] | select(.name=="i2c_smbus").id')** 243*858ea5e5SAndroid Build Coastguard Worker| **# bpftool btf dump id ${I2C_SMBUS_ID} -B /sys/kernel/btf/vmlinux** 244*858ea5e5SAndroid Build Coastguard Worker 245*858ea5e5SAndroid Build Coastguard Worker:: 246*858ea5e5SAndroid Build Coastguard Worker 247*858ea5e5SAndroid Build Coastguard Worker [104848] STRUCT 'i2c_smbus_alert' size=40 vlen=2 248*858ea5e5SAndroid Build Coastguard Worker 'alert' type_id=393 bits_offset=0 249*858ea5e5SAndroid Build Coastguard Worker 'ara' type_id=56050 bits_offset=256 250*858ea5e5SAndroid Build Coastguard Worker [104849] STRUCT 'alert_data' size=12 vlen=3 251*858ea5e5SAndroid Build Coastguard Worker 'addr' type_id=16 bits_offset=0 252*858ea5e5SAndroid Build Coastguard Worker 'type' type_id=56053 bits_offset=32 253*858ea5e5SAndroid Build Coastguard Worker 'data' type_id=7 bits_offset=64 254*858ea5e5SAndroid Build Coastguard Worker [104850] PTR '(anon)' type_id=104848 255*858ea5e5SAndroid Build Coastguard Worker [104851] PTR '(anon)' type_id=104849 256*858ea5e5SAndroid Build Coastguard Worker [104852] FUNC 'i2c_register_spd' type_id=84745 linkage=static 257*858ea5e5SAndroid Build Coastguard Worker [104853] FUNC 'smbalert_driver_init' type_id=1213 linkage=static 258*858ea5e5SAndroid Build Coastguard Worker [104854] FUNC_PROTO '(anon)' ret_type_id=18 vlen=1 259*858ea5e5SAndroid Build Coastguard Worker 'ara' type_id=56050 260*858ea5e5SAndroid Build Coastguard Worker [104855] FUNC 'i2c_handle_smbus_alert' type_id=104854 linkage=static 261*858ea5e5SAndroid Build Coastguard Worker [104856] FUNC 'smbalert_remove' type_id=104854 linkage=static 262*858ea5e5SAndroid Build Coastguard Worker [104857] FUNC_PROTO '(anon)' ret_type_id=18 vlen=2 263*858ea5e5SAndroid Build Coastguard Worker 'ara' type_id=56050 264*858ea5e5SAndroid Build Coastguard Worker 'id' type_id=56056 265*858ea5e5SAndroid Build Coastguard Worker [104858] FUNC 'smbalert_probe' type_id=104857 linkage=static 266*858ea5e5SAndroid Build Coastguard Worker [104859] FUNC 'smbalert_work' type_id=9695 linkage=static 267*858ea5e5SAndroid Build Coastguard Worker [104860] FUNC 'smbus_alert' type_id=71367 linkage=static 268*858ea5e5SAndroid Build Coastguard Worker [104861] FUNC 'smbus_do_alert' type_id=84827 linkage=static 269