Back to home page

OSCL-LXR

 
 

    


0001 .. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
0002 
0003 ================
0004 bpftool-btf
0005 ================
0006 -------------------------------------------------------------------------------
0007 tool for inspection of BTF data
0008 -------------------------------------------------------------------------------
0009 
0010 :Manual section: 8
0011 
0012 .. include:: substitutions.rst
0013 
0014 SYNOPSIS
0015 ========
0016 
0017         **bpftool** [*OPTIONS*] **btf** *COMMAND*
0018 
0019         *OPTIONS* := { |COMMON_OPTIONS| | { **-B** | **--base-btf** } }
0020 
0021         *COMMANDS* := { **dump** | **help** }
0022 
0023 BTF COMMANDS
0024 =============
0025 
0026 |       **bpftool** **btf** { **show** | **list** } [**id** *BTF_ID*]
0027 |       **bpftool** **btf dump** *BTF_SRC* [**format** *FORMAT*]
0028 |       **bpftool** **btf help**
0029 |
0030 |       *BTF_SRC* := { **id** *BTF_ID* | **prog** *PROG* | **map** *MAP* [{**key** | **value** | **kv** | **all**}] | **file** *FILE* }
0031 |       *FORMAT* := { **raw** | **c** }
0032 |       *MAP* := { **id** *MAP_ID* | **pinned** *FILE* }
0033 |       *PROG* := { **id** *PROG_ID* | **pinned** *FILE* | **tag** *PROG_TAG* }
0034 
0035 DESCRIPTION
0036 ===========
0037         **bpftool btf { show | list }** [**id** *BTF_ID*]
0038                   Show information about loaded BTF objects. If a BTF ID is
0039                   specified, show information only about given BTF object,
0040                   otherwise list all BTF objects currently loaded on the
0041                   system.
0042 
0043                   Since Linux 5.8 bpftool is able to discover information about
0044                   processes that hold open file descriptors (FDs) against BTF
0045                   objects. On such kernels bpftool will automatically emit this
0046                   information as well.
0047 
0048         **bpftool btf dump** *BTF_SRC*
0049                   Dump BTF entries from a given *BTF_SRC*.
0050 
0051                   When **id** is specified, BTF object with that ID will be
0052                   loaded and all its BTF types emitted.
0053 
0054                   When **map** is provided, it's expected that map has
0055                   associated BTF object with BTF types describing key and
0056                   value. It's possible to select whether to dump only BTF
0057                   type(s) associated with key (**key**), value (**value**),
0058                   both key and value (**kv**), or all BTF types present in
0059                   associated BTF object (**all**). If not specified, **kv**
0060                   is assumed.
0061 
0062                   When **prog** is provided, it's expected that program has
0063                   associated BTF object with BTF types.
0064 
0065                   When specifying *FILE*, an ELF file is expected, containing
0066                   .BTF section with well-defined BTF binary format data,
0067                   typically produced by clang or pahole.
0068 
0069                   **format** option can be used to override default (raw)
0070                   output format. Raw (**raw**) or C-syntax (**c**) output
0071                   formats are supported.
0072 
0073         **bpftool btf help**
0074                   Print short help message.
0075 
0076 OPTIONS
0077 =======
0078         .. include:: common_options.rst
0079 
0080         -B, --base-btf *FILE*
0081                   Pass a base BTF object. Base BTF objects are typically used
0082                   with BTF objects for kernel modules. To avoid duplicating
0083                   all kernel symbols required by modules, BTF objects for
0084                   modules are "split", they are built incrementally on top of
0085                   the kernel (vmlinux) BTF object. So the base BTF reference
0086                   should usually point to the kernel BTF.
0087 
0088                   When the main BTF object to process (for example, the
0089                   module BTF to dump) is passed as a *FILE*, bpftool attempts
0090                   to autodetect the path for the base object, and passing
0091                   this option is optional. When the main BTF object is passed
0092                   through other handles, this option becomes necessary.
0093 
0094 EXAMPLES
0095 ========
0096 **# bpftool btf dump id 1226**
0097 
0098 ::
0099 
0100   [1] PTR '(anon)' type_id=2
0101   [2] STRUCT 'dummy_tracepoint_args' size=16 vlen=2
0102           'pad' type_id=3 bits_offset=0
0103           'sock' type_id=4 bits_offset=64
0104   [3] INT 'long long unsigned int' size=8 bits_offset=0 nr_bits=64 encoding=(none)
0105   [4] PTR '(anon)' type_id=5
0106   [5] FWD 'sock' fwd_kind=union
0107 
0108 This gives an example of default output for all supported BTF kinds.
0109 
0110 **$ cat prog.c**
0111 
0112 ::
0113 
0114   struct fwd_struct;
0115 
0116   enum my_enum {
0117           VAL1 = 3,
0118           VAL2 = 7,
0119   };
0120 
0121   typedef struct my_struct my_struct_t;
0122 
0123   struct my_struct {
0124           const unsigned int const_int_field;
0125           int bitfield_field: 4;
0126           char arr_field[16];
0127           const struct fwd_struct *restrict fwd_field;
0128           enum my_enum enum_field;
0129           volatile my_struct_t *typedef_ptr_field;
0130   };
0131 
0132   union my_union {
0133           int a;
0134           struct my_struct b;
0135   };
0136 
0137   struct my_struct struct_global_var __attribute__((section("data_sec"))) = {
0138           .bitfield_field = 3,
0139           .enum_field = VAL1,
0140   };
0141   int global_var __attribute__((section("data_sec"))) = 7;
0142 
0143   __attribute__((noinline))
0144   int my_func(union my_union *arg1, int arg2)
0145   {
0146           static int static_var __attribute__((section("data_sec"))) = 123;
0147           static_var++;
0148           return static_var;
0149   }
0150 
0151 **$ bpftool btf dump file prog.o**
0152 
0153 ::
0154 
0155   [1] PTR '(anon)' type_id=2
0156   [2] UNION 'my_union' size=48 vlen=2
0157           'a' type_id=3 bits_offset=0
0158           'b' type_id=4 bits_offset=0
0159   [3] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
0160   [4] STRUCT 'my_struct' size=48 vlen=6
0161           'const_int_field' type_id=5 bits_offset=0
0162           'bitfield_field' type_id=3 bits_offset=32 bitfield_size=4
0163           'arr_field' type_id=8 bits_offset=40
0164           'fwd_field' type_id=10 bits_offset=192
0165           'enum_field' type_id=14 bits_offset=256
0166           'typedef_ptr_field' type_id=15 bits_offset=320
0167   [5] CONST '(anon)' type_id=6
0168   [6] INT 'unsigned int' size=4 bits_offset=0 nr_bits=32 encoding=(none)
0169   [7] INT 'char' size=1 bits_offset=0 nr_bits=8 encoding=SIGNED
0170   [8] ARRAY '(anon)' type_id=7 index_type_id=9 nr_elems=16
0171   [9] INT '__ARRAY_SIZE_TYPE__' size=4 bits_offset=0 nr_bits=32 encoding=(none)
0172   [10] RESTRICT '(anon)' type_id=11
0173   [11] PTR '(anon)' type_id=12
0174   [12] CONST '(anon)' type_id=13
0175   [13] FWD 'fwd_struct' fwd_kind=union
0176   [14] ENUM 'my_enum' size=4 vlen=2
0177           'VAL1' val=3
0178           'VAL2' val=7
0179   [15] PTR '(anon)' type_id=16
0180   [16] VOLATILE '(anon)' type_id=17
0181   [17] TYPEDEF 'my_struct_t' type_id=4
0182   [18] FUNC_PROTO '(anon)' ret_type_id=3 vlen=2
0183           'arg1' type_id=1
0184           'arg2' type_id=3
0185   [19] FUNC 'my_func' type_id=18
0186   [20] VAR 'struct_global_var' type_id=4, linkage=global-alloc
0187   [21] VAR 'global_var' type_id=3, linkage=global-alloc
0188   [22] VAR 'my_func.static_var' type_id=3, linkage=static
0189   [23] DATASEC 'data_sec' size=0 vlen=3
0190           type_id=20 offset=0 size=48
0191           type_id=21 offset=0 size=4
0192           type_id=22 offset=52 size=4
0193 
0194 The following commands print BTF types associated with specified map's key,
0195 value, both key and value, and all BTF types, respectively. By default, both
0196 key and value types will be printed.
0197 
0198 **# bpftool btf dump map id 123 key**
0199 
0200 ::
0201 
0202   [39] TYPEDEF 'u32' type_id=37
0203 
0204 **# bpftool btf dump map id 123 value**
0205 
0206 ::
0207 
0208   [86] PTR '(anon)' type_id=87
0209 
0210 **# bpftool btf dump map id 123 kv**
0211 
0212 ::
0213 
0214   [39] TYPEDEF 'u32' type_id=37
0215   [86] PTR '(anon)' type_id=87
0216 
0217 **# bpftool btf dump map id 123 all**
0218 
0219 ::
0220 
0221   [1] PTR '(anon)' type_id=0
0222   .
0223   .
0224   .
0225   [2866] ARRAY '(anon)' type_id=52 index_type_id=51 nr_elems=4
0226 
0227 All the standard ways to specify map or program are supported:
0228 
0229 **# bpftool btf dump map id 123**
0230 
0231 **# bpftool btf dump map pinned /sys/fs/bpf/map_name**
0232 
0233 **# bpftool btf dump prog id 456**
0234 
0235 **# bpftool btf dump prog tag b88e0a09b1d9759d**
0236 
0237 **# bpftool btf dump prog pinned /sys/fs/bpf/prog_name**
0238 
0239 |
0240 | **# bpftool btf dump file /sys/kernel/btf/i2c_smbus**
0241 | (or)
0242 | **# I2C_SMBUS_ID=$(bpftool btf show -p | jq '.[] | select(.name=="i2c_smbus").id')**
0243 | **# bpftool btf dump id ${I2C_SMBUS_ID} -B /sys/kernel/btf/vmlinux**
0244 
0245 ::
0246 
0247   [104848] STRUCT 'i2c_smbus_alert' size=40 vlen=2
0248           'alert' type_id=393 bits_offset=0
0249           'ara' type_id=56050 bits_offset=256
0250   [104849] STRUCT 'alert_data' size=12 vlen=3
0251           'addr' type_id=16 bits_offset=0
0252           'type' type_id=56053 bits_offset=32
0253           'data' type_id=7 bits_offset=64
0254   [104850] PTR '(anon)' type_id=104848
0255   [104851] PTR '(anon)' type_id=104849
0256   [104852] FUNC 'i2c_register_spd' type_id=84745 linkage=static
0257   [104853] FUNC 'smbalert_driver_init' type_id=1213 linkage=static
0258   [104854] FUNC_PROTO '(anon)' ret_type_id=18 vlen=1
0259           'ara' type_id=56050
0260   [104855] FUNC 'i2c_handle_smbus_alert' type_id=104854 linkage=static
0261   [104856] FUNC 'smbalert_remove' type_id=104854 linkage=static
0262   [104857] FUNC_PROTO '(anon)' ret_type_id=18 vlen=2
0263           'ara' type_id=56050
0264           'id' type_id=56056
0265   [104858] FUNC 'smbalert_probe' type_id=104857 linkage=static
0266   [104859] FUNC 'smbalert_work' type_id=9695 linkage=static
0267   [104860] FUNC 'smbus_alert' type_id=71367 linkage=static
0268   [104861] FUNC 'smbus_do_alert' type_id=84827 linkage=static