269 lines
8.3 KiB
ReStructuredText
269 lines
8.3 KiB
ReStructuredText
|
.. SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||
|
|
||
|
================
|
||
|
bpftool-btf
|
||
|
================
|
||
|
-------------------------------------------------------------------------------
|
||
|
tool for inspection of BTF data
|
||
|
-------------------------------------------------------------------------------
|
||
|
|
||
|
:Manual section: 8
|
||
|
|
||
|
.. include:: substitutions.rst
|
||
|
|
||
|
SYNOPSIS
|
||
|
========
|
||
|
|
||
|
**bpftool** [*OPTIONS*] **btf** *COMMAND*
|
||
|
|
||
|
*OPTIONS* := { |COMMON_OPTIONS| | { **-B** | **--base-btf** } }
|
||
|
|
||
|
*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
|
||
|
|
||
|
-B, --base-btf *FILE*
|
||
|
Pass a base BTF object. Base BTF objects are typically used
|
||
|
with BTF objects for kernel modules. To avoid duplicating
|
||
|
all kernel symbols required by modules, BTF objects for
|
||
|
modules are "split", they are built incrementally on top of
|
||
|
the kernel (vmlinux) BTF object. So the base BTF reference
|
||
|
should usually point to the kernel BTF.
|
||
|
|
||
|
When the main BTF object to process (for example, the
|
||
|
module BTF to dump) is passed as a *FILE*, bpftool attempts
|
||
|
to autodetect the path for the base object, and passing
|
||
|
this option is optional. When the main BTF object is passed
|
||
|
through other handles, this option becomes necessary.
|
||
|
|
||
|
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**
|
||
|
|
||
|
|
|
||
|
| **# bpftool btf dump file /sys/kernel/btf/i2c_smbus**
|
||
|
| (or)
|
||
|
| **# I2C_SMBUS_ID=$(bpftool btf show -p | jq '.[] | select(.name=="i2c_smbus").id')**
|
||
|
| **# bpftool btf dump id ${I2C_SMBUS_ID} -B /sys/kernel/btf/vmlinux**
|
||
|
|
||
|
::
|
||
|
|
||
|
[104848] STRUCT 'i2c_smbus_alert' size=40 vlen=2
|
||
|
'alert' type_id=393 bits_offset=0
|
||
|
'ara' type_id=56050 bits_offset=256
|
||
|
[104849] STRUCT 'alert_data' size=12 vlen=3
|
||
|
'addr' type_id=16 bits_offset=0
|
||
|
'type' type_id=56053 bits_offset=32
|
||
|
'data' type_id=7 bits_offset=64
|
||
|
[104850] PTR '(anon)' type_id=104848
|
||
|
[104851] PTR '(anon)' type_id=104849
|
||
|
[104852] FUNC 'i2c_register_spd' type_id=84745 linkage=static
|
||
|
[104853] FUNC 'smbalert_driver_init' type_id=1213 linkage=static
|
||
|
[104854] FUNC_PROTO '(anon)' ret_type_id=18 vlen=1
|
||
|
'ara' type_id=56050
|
||
|
[104855] FUNC 'i2c_handle_smbus_alert' type_id=104854 linkage=static
|
||
|
[104856] FUNC 'smbalert_remove' type_id=104854 linkage=static
|
||
|
[104857] FUNC_PROTO '(anon)' ret_type_id=18 vlen=2
|
||
|
'ara' type_id=56050
|
||
|
'id' type_id=56056
|
||
|
[104858] FUNC 'smbalert_probe' type_id=104857 linkage=static
|
||
|
[104859] FUNC 'smbalert_work' type_id=9695 linkage=static
|
||
|
[104860] FUNC 'smbus_alert' type_id=71367 linkage=static
|
||
|
[104861] FUNC 'smbus_do_alert' type_id=84827 linkage=static
|