Re: bpftool gen object doesn't handle GCC built BPF ELF files

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> On Fri, Jul 8, 2022 at 5:56 AM Jose E. Marchesi
> <jose.marchesi@xxxxxxxxxx> wrote:
>>
>>
>> > On Wed, Jul 6, 2022 at 11:20 AM Andrii Nakryiko
>> > <andrii.nakryiko@xxxxxxxxx> wrote:
>> >>
>> >> On Wed, Jul 6, 2022 at 10:13 AM James Hilliard
>> >> <james.hilliard1@xxxxxxxxx> wrote:
>> >> >
>> >> > Note I'm testing with the following patches:
>> >> > https://lore.kernel.org/bpf/20220706111839.1247911-1-james.hilliard1@xxxxxxxxx/
>> >> > https://lore.kernel.org/bpf/20220706140623.2917858-1-james.hilliard1@xxxxxxxxx/
>> >> >
>> >> > It would appear there's some compatibility issues with bpftool gen and
>> >> > GCC, not sure what side though is wrong here:
>> >> > /home/buildroot/buildroot/output/per-package/systemd/host/sbin/bpftool
>> >> > gen object src/core/bpf/restrict_ifaces/restrict-ifaces.bpf.o
>> >> > src/core/bpf/restrict_ifaces/restrict-ifaces.bpf.unstripped.o
>> >> > libbpf: failed to find BTF info for global/extern symbol 'sd_restrictif_i'
>> >> > Error: failed to link
>> >> > 'src/core/bpf/restrict_ifaces/restrict-ifaces.bpf.unstripped.o':
>> >> > Unknown error -2 (-2)
>> >> >
>> >> > Relevant difference seems to be this:
>> >> > GCC:
>> >> > [55] FUNC 'sd_restrictif_i' type_id=47 linkage=static
>> >> > Clang:
>> >> > [27] FUNC 'sd_restrictif_i' type_id=26 linkage=global
>> >> >
>> >>
>> >> GCC is wrong, clearly. This function is global ([0]) and libbpf
>> >> expects it to be marked as such in BTF.
>> >
>> > Does this invocation look correct?
>> > /home/buildroot/buildroot/output/per-package/systemd/host/bin/bpf-gcc
>> > -O2 -mkernel=5.2 -mcpu=v3 -mco-re -gbtf -r -std=gnu11 -D__x86_64__
>> > -mlittle-endian -I. -idirafter
>> > /home/buildroot/buildroot/output/per-package/systemd/host/x86_64-buildroot-linux-gnu/sysroot/usr/include
>> > ../src/core/bpf/restrict_fs/restrict-fs.bpf.c -o
>> > src/core/bpf/restrict_fs/restrict-fs.bpf.unstripped.o
>>
>> Hmm, why linking a relocatable ELF instead of just using a compiled
>> object (with -c)?
>
> This bpftool gen object build stage AFAIU is needed to strip the object before
> using it for skeleton generation, does that sound right?

Thing is, `gcc -r' involves the linker.  The GNU linker (ld) supports
linking BPF objects, but AFAIK the kernel BPF objects are all supposed
to be compiled objects, not linked as relocatable objects.  (The LLVM
BPF toolchain doesn't support linking BPF objects as far as I know.)

That's my understanding, but note I'm not very familiar with bpftool
(I'm trying to find time now to fix that.)

>>
>> > I've also tried without the -r(relocatable object) flag but that gives
>> > a different error:
>> > /home/buildroot/buildroot/output/per-package/systemd/host/sbin/bpftool
>> > gen object src/core/bpf/restrict_ifaces/restrict-ifaces.bpf.o
>> > src/core/bpf/restrict_ifaces/restrict-ifaces.bpf.unstripped.o
>> > libbpf: unsupported kind of ELF file
>> > src/core/bpf/restrict_ifaces/restrict-ifaces.bpf.unstripped.o: no
>> > error
>> > Error: failed to link
>> > 'src/core/bpf/restrict_ifaces/restrict-ifaces.bpf.unstripped.o':
>> > Unknown error -95 (-95)
>> >
>> > GCC without relocatable flag:
>> > [1] INT 'signed char' size=1 bits_offset=0 nr_bits=8 encoding=UNKN
>> > [2] INT 'unsigned char' size=1 bits_offset=0 nr_bits=8 encoding=CHAR
>> > [3] TYPEDEF '__u8' type_id=2
>> > [4] CONST '(anon)' type_id=3
>> > [5] VOLATILE '(anon)' type_id=4
>> > [6] INT 'short int' size=2 bits_offset=0 nr_bits=16 encoding=SIGNED
>> > [7] INT 'short unsigned int' size=2 bits_offset=0 nr_bits=16 encoding=(none)
>> > [8] TYPEDEF '__u16' type_id=7
>> > [9] INT 'int' size=4 bits_offset=0 nr_bits=32 encoding=SIGNED
>> > [10] TYPEDEF '__s32' type_id=9
>> > [11] INT 'unsigned int' size=4 bits_offset=0 nr_bits=32 encoding=(none)
>> > [12] TYPEDEF '__u32' type_id=11
>> > [13] INT 'long long int' size=8 bits_offset=0 nr_bits=64 encoding=SIGNED
>> > [14] INT 'long long unsigned int' size=8 bits_offset=0 nr_bits=64
>> > encoding=(none)
>> > [15] TYPEDEF '__u64' type_id=14
>> > [16] INT 'long unsigned int' size=8 bits_offset=0 nr_bits=64 encoding=(none)
>> > [17] INT 'long int' size=8 bits_offset=0 nr_bits=64 encoding=SIGNED
>> > [18] INT 'char' size=1 bits_offset=0 nr_bits=8 encoding=UNKN
>> > [19] CONST '(anon)' type_id=18
>> > [20] TYPEDEF '__be16' type_id=8
>> > [21] TYPEDEF '__be32' type_id=12
>> > [22] ENUM 'bpf_map_type' encoding=UNSIGNED size=4 vlen=31
>> >     'BPF_MAP_TYPE_UNSPEC' val=0
>> >     'BPF_MAP_TYPE_HASH' val=1
>> >     'BPF_MAP_TYPE_ARRAY' val=2
>> >     'BPF_MAP_TYPE_PROG_ARRAY' val=3
>> >     'BPF_MAP_TYPE_PERF_EVENT_ARRAY' val=4
>> >     'BPF_MAP_TYPE_PERCPU_HASH' val=5
>> >     'BPF_MAP_TYPE_PERCPU_ARRAY' val=6
>> >     'BPF_MAP_TYPE_STACK_TRACE' val=7
>> >     'BPF_MAP_TYPE_CGROUP_ARRAY' val=8
>> >     'BPF_MAP_TYPE_LRU_HASH' val=9
>> >     'BPF_MAP_TYPE_LRU_PERCPU_HASH' val=10
>> >     'BPF_MAP_TYPE_LPM_TRIE' val=11
>> >     'BPF_MAP_TYPE_ARRAY_OF_MAPS' val=12
>> >     'BPF_MAP_TYPE_HASH_OF_MAPS' val=13
>> >     'BPF_MAP_TYPE_DEVMAP' val=14
>> >     'BPF_MAP_TYPE_SOCKMAP' val=15
>> >     'BPF_MAP_TYPE_CPUMAP' val=16
>> >     'BPF_MAP_TYPE_XSKMAP' val=17
>> >     'BPF_MAP_TYPE_SOCKHASH' val=18
>> >     'BPF_MAP_TYPE_CGROUP_STORAGE' val=19
>> >     'BPF_MAP_TYPE_REUSEPORT_SOCKARRAY' val=20
>> >     'BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE' val=21
>> >     'BPF_MAP_TYPE_QUEUE' val=22
>> >     'BPF_MAP_TYPE_STACK' val=23
>> >     'BPF_MAP_TYPE_SK_STORAGE' val=24
>> >     'BPF_MAP_TYPE_DEVMAP_HASH' val=25
>> >     'BPF_MAP_TYPE_STRUCT_OPS' val=26
>> >     'BPF_MAP_TYPE_RINGBUF' val=27
>> >     'BPF_MAP_TYPE_INODE_STORAGE' val=28
>> >     'BPF_MAP_TYPE_TASK_STORAGE' val=29
>> >     'BPF_MAP_TYPE_BLOOM_FILTER' val=30
>> > [23] UNION '(anon)' size=8 vlen=1
>> >     'flow_keys' type_id=29 bits_offset=0
>> > [24] STRUCT 'bpf_flow_keys' size=56 vlen=13
>> >     'nhoff' type_id=8 bits_offset=0
>> >     'thoff' type_id=8 bits_offset=16
>> >     'addr_proto' type_id=8 bits_offset=32
>> >     'is_frag' type_id=3 bits_offset=48
>> >     'is_first_frag' type_id=3 bits_offset=56
>> >     'is_encap' type_id=3 bits_offset=64
>> >     'ip_proto' type_id=3 bits_offset=72
>> >     'n_proto' type_id=20 bits_offset=80
>> >     'sport' type_id=20 bits_offset=96
>> >     'dport' type_id=20 bits_offset=112
>> >     '(anon)' type_id=25 bits_offset=128
>> >     'flags' type_id=12 bits_offset=384
>> >     'flow_label' type_id=21 bits_offset=416
>> > [25] UNION '(anon)' size=32 vlen=2
>> >     '(anon)' type_id=26 bits_offset=0
>> >     '(anon)' type_id=27 bits_offset=0
>> > [26] STRUCT '(anon)' size=8 vlen=2
>> >     'ipv4_src' type_id=21 bits_offset=0
>> >     'ipv4_dst' type_id=21 bits_offset=32
>> > [27] STRUCT '(anon)' size=32 vlen=2
>> >     'ipv6_src' type_id=28 bits_offset=0
>> >     'ipv6_dst' type_id=28 bits_offset=128
>> > [28] ARRAY '(anon)' type_id=12 index_type_id=16 nr_elems=4
>> > [29] PTR '(anon)' type_id=24
>> > [30] UNION '(anon)' size=8 vlen=1
>> >     'sk' type_id=32 bits_offset=0
>> > [31] STRUCT 'bpf_sock' size=80 vlen=14
>> >     'bound_dev_if' type_id=12 bits_offset=0
>> >     'family' type_id=12 bits_offset=32
>> >     'type' type_id=12 bits_offset=64
>> >     'protocol' type_id=12 bits_offset=96
>> >     'mark' type_id=12 bits_offset=128
>> >     'priority' type_id=12 bits_offset=160
>> >     'src_ip4' type_id=12 bits_offset=192
>> >     'src_ip6' type_id=28 bits_offset=224
>> >     'src_port' type_id=12 bits_offset=352
>> >     'dst_port' type_id=20 bits_offset=384
>> >     'dst_ip4' type_id=12 bits_offset=416
>> >     'dst_ip6' type_id=28 bits_offset=448
>> >     'state' type_id=12 bits_offset=576
>> >     'rx_queue_mapping' type_id=10 bits_offset=608
>> > [32] PTR '(anon)' type_id=31
>> > [33] STRUCT '__sk_buff' size=192 vlen=33
>> >     'len' type_id=12 bits_offset=0
>> >     'pkt_type' type_id=12 bits_offset=32
>> >     'mark' type_id=12 bits_offset=64
>> >     'queue_mapping' type_id=12 bits_offset=96
>> >     'protocol' type_id=12 bits_offset=128
>> >     'vlan_present' type_id=12 bits_offset=160
>> >     'vlan_tci' type_id=12 bits_offset=192
>> >     'vlan_proto' type_id=12 bits_offset=224
>> >     'priority' type_id=12 bits_offset=256
>> >     'ingress_ifindex' type_id=12 bits_offset=288
>> >     'ifindex' type_id=12 bits_offset=320
>> >     'tc_index' type_id=12 bits_offset=352
>> >     'cb' type_id=34 bits_offset=384
>> >     'hash' type_id=12 bits_offset=544
>> >     'tc_classid' type_id=12 bits_offset=576
>> >     'data' type_id=12 bits_offset=608
>> >     'data_end' type_id=12 bits_offset=640
>> >     'napi_id' type_id=12 bits_offset=672
>> >     'family' type_id=12 bits_offset=704
>> >     'remote_ip4' type_id=12 bits_offset=736
>> >     'local_ip4' type_id=12 bits_offset=768
>> >     'remote_ip6' type_id=28 bits_offset=800
>> >     'local_ip6' type_id=28 bits_offset=928
>> >     'remote_port' type_id=12 bits_offset=1056
>> >     'local_port' type_id=12 bits_offset=1088
>> >     'data_meta' type_id=12 bits_offset=1120
>> >     '(anon)' type_id=23 bits_offset=1152
>> >     'tstamp' type_id=15 bits_offset=1216
>> >     'wire_len' type_id=12 bits_offset=1280
>> >     'gso_segs' type_id=12 bits_offset=1312
>> >     '(anon)' type_id=30 bits_offset=1344
>> >     'gso_size' type_id=12 bits_offset=1408
>> >     'hwtstamp' type_id=15 bits_offset=1472
>> > [34] ARRAY '(anon)' type_id=12 index_type_id=16 nr_elems=5
>> > [35] CONST '(anon)' type_id=33
>> > [36] PTR '(anon)' type_id=0
>> > [37] STRUCT '(anon)' size=24 vlen=3
>> >     'type' type_id=39 bits_offset=0
>> >     'key' type_id=40 bits_offset=64
>> >     'value' type_id=41 bits_offset=128
>> > [38] ARRAY '(anon)' type_id=9 index_type_id=16 nr_elems=1
>> > [39] PTR '(anon)' type_id=38
>> > [40] PTR '(anon)' type_id=12
>> > [41] PTR '(anon)' type_id=3
>> > [42] ARRAY '(anon)' type_id=19 index_type_id=16 nr_elems=18
>> > [43] CONST '(anon)' type_id=42
>> > [44] FUNC_PROTO '(anon)' ret_type_id=36 vlen=2
>> >     '(anon)' type_id=36
>> >     '(anon)' type_id=46
>> > [45] CONST '(anon)' type_id=0
>> > [46] PTR '(anon)' type_id=45
>> > [47] FUNC_PROTO '(anon)' ret_type_id=9 vlen=1
>> >     'sk' type_id=48
>> > [48] PTR '(anon)' type_id=35
>> > [49] FUNC_PROTO '(anon)' ret_type_id=9 vlen=1
>> >     'sk' type_id=48
>> > [50] FUNC_PROTO '(anon)' ret_type_id=9 vlen=1
>> >     'sk' type_id=48
>> > [51] VAR 'is_allow_list' type_id=5, linkage=global
>> > [52] VAR '_license' type_id=43, linkage=static
>> > [53] VAR 'sd_restrictif' type_id=37, linkage=global
>> > [54] FUNC 'bpf_map_lookup_elem' type_id=44 linkage=static
>> > [55] FUNC 'sd_restrictif_i' type_id=47 linkage=static
>> > [56] FUNC 'sd_restrictif_e' type_id=49 linkage=static
>> > [57] FUNC 'restrict_network_interfaces_impl' type_id=50 linkage=static
>> > [58] DATASEC 'license' size=0 vlen=1
>> >     type_id=52 offset=0 size=18 (VAR '_license')
>> > [59] DATASEC '.maps' size=0 vlen=1
>> >     type_id=53 offset=0 size=24 (VAR 'sd_restrictif')
>> > [60] DATASEC '.data' size=0 vlen=1
>> >     type_id=51 offset=0 size=1 (VAR 'is_allow_list')
>> >
>> >>
>> >> https://github.com/systemd/systemd/blob/main/src/core/bpf/restrict_ifaces/restrict-ifaces.bpf.c#L42-L50
>> >>
>> >>
>> >> > GCC:
>> >> >
>> >> > [1] INT 'signed char' size=1 bits_offset=0 nr_bits=8 encoding=UNKN
>> >> > [2] INT 'unsigned char' size=1 bits_offset=0 nr_bits=8 encoding=CHAR
>> >> > [3] TYPEDEF '__u8' type_id=2
>> >> > [4] CONST '(anon)' type_id=3
>> >>
>> >> [...]



[Index of Archives]     [Linux Samsung SoC]     [Linux Rockchip SoC]     [Linux Actions SoC]     [Linux for Synopsys ARC Processors]     [Linux NFS]     [Linux NILFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]


  Powered by Linux