Re: [RFC] libbbpf/bpftool: Support 32-bit Architectures.

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

 



On 02/15, Puranjay Mohan wrote:
The BPF selftests fail to compile on 32-bit architectures as the skeleton
generated by bpftool doesn’t take into consideration the size difference of
variables on 32-bit/64-bit architectures.

As an example,
If a bpf program has a global variable of type: long, its skeleton will include a bss map that will have a field for this variable. The long variable in BPF is 64-bit. if we are working on a 32-bit machine, the generated skeleton has to
compile for that machine where long is 32-bit.

A reproducer for this issue:
         root@56ec59aa632f:~# cat test.bpf.c
         long var;

         root@56ec59aa632f:~# clang -target bpf -g -c test.bpf.c

         root@56ec59aa632f:~# bpftool btf dump file test.bpf.o format raw
         [1] INT 'long int' size=8 bits_offset=0 nr_bits=64 encoding=SIGNED
         [2] VAR 'var' type_id=1, linkage=global
         [3] DATASEC '.bss' size=0 vlen=1
                type_id=2 offset=0 size=8 (VAR 'var')

        root@56ec59aa632f:~# bpftool gen skeleton test.bpf.o > skeleton.h

        root@56ec59aa632f:~# echo "#include \"skeleton.h\"" > test.c

        root@56ec59aa632f:~# gcc test.c
        In file included from test.c:1:
        skeleton.h: In function 'test_bpf__assert':
        skeleton.h:231:2: error: static assertion failed: "unexpected
size of \'var\'"
          231 |  _Static_assert(sizeof(s->bss->var) == 8, "unexpected
size of 'var'");
                 |  ^~~~~~~~~~~~~~

One naive solution for this would be to map ‘long’ to ‘long long’ and
‘unsigned long’ to ‘unsigned long long’. But this doesn’t solve everything
because this problem is also seen with pointers that are 64-bit in BPF and
32-bit in 32-bit machines.

I want to work on solving this and am looking for ideas to solve it efficiently.
The main goal is to make libbbpf/bpftool host architecture agnostic.

Looks like bpftool needs to be aware of the target architecture. The
same way gcc is doing with build-host-target triplet. I don't
think this can be solved with a bunch of typedefs? But I've long
forgotten how a pure 32-bit machine looks, so I can't give any
useful input :-(


Thanks,
Puranjay Mohan.




[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