Arnaldo Carvalho de Melo
|
472256d3c5
|
btf_loader: Introduce a loader for the BTF format
Show 'struct list_head' from DWARF info:
$ pahole -C list_head ~/git/build/v4.20-rc5+/net/ipv4/tcp.o
struct list_head {
struct list_head * next; /* 0 8 */
struct list_head * prev; /* 8 8 */
/* size: 16, cachelines: 1, members: 2 */
/* last cacheline: 16 bytes */
};
Try to show it from BTF, on a file without it:
$ pahole -F btf -C list_head ~/git/build/v4.20-rc5+/net/ipv4/tcp.o
pahole: /home/acme/git/build/v4.20-rc5+/net/ipv4/tcp.o: No debugging information found
Encode BTF from the DWARF info:
$ pahole -J ~/git/build/v4.20-rc5+/net/ipv4/tcp.o
Check that it is there:
$ readelf -SW ~/git/build/v4.20-rc5+/net/ipv4/tcp.o | grep BTF
readelf: /home/acme/git/build/v4.20-rc5+/net/ipv4/tcp.o: Warning: possibly corrupt ELF header - it has a non-zero program header offset, but no program headers
[136] .BTF PROGBITS 0000000000000000 101d0e 042edf 00 0 0 1
Now try again printing 'struct list_head' from the BTF info just
encoded:
$ pahole -F btf -C list_head ~/git/build/v4.20-rc5+/net/ipv4/tcp.o 2> /dev/null
struct list_head {
struct list_head * next; /* 0 8 */
struct list_head * prev; /* 8 8 */
/* size: 16, cachelines: 1, members: 2 */
/* last cacheline: 16 bytes */
};
$
There is the bitfields case that BTF desn't have the bit_size info for
bitfield members that makes the output from dwarf to be different than
the one from BTF:
$ pahole -F btf -C sk_buff ~/git/build/v4.20-rc5+/net/ipv4/tcp.o > /tmp/sk_buff.btf
$ pahole -F dwarf -C sk_buff ~/git/build/v4.20-rc5+/net/ipv4/tcp.o > /tmp/sk_buff.dwarf
$ diff -u /tmp/sk_buff.dwarf /tmp/sk_buff.btf
--- /tmp/sk_buff.dwarf 2018-12-20 14:50:51.428653046 -0300
+++ /tmp/sk_buff.btf 2018-12-20 14:50:46.302601516 -0300
@@ -38,45 +38,45 @@
__u16 hdr_len; /* 138 2 */
__u16 queue_mapping; /* 140 2 */
__u8 __cloned_offset[0]; /* 142 0 */
- __u8 cloned:1; /* 142: 7 1 */
- __u8 nohdr:1; /* 142: 6 1 */
- __u8 fclone:2; /* 142: 4 1 */
- __u8 peeked:1; /* 142: 3 1 */
- __u8 head_frag:1; /* 142: 2 1 */
- __u8 xmit_more:1; /* 142: 1 1 */
- __u8 pfmemalloc:1; /* 142: 0 1 */
+ __u8 cloned; /* 142 1 */
+ __u8 nohdr; /* 142 1 */
+ __u8 fclone; /* 142 1 */
+ __u8 peeked; /* 142 1 */
+ __u8 head_frag; /* 142 1 */
+ __u8 xmit_more; /* 142 1 */
+ __u8 pfmemalloc; /* 142 1 */
/* XXX 1 byte hole, try to pack */
__u32 headers_start[0]; /* 144 0 */
__u8 __pkt_type_offset[0]; /* 144 0 */
- __u8 pkt_type:3; /* 144: 5 1 */
- __u8 ignore_df:1; /* 144: 4 1 */
- __u8 nf_trace:1; /* 144: 3 1 */
- __u8 ip_summed:2; /* 144: 1 1 */
- __u8 ooo_okay:1; /* 144: 0 1 */
- __u8 l4_hash:1; /* 145: 7 1 */
- __u8 sw_hash:1; /* 145: 6 1 */
- __u8 wifi_acked_valid:1; /* 145: 5 1 */
- __u8 wifi_acked:1; /* 145: 4 1 */
- __u8 no_fcs:1; /* 145: 3 1 */
- __u8 encapsulation:1; /* 145: 2 1 */
- __u8 encap_hdr_csum:1; /* 145: 1 1 */
- __u8 csum_valid:1; /* 145: 0 1 */
- __u8 csum_complete_sw:1; /* 146: 7 1 */
- __u8 csum_level:2; /* 146: 5 1 */
- __u8 csum_not_inet:1; /* 146: 4 1 */
- __u8 dst_pending_confirm:1; /* 146: 3 1 */
- __u8 ndisc_nodetype:2; /* 146: 1 1 */
- __u8 ipvs_property:1; /* 146: 0 1 */
- __u8 inner_protocol_type:1; /* 147: 7 1 */
- __u8 remcsum_offload:1; /* 147: 6 1 */
- __u8 offload_fwd_mark:1; /* 147: 5 1 */
- __u8 offload_mr_fwd_mark:1; /* 147: 4 1 */
- __u8 tc_skip_classify:1; /* 147: 3 1 */
- __u8 tc_at_ingress:1; /* 147: 2 1 */
- __u8 tc_redirected:1; /* 147: 1 1 */
- __u8 tc_from_ingress:1; /* 147: 0 1 */
+ __u8 pkt_type; /* 144 1 */
+ __u8 ignore_df; /* 144 1 */
+ __u8 nf_trace; /* 144 1 */
+ __u8 ip_summed; /* 144 1 */
+ __u8 ooo_okay; /* 144 1 */
+ __u8 l4_hash; /* 145 1 */
+ __u8 sw_hash; /* 145 1 */
+ __u8 wifi_acked_valid; /* 145 1 */
+ __u8 wifi_acked; /* 145 1 */
+ __u8 no_fcs; /* 145 1 */
+ __u8 encapsulation; /* 145 1 */
+ __u8 encap_hdr_csum; /* 145 1 */
+ __u8 csum_valid; /* 145 1 */
+ __u8 csum_complete_sw; /* 146 1 */
+ __u8 csum_level; /* 146 1 */
+ __u8 csum_not_inet; /* 146 1 */
+ __u8 dst_pending_confirm; /* 146 1 */
+ __u8 ndisc_nodetype; /* 146 1 */
+ __u8 ipvs_property; /* 146 1 */
+ __u8 inner_protocol_type; /* 147 1 */
+ __u8 remcsum_offload; /* 147 1 */
+ __u8 offload_fwd_mark; /* 147 1 */
+ __u8 offload_mr_fwd_mark; /* 147 1 */
+ __u8 tc_skip_classify; /* 147 1 */
+ __u8 tc_at_ingress; /* 147 1 */
+ __u8 tc_redirected; /* 147 1 */
+ __u8 tc_from_ingress; /* 147 1 */
__u16 tc_index; /* 148 2 */
/* XXX 2 bytes hole, try to pack */
$
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
2018-12-20 15:23:35 -03:00 |